冯诺依曼提出的存储计算,计算存储,因此,几乎所有的CPU和ASIC都会使用存储器,它们的类型很多,包括异步RAM、同步RAM、ZBT RAM、DDR DRAM、ROM等。由于大部分的异步RAM和SRAM都是晶圆代工厂定制的,一次需要修改成适合于FPGA结构的Verilog等效模型。FPGA的综合工具会将这些模型推译出FPGA芯片特有的嵌入式RAM。RAM的特点是一拍写入,两拍读出。所有RAM的设计都是在速度和容量直接的折中。
RAM的Verilog建模:
方式1:
////// Generic Single-Port Synchronous RAM //////module or1200_spram_128x32( // Generic synchronous single-port RAM interface clk, rst, ce, we, oe, addr, di, doq);//// Default address and data buses width//parameter aw = 7;parameter dw = 32;//// Generic synchronous single-port RAM interface//input clk; // Clockinput rst; // Resetinput ce; // Chip enable inputinput we; // Write enable inputinput oe; // Output enable inputinput [aw-1:0] addr; // address bus inputsinput [dw-1:0] di; // input data busoutput [dw-1:0] doq; // output data bus//// Generic single-port synchronous RAM model// Generic RAM's registers and wires//reg [dw-1:0] mem [(1<
方式2:
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 begin12 if(mem_we)13 ram[mem_addr] <= mem_din;14 mem_dout <= ram[mem_addr];15 end16 17 endmodule
这两种方式建模的区别在于关键路径不同,方式1的关键路径在输入,方式2的关键路径在输出。
RAM的初始化
用Verilog建模的RAM可以采用$readmemh()和$readmemb()函数初始储存器。
参考文献:
[1]Evgeni Stavinov. 第53则 存储器的建模. FPGA 高手设计实战正经100则. 电子工业出版社. 2013, 10.
[2] Single Port RAM Synchronous Read/Write .
. 2016,01,27.
[3] Dual Port RAM Synchronous Read/Write.
. 2016,01,27.
[4] ROM, EPROM, EEPROM.
[5] Memory Modeling.
[6] $readmemb和$readmemh.
[7] opencores.org/or1k/OR1K:Community_Portal.