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可以同時讀取兩個數據,這樣明顯提高讀取速度以及處理速度。