FPGA中的嵌入式RAM分為兩種:專用的BRAM和分布是RAM(用LUT實現的)。這兩種RAM又可以配置成單端口和雙端口的RAM和ROM。雙端口RAM又可以根據讀寫地址是否在同一塊分為Double Port 和Two Port。讀取方式也有多種方式,包括:Read first, Write first, No change 等。
Block RAM和分布式RAM
在FPGA實現RAM時,可在專用Block RAM和分布式RAM中實現。這兩者的選擇不僅會影響資源選擇,同時還會嚴重地影響性能和功耗。哪如何選用BRAM和分布式RAM呢?一般而言,容量需求大時采用BRAM,對讀寫性能有要求時,用分布式RAM。一般來說RAM要求的深度是首要標准。RAM的深度比較小時,在LUTRAM中實現,深度超過256位的存儲器陣列時用BlockRAM實現。Xilinx和Altera 的FPGA器件能夠靈活地以多種寬度深度組合實現各種類型的RAM。
嵌入式RAM的使用方式有三種:原語,FPGA廠商提供的例化工具以及綜合工具根據RTL代碼推譯出RAM。下面是一個簡單的單端口RAM,在綜合時會被綜合工具推譯出BRAM。
1 module bram_inference( 2 input clk, 3 input [15:0] mem_din, 4 input [9:0] mem_addr, 5 input mem_we, 6 output reg [15:0] mem_dout ); 7 8 reg [15:0] ram [0:1023]; 9 10 always (posedge clk) 11 begin 12 if(mem_we) 13 ram[mem_addr] <= mem_din; 14 mem_dout <= ram[mem_addr]; 15 end 16 17 endmodule
嵌入式RAM的初始化
XILINX 的RAM初始文件格式是coe,在Vivado中例化RAM時會將coe 文件轉換成*.mif 文件,mif 文件的文件名和RAM的名字一樣。但XILINX的mif 文件和ALTERA RAM的mif 文件格式不同。
小結
當今FPGA中所使用的嵌入式存儲器具有寬存儲器帶寬特性,以及通用性,能夠實現各種存儲器功能,包括:隨機訪問存儲器(RAM),ROM,CAM,FIFO(FIFO是由FIFO控制器邏輯和真雙端口RAM實現的),真雙端口存儲器,移位寄存器,異步工作模式,同步工作模式。還可以選擇輸出是否寄存一拍。各家FPGA廠商的RAM具體實現有所不同但功能都一樣,對RAM的控制信號做簡單的修改就能操作不同廠家的嵌入式RAM了。
問題:
1 Altera的FPGA有沒有真雙端口RAM的原語?如果沒有,是否可以由單端口RAM組成真雙端口RAM?
2 在Vivado中,如何用腳本語言生成RAM IP?
3 如何不從新綜合布局布線更新RAM中初始化數據 ?
參考文獻:
[1] 阿昏豆. FPGA研發之道(13)-設計不是湊波形(三)RAM. http://www.eetop.cn/blog/html/60/1494260-52826.html. 2015,12,24.
[2] Xilinx. UG949 vivado設計套件的UltraFAST設計方法指南. 2014,04,02.