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.