無論是用XPM_MEMORY還是IP Core的方式調(diào)用各種類型的RAM(單端口、簡單雙端口或真雙端口),都會遇到這樣一個參數(shù):Write Mode。該參數(shù)有三個可選值,分別為write_first、read_first和no_change。那么這三個值到底有什么區(qū)別呢?應(yīng)用場景又如何?本質(zhì)上,這個參數(shù)是用來解決讀寫沖突即同時對同一地址進行讀寫操作時,寫入該地址的數(shù)據(jù)是什么,讀出該地址的數(shù)據(jù)是什么。
write_first
首先看write_first(又稱為Read after Write,即先寫后讀或?qū)憙?yōu)先),如圖1所示,相應(yīng)的讀寫時序如圖2所示。不難看出,當寫使能WEA有效時(高有效),此時讀依然有效,故該模式下從地址bb和cc讀出的是新寫入的數(shù)據(jù)1111和2222,也意味著寫入地址bb和cc的數(shù)據(jù)分別為1111和2222。
圖1
圖2
read_first
再看read_first(又稱為Read before Write,即先讀后寫或讀優(yōu)先),如圖3所示,相應(yīng)的讀寫時序如圖4所示。此時,從時序圖中可以看出讀出的是該地址上的原有數(shù)據(jù),同時會把新數(shù)據(jù)寫入該地址。
圖3
圖4
no_change
最后我們看看no_change(No Read on Write,保持模式),如圖5所示,相應(yīng)的讀寫時序如圖6所示。可以看出,一旦寫操作有效,讀操作即無效,此時輸出端口保持寫操作之前讀出的數(shù)據(jù)不變。
圖5
圖6
三種模式讓很多初學(xué)者覺得困惑。實際上,這并沒有什么神秘感,我們可以通過RTL代碼實現(xiàn)這三種功能,如圖7~圖9所示??梢钥吹絯rite_first由if else語句完成,we有效時寫入新數(shù)據(jù),同時輸出等于輸入,無效時輸出等于該地址原有數(shù)據(jù)。read_first由if語句完成,寫法類似于移位寄存器,這就是為什么寫有效時讀出的是該地址上的原有數(shù)據(jù)。no_change由if else語句完成,dout在if分支上沒有被賦值,故保持不變,這是實現(xiàn)no_change的關(guān)鍵點。
write_fisrt Verilog代碼:
圖7
read_fisrt Verilog代碼:
圖8
no_change Verilog代碼:
圖9
從代碼風格的角度而言,實現(xiàn)這三種功能是非常容易的。這也進一步驗證了RTL代碼風格對設(shè)計的影響。因此,對于初學(xué)者而言,可以多花些時間研究代碼風格,很可能會有事半功倍的效果。
思考一下:
對于一個單端口RAM,采用RTL代碼描述,如何在同一個模塊中實現(xiàn)如下功能:
(1)寬度可配置
(2)深度可配置
(3)寫模式可配置
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7256瀏覽量
91838 -
代碼
+關(guān)注
關(guān)注
30文章
4900瀏覽量
70723 -
讀寫操作
+關(guān)注
關(guān)注
0文章
5瀏覽量
7222
原文標題:write_first/read_first/no_change什么區(qū)別
文章出處:【微信號:Lauren_FPGA,微信公眾號:FPGA技術(shù)驛站】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
評論