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