Xilinx A7 晶片內部結構分析(2)—— 儲存單元
上一篇中提到了SLICEL和SLICEM都可用作ROM,後者還可以作為分散式RAM(Distribute RAM,DRAM)。本篇主要總結的是塊狀Memory(Block Memory),實際上就是FPGA內部獨立於邏輯單元的專用儲存器,更像是一種硬核。
1. 基本結構
如下圖所示,一個Block Memory的大小為36KB(RAMB36E1),由 兩個獨立的18KB BRAM(Block RAM,RAMB18E1) 組成。因此一個36K的Block Memory可配置成4中情形:
- 全部用於配置成36KB的BRAM;
- 全部用於配置成36KB的FIFO;
- 配置成18KB的BRAM和18KB的BRAM;
- 配置成18KB的BRAM和18KB的FIFO;
為什麼不能配置成兩個18KB的FIFO呢?因為一個Block Momery中間有一個叫FIFO Logic的結構,它用於生成FIFO控制訊號,包括讀/寫地址等,由於它只有1個且不能共享,所以 最多隻能配置一個FIFO 。
2. BRAM與DRAM的比較
簡單的來說,BRAM就是一塊固定儲存功能的硬核,而DRAM是由一堆SLICE拼接成,實現儲存功能的單元。
儘管BRAM可支援更多功能,但並不表明BRAM在任何場合都具有優勢。兩者的使用總結如下:
- BRAM一定需要時鐘;DRAM可以是純組合邏輯,即給地址馬上出資料(當然上篇說了,為了提高效能,在讀出的時候加上觸發器更好);
- BRAM有著較大的儲存空間;而DRAM實現大的儲存空間會消耗很多LUT資源;
較大的儲存應用,建議用BRAM;零星的小RAM,一般就用DRAM。但這只是個一般原則,具體的使用得看整個設計中資源的冗餘度和效能要求。
3. BRAM的特點
當Block Memory配置成RAM時,有三種工作模式:
- 讀優先
- 寫優先
- 保持模式
三種模式體現了當對RAM中同一地址同時進行讀操作和寫操作時的不同。簡單的說,當同時對RAM中的同一地址進行讀寫時,讀優先模式將讀出該地址內原有的資料,寫優先模式將讀出當前寫入該地址的資料(注意斷句,意思是最終會讀出的資料是先寫入的資料),保持模式則保持之前讀出的資料不變。
4. Block Memory的使用
4.1 配置為RAM或ROM
在Vivado的“IP catalog”中搜索“RAM”,會出現如下結果,可以看到想要生成RAM或ROM,可以選擇Distributed Memory或Block Memory,即上面提到的分散式和塊狀儲存單元。
選擇“Block Memory Generator”,可以看到塊儲存單元可以用作RAM或ROM,具體配置就不詳細展開了。
值得一提的是,在“Port A Options”選項卡中,有個Output Registers欄,可以選擇Primitive Output Register和Core Output Register。其中前者位於BRAM內部,後者為CLB中的觸發器。值得注意的是,在這裡這兩個觸發器只支援同步 高有效復位 。這兩個觸發器可大大降低時鐘到輸出的延遲,在高速設計中, 這兩個觸發器都使用,使用之後讀操作的latency會增大為3個時鐘週期 。
4.2. 配置為FIFO
Block Memory中的BRAM還可配置為FIFO(同步或非同步),同時提供專用的FIFO Logic用於生成FIFO的控制訊號和狀態訊號。使用專用的FIFO Logic的FIFO稱為build-in FIFO。Vivado提供了IP:FIFO Generator,即可以將BRAM配置為build-in FIFO,也可以採用CLB資源生成FIFO控制邏輯,並結合BRAM構成FIFO。
對於7系列FPGA內部未使用的18KB BRAM,Vivado通過Power Gating技術不會對其進行初始化,從而可以有效降低功耗。
參考文獻:
- 《Block Memory Generator v8.4》(PG058)
- 《VIVADO從此開始》——高亞軍著