Vivado中RAM分为分布式RAM和块RAM。两种实现方法在向RAM写入数据时都是采取同步方式,区别在于从RAM读取数据时,分布式RAM采用异步方式,块RAM采用同步方式。
块RAM分为单口RAM和双口RAM. 单口RAM只有一组数据线与地址线,因此读写不能同时进行。而双口RAM有两组数据线与地址线,读写可同时进行。FIFO读写可同时进行,可以看作是双口。
赛灵思官方将双口RAM分为Simple Dual Port RAM(伪双口RAM)和True Dual Port RAM(双口RAM)。
伪双口RAM,一个端口只写,另一个端口只读;而双口RAM两个端口都可以读写。FIFO也是一个端口只读,另一个端口只写。FIFO与伪双口RAM的区别在于,FIFO为先入先出,没有地址线,不能对存储单元寻址;而伪双口RAM两个端口都有地址线,可以对存储单元寻址。
伪双口RAM只有一个写端口,一个读端口。
blk_mem_gen_0 IP_sram (
.clka(clk), // input wire clka
.ena(ena), // input wire ena
.wea(wr), // input wire [0 : 0] wea
.addra(addr_wr), // input wire [3 : 0] addra
.dina(map_in), // input wire [15 : 0] dina
.clkb(clk), // input wire clkb
.enb(enb), // input wire enb
.addrb(addr_rd), // input wire [3 : 0] addrb
.doutb(map_out) // output wire [15 : 0] doutb
);
真双口RAM分别有两个写端口和两个读端口。
无论是简单双口RAM还是真双口RAM,在没有读操作的情况下,应将读使能rden信号拉成低电平,节省功耗。
在两种情况下,都应当避免read-during-write,虽然可在软件中进行设置,但是,作为设计者,应当尽量避免此种情况。
对于真双口RAM,还应当避免两个读端口或者两个写端口同时操作同一个地址,RAM中并没有此种冲突解决电路,设计者应该避免这种冲突。
无论是那种双口RAM,读时序图是相同的。
当读使能有效时,数据会在时钟下一个上升沿从Q端输出。
真双口RAM给设计带来很多便利。在高速存储中,需要对连续的数据同时处理,使用简单双口RAM只能读取一个数据,而使用真双口RAM可以同时读取两个数据,这样明显提高读取速度以及处理速度。