本文主要介紹FPGA中常用的RAM、ROM、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(Static RAM)是一種常用的隨機訪問存儲器(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提供了多種內部和外部的存儲器解決方案,根據需要可以靈活使用,構建存儲器系統。合理利用各類存儲器的優缺點,可以在成本、容量和速度上取得最佳平衡。
評論
查看更多