FPGA基礎學習(8) --內部結構之存儲單元



上一篇中提到了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在任何場合都具有優勢。兩者的使用總結如下:

  1. BRAM一定需要時鍾;DRAM可以是純組合邏輯,即給地址馬上出數據(當然上篇說了,為了提高性能,在讀出的時候加上觸發器更好);
  2. 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技術不會對其進行初始化,從而可以有效降低功耗。

參考文獻:

  1. 《Block Memory Generator v8.4》(PG058)
  2. 《VIVADO從此開始》——高亞軍著


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM