存儲(chǔ)器是FPGA設(shè)計(jì)中的常用單元,對(duì)存儲(chǔ)器的操作,最基礎(chǔ)的就是讀寫(xiě)操作,還有一種就是讀改寫(xiě)操作,即先讀出存儲(chǔ)器中的數(shù)據(jù),對(duì)其進(jìn)行修改后,再寫(xiě)入存儲(chǔ)器。這樣的操作其實(shí)在大多數(shù)情況下都是非常簡(jiǎn)單的,不值一提,但是在某些有性能要求的場(chǎng)景下,就需要一些考慮。
比如輸入是一個(gè)8bit的數(shù)據(jù),取值為0-255,求每個(gè)數(shù)值出現(xiàn)的次數(shù),即同時(shí)0出現(xiàn)多少次,1出現(xiàn)多少次……
讀改寫(xiě)的問(wèn)題
我們先以最簡(jiǎn)單的例子,對(duì)FPGA內(nèi)部的RAM進(jìn)行讀改寫(xiě)操作,看看是什么情況,假定需要對(duì)RAM中的數(shù)據(jù)讀出來(lái)加1后再寫(xiě)回原地址,如下圖所示:
通過(guò)讀地址A,在下一個(gè)cycle得到數(shù)據(jù)X,然后對(duì)X進(jìn)行加一操作后,再寫(xiě)回地址A。我們可以看到,整個(gè)過(guò)程需要3個(gè)cycle的時(shí)間。如果再對(duì)地址A開(kāi)啟讀操作,就需要在第四個(gè)cycle開(kāi)始,否則就讀不到最新的數(shù)據(jù)。換句話(huà)說(shuō),上述操作無(wú)法進(jìn)行流水操作,每次讀改寫(xiě)操作至少需要3個(gè)cycle的時(shí)間(對(duì)于其他更加復(fù)雜的“改”操作,可能需要消耗更多的時(shí)間)。對(duì)于性能要求較高的場(chǎng)景,必須要流水操作的時(shí)候,如何處理呢?
解決方案
我們知道不能流水的原因是因?yàn)樽钚碌臄?shù)據(jù)可能沒(méi)有寫(xiě)回RAM,還在數(shù)據(jù)總線(xiàn)上,因此判斷最新的數(shù)據(jù)在哪里就是解決這個(gè)問(wèn)題的關(guān)鍵。這里還需要用到一個(gè)“cache”,用reg來(lái)實(shí)現(xiàn),主要是記錄即將要寫(xiě)入RAM的地址和數(shù)據(jù),即記錄寫(xiě)總線(xiàn)上的地址和數(shù)據(jù)。其實(shí)現(xiàn)原理可以用一個(gè)時(shí)序圖來(lái)展示。
我們假定要讀的地址是AABA,但是為了區(qū)分,我們用A1、A2、B1、A3來(lái)表示(A1、A2、A3其實(shí)是同一個(gè)地址)。我們看看如何利用“cache”實(shí)現(xiàn)流水式的讀改寫(xiě)操作。
第1個(gè)時(shí)鐘周期,讀A1的內(nèi)容,此時(shí)cache的內(nèi)容也為0;
第2個(gè)時(shí)鐘周期,A1的內(nèi)容在dout上,為x,我們同時(shí)拿A1這個(gè)地址去“cache”查詢(xún),由于“cache”為空,不取“cache”中的值,直接取dout上的值作為改寫(xiě)的對(duì)象;同時(shí)也開(kāi)始讀A2的內(nèi)容;
第3個(gè)時(shí)鐘周期,主要做2個(gè)更新,一是根據(jù)第2個(gè)周期中出現(xiàn)的A1和dout的值,更新到“cache”中,二是將更新的數(shù)據(jù)和地址放在寫(xiě)總線(xiàn)上,這2個(gè)更新的內(nèi)容其實(shí)是一致的,都是改和寫(xiě)的過(guò)程;同時(shí)拿A2去查詢(xún)“cache”;
第4個(gè)時(shí)鐘周期,根據(jù)查詢(xún)的結(jié)果,例子中為“cache”命中,選擇“cache”中的內(nèi)容x+1為改寫(xiě)對(duì)象,而不是dout上讀取的值,所以寫(xiě)入的內(nèi)容為x+2。同時(shí)根據(jù)第三個(gè)時(shí)鐘周期中的A2來(lái)更新cache,將A2和對(duì)應(yīng)寫(xiě)入的值x+2更新到“cache”中,此時(shí)“cache”中有2個(gè)內(nèi)容,一個(gè)是A1和值x+1,一個(gè)是A2和值x+2;
從第4個(gè)時(shí)鐘周期可以看到,讀A2這個(gè)地址得到的值,不是從dout上獲取的,而是從“cache”中獲取的,這就是利用“cache”來(lái)實(shí)現(xiàn)讀改寫(xiě)的流水操作。
在第5個(gè)時(shí)鐘周期,用A3去查詢(xún)“cache”時(shí),“cache”中有2個(gè)A,即A1和A2,這時(shí)我們?nèi)プ睢靶隆钡腁,即A2的值x+2作為改寫(xiě)對(duì)象。
總結(jié)
在高性能的讀改寫(xiě)場(chǎng)景下,利用“cache”可以實(shí)現(xiàn)讀改寫(xiě)的流水操作,大大提高了處理性能。當(dāng)然如果輸入的數(shù)據(jù)并不是流水的,采用最簡(jiǎn)單的方式實(shí)現(xiàn)讀改寫(xiě)即可。
-
FPGA
+關(guān)注
關(guān)注
1645文章
22050瀏覽量
618414 -
FPGA設(shè)計(jì)
+關(guān)注
關(guān)注
9文章
428瀏覽量
27347 -
存儲(chǔ)器
+關(guān)注
關(guān)注
38文章
7651瀏覽量
167388 -
RAM
+關(guān)注
關(guān)注
8文章
1392瀏覽量
117521
發(fā)布評(píng)論請(qǐng)先 登錄
【ZYNQ Ultrascale+ MPSOC FPGA教程】第六章FPGA片內(nèi)RAM讀寫(xiě)測(cè)試實(shí)驗(yàn)

勇敢的芯伴你玩轉(zhuǎn)Altera FPGA連載90:FPGA片內(nèi)ROM FIFO RAM聯(lián)合實(shí)例
介紹FPGA開(kāi)發(fā)板內(nèi)部ram操作
如何使用FPGA內(nèi)部的ROM以及程序?qū)υ揜OM的數(shù)據(jù)讀操作
如何使用FPGA內(nèi)部的RAM以及程序?qū)υ?b class='flag-5'>RAM的數(shù)據(jù)讀寫(xiě)操作
如何將外部SPI Flash加載到FPGA內(nèi)部ram然后復(fù)位MC8051

詳細(xì)介紹關(guān)于FPGA開(kāi)發(fā)板內(nèi)部ram是如何操作的

如何使用FPGA內(nèi)部的ROM以及程序?qū)υ揜OM的數(shù)據(jù)讀操作

如何使用FPGA內(nèi)部的RAM以及程序?qū)υ?b class='flag-5'>RAM的數(shù)據(jù)讀寫(xiě)操作

【ZYNQ Ultrascale+ MPSOC FPGA教程】第七章 FPGA片內(nèi)ROM測(cè)試實(shí)驗(yàn)

【ZYNQ Ultrascale+ MPSOC FPGA教程】第六章 FPGA片內(nèi)RAM讀寫(xiě)測(cè)試實(shí)驗(yàn)

FLASH被異常改寫(xiě)

評(píng)論