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