1. 程式人生 > >Vivado中單埠和雙埠RAM的區別

Vivado中單埠和雙埠RAM的區別

Note: 以下內容可能會有錯誤的地方,僅供參考,詳細請查閱Xilinx官方產品指南《pg058-blk-mem-gen》 !

BMG即Block Memory Generator,是Xilinx配置BRAM的IP核,可將BRAM配置成如圖所示的5種類型。

RAM分三種,單埠RAM、偽雙埠RAM(Simple Dual)和雙埠RAM(True Dual),它們之間的區別是什麼呢?先看看它們的介面。

可以看到它們的介面區別

偽雙埠RAM很好理解,相當於讀寫分開,addra、dina和wea完成寫,addrb和doutb完成讀,你讀你的,我寫我的,互不干擾。

單埠RAM的通過一個埠對儲存進行讀寫訪問是什麼意思呢?通過下圖的模擬可以看到,資料讀埠douta一直都有輸出對應地址的資料,當wea拉高時,會將資料寫入對應的地址,因為該模擬選擇的Operating Mode是Write First,所以wea拉高時douta輸出的資料與此時寫入的資料是一致的。所以單埠RAM的讀寫不能同時進行,在讀的時候需要重新生成對應的讀地址給addra,並且disable掉wea 。

輸出douta對應地址addra的延時為2個時鐘週期,這是因為預設勾選了Output Register選項的原因,RAM在輸出前打了一拍,如果去掉這個選項,延時則變為1個時鐘週期。

雙埠RAM有兩個埠獨立,那它們是操作不同的Memory還是操作同一個Memory呢?如果是同一個Memory不會衝突嗎?先看第一個模擬,模擬條件如下:

1 寫使能web與wea相同 ;

2 地址addra和addrb不同 ;

3 輸入資料dina和dinb相同;

從曲線看埠A和B好像是操作的不同的Memory,而注意看直線的話,會發現在wea拉高時,埠A向地址1寫的是21,埠B向地址1寫的是26,而wea拉低時,埠A輸出的卻是26,這裡就可以確認埠A和B訪問的是同一塊Memory了。 所以通過以上模擬我們得到的結論是雙埠其實是兩組地址對同一塊Memory進行讀寫。 模擬裡看到當兩個埠同時寫一個地址的時候,寫入該地址的是埠B的資料,但模擬畢竟不是真實的情況,實際上是該地址的結果是未知的。ug058裡有提到 。

pg058中還有這麼一段話:

The Simple Dual-Port RAM is like a true dual-port RAM where only the Write interface of the A port and the Read interface of B port are connected.

所以對於雙埠RAM,我們在外部控制的時候如果只把A埠用作寫,B埠用作讀,那其實就和偽雙埠RAM一樣了。

所以結論是:

無論是單埠RAM、偽雙埠RAM還是雙埠RAM,他們都只有一塊Memory,通過下圖同樣深度和寬度設定的單埠和雙埠RAM的資源消耗也可以說明。並且他們都是通過定址的方式訪問這塊Memory,區別對應Memory的介面數量不同,也即是所謂的埠不同。

定址就是輸入地址,輸出對應地址中儲存的資料,且如果寫使能wea有效,則同時將與該地址同步的輸入端din的資料寫入該地址。同時讀寫的時候會有衝突,該衝突的解決方式與選擇的Operating Mode有關,詳情請檢視Xilinx產品指南pg058。

單埠RAM:只有一個地址介面addra,對應有一對讀寫的資料介面dina和douta;

偽雙埠RAM:有兩個地址介面addra和addrb,但卻只有一對讀寫的資料介面dina和doutb,所以叫他偽雙埠;

雙埠RAM:則擁有兩個地址介面,並且每個地址介面都有對應的讀寫資料介面,所以叫真雙埠RAM,真雙埠RAM支援兩個埠同時對Memory進行訪問,有效的提高了訪問速度。同樣的,對於雙埠的ROM,我們可以通過兩個埠同時讀取ROM中的資料,所以如果兩個processor是訪問同樣的一組資料的話,就不需要例化兩個相同的ROM了。