應(yīng)用1 統(tǒng)計(jì)計(jì)數(shù)
在進(jìn)行模塊設(shè)計(jì)時(shí),我們經(jīng)常需要統(tǒng)計(jì)報(bào)文的數(shù)量,以供軟件(or 主機(jī))讀取,有些統(tǒng)計(jì)僅僅用于debug,有些統(tǒng)計(jì)是協(xié)議要求,有些統(tǒng)計(jì)是為了便于功能實(shí)現(xiàn)。
當(dāng)需要統(tǒng)計(jì)的數(shù)量較多時(shí),為了降低功耗和減少面積,我們通常采用RAM去實(shí)現(xiàn)。
如下案例中,統(tǒng)計(jì)有效數(shù)據(jù)包的個(gè)數(shù)。
假設(shè)數(shù)據(jù)中存在pkt_id,pkt_id為0~63,則ram的深度為64。pkt_id用于作為讀寫(xiě)地址。RAM讀延時(shí)為3個(gè)時(shí)鐘周期。
有數(shù)據(jù)來(lái)臨時(shí),pkt_vld作為讀使能,讀出當(dāng)前包計(jì)數(shù)rdata,三個(gè)周期后,rdata加1回寫(xiě)到ram。
如下圖所示:需要有三個(gè)注意事項(xiàng)
NOTE1:需要有讀寫(xiě)保護(hù),因?yàn)榭赡艹霈F(xiàn)連續(xù)4個(gè)周期內(nèi),pkt_vld為1,且pkt_id相同,此時(shí)會(huì)出現(xiàn)同一個(gè)周期對(duì)相同的地址進(jìn)行讀寫(xiě),因此需要RAM需要添加讀寫(xiě)保護(hù)模塊,保證數(shù)據(jù)能夠正確寫(xiě)入,且讀出的都是最新值,否則就會(huì)出現(xiàn)統(tǒng)計(jì)錯(cuò)誤。
NOTE2:圖中既有軟件讀、又存在硬件讀,且硬件讀優(yōu)先級(jí)更高,軟件讀優(yōu)先級(jí)低,因此為了保證軟件讀能夠在有效周期內(nèi)得到響應(yīng),因此需要在主數(shù)據(jù)流上插入空拍,避免出現(xiàn)軟件讀長(zhǎng)時(shí)間無(wú)法響應(yīng)而產(chǎn)生超時(shí)。
應(yīng)用2 位寬轉(zhuǎn)換
在進(jìn)行模塊設(shè)計(jì)時(shí),我們經(jīng)常需要進(jìn)行數(shù)據(jù)位寬的轉(zhuǎn)換,常見(jiàn)的兩種轉(zhuǎn)換場(chǎng)景有同步時(shí)鐘域位寬轉(zhuǎn)換和異步時(shí)鐘域位寬轉(zhuǎn)換。本文將介紹異步時(shí)鐘域位寬轉(zhuǎn)換
異步時(shí)鐘域的位寬轉(zhuǎn)換讀時(shí)鐘和寫(xiě)時(shí)鐘屬于兩個(gè)時(shí)鐘。如下案例中,數(shù)據(jù)位寬由32bit轉(zhuǎn)40bit,寫(xiě)時(shí)鐘頻率156.25MHz,讀時(shí)鐘頻率125Mhz,寫(xiě)數(shù)據(jù)為32bit,讀數(shù)據(jù)位寬為40bit,通過(guò)計(jì)算得到入口數(shù)據(jù)速率和出口數(shù)據(jù)速率保持一致(156.2532==40125)。
存儲(chǔ)模塊是由寄存器搭建的。那么需要多大存儲(chǔ)模塊呢?32和40的最小公倍數(shù)為160,極限場(chǎng)景下,只需要160bit的寄存器作為存儲(chǔ)就夠了,但是讀操作通常晚于寫(xiě)操作,并且考慮到時(shí)鐘有抖動(dòng)有偏移,為了避免溢出,稍微增加一部分緩存,我們可以采用320bit作為存儲(chǔ)模塊。因此寫(xiě)側(cè)32bit寫(xiě)10次,讀側(cè)40bit讀8次,讀寫(xiě)兩側(cè)所需的時(shí)間相等。
注意事項(xiàng):寫(xiě)地址(wr_addr)跳轉(zhuǎn)范圍是09,讀地址(rd_addr)跳轉(zhuǎn)范圍07。
如圖所示:
buff_array為320bit的數(shù)據(jù)存儲(chǔ)。
vld_array為80bit的有效標(biāo)志位存儲(chǔ):vld_array[n]為1表示buff_array[4n+3:4n]存在4bit的有效數(shù)據(jù)。
always @(posedge wr_clk or negedge wr_rst_n) begin if (~wr_rst_n) begin buff_array <= {DATA_FIFO_DEPTH{1'b0}}; vld_array <= {VALID_FIFO_DEPTH{1'b0}}; end else begin if (wr_en) begin buff_array[ wr_addr*32 +: 32] <= wr_data_i; vld_array[wr_addr*8 +: 8] <= {8{wr_valid_i}}; end end end reg [10-1:0] rd_valid_bus; reg [40-1:0] rd_data_bus; always @(*) begin rd_data_bus[40-1:0] = buff_array[ rd_addr*40 +: 40]; rd_valid_bus[10-1:0] = vld_array[rd_addr*10 +: 10]; end integer i; reg [40-1:0] rd_data_valid_mask; always @(*) begin for(i = 0; i < 40; i = i + 1) begin rd_data_valid_mask[i] = rd_valid_bus[i/4]; end end always @(posedge rd_clk or negedge rd_rst_n) begin if (~rd_rst_n) begin rd_data_o <= {40{1'b0}}; rd_valid_o <= 1'b0; end else begin if (rd_en) begin rd_data_o <= rd_data_bus & rd_data_valid_mask; rd_valid_o <= |rd_valid_bus; end else begin rd_data_o <= {40{1'b0}}; rd_valid_o <= 1'b0; end end end
審核編輯:湯梓紅
-
寄存器
+關(guān)注
關(guān)注
31文章
5294瀏覽量
119814 -
RAM
+關(guān)注
關(guān)注
8文章
1354瀏覽量
114441 -
數(shù)據(jù)包
+關(guān)注
關(guān)注
0文章
248瀏覽量
24344 -
讀寫(xiě)保護(hù)
+關(guān)注
關(guān)注
0文章
4瀏覽量
5863
原文標(biāo)題:ram的兩種應(yīng)用~統(tǒng)計(jì)計(jì)數(shù)和位寬轉(zhuǎn)換
文章出處:【微信號(hào):處芯積律,微信公眾號(hào):處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論