本文主要介紹FPGA中常用的RAM、ROM、CAM、SRAM、DRAM、FLASH等資源,包括特性、工作原理、應用場景等。
一、RAM
RAM(Random Access Memory)是FPGA中最基本和常用的內(nèi)部存儲塊,根據(jù)不同架構(gòu)可以實現(xiàn)不同容量,最大可達幾十Mb。
FPGA中的RAM主要包括:
- 分布式RAM:存在于邏輯塊(LE)中的小容量RAM,通常為幾百比特到幾千比特。
- 塊RAM:FPGA中專門用于實現(xiàn)RAM功能的大容量存儲塊,每個塊RAM容量從幾kb到幾十kb不等。
- UltraRAM:某些高端FPGA特有的大容量RAM塊,比塊RAM具有更高的密度和帶寬。
1、分布式RAM(Distributed RAM)
分布式RAM利用查找表(LUT)的功能實現(xiàn),不需要占用額外Flip-Flop,但會占用可用于邏輯實現(xiàn)的LUT資源。
每個LUT可以實現(xiàn)一個小容量的RAM,例如6輸入LUT實現(xiàn)64位RAM。
注意分布式RAM只能實現(xiàn)同步讀寫操作。
2、塊RAM(Block RAM)
每個塊RAM通常有單端口、雙端口和四端口版本。
支持同步讀寫操作,可以通過多端口實現(xiàn)FIFO等功能。
例如Xilinx UltraScale FPGA中一個塊RAM容量為36kb,位寬可配置,延時很小,頻率可以達到550MHz。
3、UltraRAM
UltraRAM集成在部分高端FPGA中,每個UltraRAM可以達到數(shù)十Mb的容量,具有比塊RAM更高的密度和帶寬。
UltraRAM可以與塊RAM一起使用,實現(xiàn)更大容量的存儲解決方案。
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)是只讀存儲器,用于存放不需修改的數(shù)據(jù)。
FPGA中的ROM主要有:
- 分布式ROM:使用LUT實現(xiàn),容量很小。
- 塊ROM:使用塊RAM實現(xiàn),容量較大。
ROM在配置時寫入數(shù)據(jù)之后數(shù)據(jù)不能修改。ROM主要用于存放程序代碼等不變數(shù)據(jù)。
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)是一種特殊類型的內(nèi)存結(jié)構(gòu),也稱為內(nèi)容可尋址存儲器,可以通過內(nèi)容查找數(shù)據(jù)所在位置。
CAM主要應用:
- 網(wǎng)絡查找:根據(jù)目的地址查找路由端口。
- 緩存查詢:根據(jù)TAG查詢緩存中是否存在數(shù)據(jù)。
CAM的工作原理:
基于硬件電路的快速匹配,當輸入一串數(shù)據(jù)時,CAM會同時比較這串數(shù)據(jù)與內(nèi)部存儲的所有數(shù)據(jù)項。如果找到完全匹配的數(shù)據(jù)項,CAM就會輸出該數(shù)據(jù)項的地址。
CAM的優(yōu)點:高速查找、精確匹配、并行處理。
CAM的缺點:容量受限、功耗較高、價格昂貴。
四、SRAM
SRAM(Static RAM)是一種常用的隨機訪問存儲器(RAM)類型,它以靜態(tài)方式存儲數(shù)據(jù),不需要定期刷新。也稱為靜態(tài)隨機存儲器。
SRAM在速度和功率消耗方面表現(xiàn)優(yōu)異,但是容量較小,成本較高。
SRAM通常用于存儲CPU或FPGA內(nèi)部的寄存器、緩存或臨時變量等。
SRAM主要由存儲單元陣列、地址解碼器和讀寫控制電路等組成。每個存儲單元都包含一個雙口RAM,可以獨立地進行讀/寫操作。每個RAM有兩位,即一個存儲單元可以存儲一個比特(bit)的數(shù)據(jù)。
SRAM還可以實現(xiàn)預讀取功能,即在讀取數(shù)據(jù)的同時,預讀下一個數(shù)據(jù),從而提高訪問速度。此外,SRAM還可以實現(xiàn)雙端口訪問,即同時對兩個不同的存儲單元進行讀寫操作。
Verilog 代碼示例
sram_controller sram_inst (
.clk (clk),
.addr (addr),
.dout (dout),
.din (din),
.we (we),
.ce (ce),
.oe (oe)
);
五、 DRAM
全稱動態(tài)隨機存取存儲器(Dynamic Random Access Memory),是一種用于存儲和訪問大規(guī)模數(shù)據(jù)的主要存儲器技術(shù)。
DRAM以其高密度、容量大和低功耗等特點,以Gigabit(Gb)為單位提供大容量存儲,在FPGA中得到廣泛的應用,比如常見的DDR3、DDR4等等。
FPGA的DRAM可以使用不同的接口標準,如DDR3、DDR4、LPDDR、HBM等。這些接口標準定義了DRAM與其他系統(tǒng)組件(如處理器、其他存儲器、外設等)之間的通信協(xié)議和物理連接。
相比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是一種非易失存儲器,斷電后保持數(shù)據(jù),容量小,但成本低廉。
FPGA中的FLASH主要用于:
- 存儲配置文件:許多FPGA使用FLASH來保存配置文件。
- 程序存儲:用于存儲代碼和數(shù)據(jù)。
FLASH存儲器以塊為單位進行擦除和寫入操作。擦除操作需要將整個塊中的數(shù)據(jù)清除,而寫入操作只需修改需要更新的部分數(shù)據(jù)。
寫入操作通常采用位編程(bit programming)的方式進行。在位編程中,根據(jù)需要將存儲單元的電荷狀態(tài)改變,以表示0或1的值。
與其他存儲器類型相比,F(xiàn)LASH存儲器的讀取延遲較高,而擦除和寫入操作的速度也相對較慢。此外,F(xiàn)LASH存儲器的擦寫次數(shù)有限,通常在百萬到數(shù)十億之間。
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)
);
七、總結(jié)
FPGA提供了多種內(nèi)部和外部的存儲器解決方案,根據(jù)需要可以靈活使用,構(gòu)建存儲器系統(tǒng)。合理利用各類存儲器的優(yōu)缺點,可以在成本、容量和速度上取得最佳平衡。
評論
查看更多