FPGA中常用的存儲器資源

2023-08-15 17:13:39 來源:FPGA入門到精通

本文主要介紹FPGA中常用的RAMROM、CAM、SRAM、DRAM、FLASH等資源,包括特性、工作原理、應用場景等。

一、RAM

RAM(Random Access Memory)是FPGA中最基本和常用的內部存儲塊,根據不同架構可以實現不同容量,最大可達幾十Mb。


(資料圖片僅供參考)

FPGA中的RAM主要包括:

分布式RAM:存在于邏輯塊(LE)中的小容量RAM,通常為幾百比特到幾千比特。塊RAM:FPGA中專門用于實現RAM功能的大容量存儲塊,每個塊RAM容量從幾kb到幾十kb不等。UltraRAM:某些高端FPGA特有的大容量RAM塊,比塊RAM具有更高的密度和帶寬。

1、分布式RAM(Distributed RAM)

分布式RAM利用查找表(LUT)的功能實現,不需要占用額外Flip-Flop,但會占用可用于邏輯實現的LUT資源。

每個LUT可以實現一個小容量的RAM,例如6輸入LUT實現64位RAM。

注意分布式RAM只能實現同步讀寫操作。

2、塊RAM(Block RAM)

每個塊RAM通常有單端口、雙端口和四端口版本。

支持同步讀寫操作,可以通過多端口實現FIFO等功能。

例如Xilinx UltraScale FPGA中一個塊RAM容量為36kb,位寬可配置,延時很小,頻率可以達到550MHz。

3、UltraRAM

UltraRAM集成在部分高端FPGA中,每個UltraRAM可以達到數十Mb的容量,具有比塊RAM更高的密度和帶寬。

UltraRAM可以與塊RAM一起使用,實現更大容量的存儲解決方案。

Verilog代碼示例

(* ram_style = "distributed" *) reg [7:0] dist_ram[0:63]; // 64 x 8 的分布式RAM  (* ram_style = "block" *) reg [31:0] block_ram[0:1023]; // 1K x 32 的塊RAM  (* ram_style = "ultra" *) reg [7:0] ultra_ram[0:262143]; // 256K x 8 的UltraRAM

二、 ROM

ROM(Read-Only Memory)是只讀存儲器,用于存放不需修改的數據。

FPGA中的ROM主要有:

分布式ROM:使用LUT實現,容量很小。塊ROM:使用塊RAM實現,容量較大。

ROM在配置時寫入數據之后數據不能修改。ROM主要用于存放程序代碼等不變數據。

Verilog 代碼示例

(* rom_style = "distributed" *) reg [7:0] dist_rom[0:31]; // 32 x 8 分布式ROM  (* rom_style = "block" *) reg [31:0] block_rom[0:2047]; // 2K x 32 塊ROM

三、CAM

CAM(Content-Addressable Memory)是一種特殊類型的內存結構,也稱為內容可尋址存儲器,可以通過內容查找數據所在位置。

CAM主要應用:

網絡查找:根據目的地址查找路由端口。緩存查詢:根據TAG查詢緩存中是否存在數據。

CAM的工作原理:

基于硬件電路的快速匹配,當輸入一串數據時,CAM會同時比較這串數據與內部存儲的所有數據項。如果找到完全匹配的數據項,CAM就會輸出該數據項的地址。

CAM的優點:高速查找、精確匹配、并行處理。

CAM的缺點:容量受限、功耗較高、價格昂貴。

四、SRAM

SRAM(StaticRAM)是一種常用的隨機訪問存儲器(RAM)類型,它以靜態方式存儲數據,不需要定期刷新。也稱為靜態隨機存儲器。

SRAM在速度和功率消耗方面表現優異,但是容量較小,成本較高。

SRAM通常用于存儲CPU或FPGA內部的寄存器、緩存或臨時變量等。

SRAM主要由存儲單元陣列、地址解碼器和讀寫控制電路等組成。每個存儲單元都包含一個雙口RAM,可以獨立地進行讀/寫操作。每個RAM有兩位,即一個存儲單元可以存儲一個比特(bit)的數據。

SRAM還可以實現預讀取功能,即在讀取數據的同時,預讀下一個數據,從而提高訪問速度。此外,SRAM還可以實現雙端口訪問,即同時對兩個不同的存儲單元進行讀寫操作。

Verilog 代碼示例

sram_controller sram_inst (  .clk    (clk),  .addr   (addr),  .dout   (dout),  .din    (din),  .we     (we),  .ce     (ce),  .oe     (oe));

五、 DRAM

全稱動態隨機存取存儲器(Dynamic Random Access Memory),是一種用于存儲和訪問大規模數據的主要存儲器技術。

DRAM以其高密度、容量大和低功耗等特點,以Gigabit(Gb)為單位提供大容量存儲,在FPGA中得到廣泛的應用,比如常見的DDR3、DDR4等等。

FPGA的DRAM可以使用不同的接口標準,如DDR3、DDR4、LPDDR、HBM等。這些接口標準定義了DRAM與其他系統組件(如處理器、其他存儲器、外設等)之間的通信協議和物理連接。

相比SRAM,DRAM擁有更大的容量,順序讀寫速度快,隨機讀寫速度慢。

Verilog 代碼示例

ddr3_controller ddr3_inst(  .clk        (clk),  .reset_n    (reset_n),  .s_axi_awid    (s_axi_awid),  .s_axi_awaddr  (s_axi_awaddr),  .s_axi_awlen   (s_axi_awlen),  .s_axi_awsize  (s_axi_awsize),  .s_axi_awburst (s_axi_awburst),  .s_axi_awlock  (s_axi_awlock),  .s_axi_awcache (s_axi_awcache),  .s_axi_awprot  (s_axi_awprot),  .s_axi_awvalid (s_axi_awvalid),  .s_axi_awready (s_axi_awready),  // Write data channel  .s_axi_wdata  (s_axi_wdata),    .s_axi_wstrb  (s_axi_wstrb),  .s_axi_wlast  (s_axi_wlast),  .s_axi_wvalid (s_axi_wvalid),  .s_axi_wready (s_axi_wready));

六、FLASH

FLASH是一種非易失存儲器,斷電后保持數據,容量小,但成本低廉。

FPGA中的FLASH主要用于:

存儲配置文件:許多FPGA使用FLASH來保存配置文件。程序存儲:用于存儲代碼和數據。

FLASH存儲器以塊為單位進行擦除和寫入操作。擦除操作需要將整個塊中的數據清除,而寫入操作只需修改需要更新的部分數據。

寫入操作通常采用位編程(bit programming)的方式進行。在位編程中,根據需要將存儲單元的電荷狀態改變,以表示0或1的值。

與其他存儲器類型相比,FLASH存儲器的讀取延遲較高,而擦除和寫入操作的速度也相對較慢。此外,FLASH存儲器的擦寫次數有限,通常在百萬到數十億之間。

Verilog 代碼示例

flash_controller flash_inst(  .clk(clk),  .flash_cs(flash_cs),  .flash_clk(flash_clk),   .flash_io(flash_io),  .addr(addr),  .dout(dout),  .din(din),  .oe(oe),  .we(we) );

七、總結

FPGA提供了多種內部和外部的存儲器解決方案,根據需要可以靈活使用,構建存儲器系統。合理利用各類存儲器的優缺點,可以在成本、容量和速度上取得最佳平衡。

標簽:

上一篇:FPGA設計中BRAM的知識科普
下一篇:最后一頁