在進(jìn)行模塊設(shè)計(jì)時(shí),我們經(jīng)常需要進(jìn)行數(shù)據(jù)位寬的轉(zhuǎn)換,常見的兩種轉(zhuǎn)換場(chǎng)景有同步時(shí)鐘域位寬轉(zhuǎn)換和異步時(shí)鐘域位寬轉(zhuǎn)換。本文將介紹異步時(shí)鐘域位寬轉(zhuǎn)換 異步時(shí)鐘域的位寬轉(zhuǎn)換讀時(shí)鐘和寫時(shí)鐘屬于兩個(gè)時(shí)鐘。如下案例中,數(shù)據(jù)位寬由32bit轉(zhuǎn)40bit,寫時(shí)鐘頻率156.25MHz,讀時(shí)鐘頻率125Mhz,寫數(shù)據(jù)為32bit,讀數(shù)據(jù)位寬為40bit,通過(guò)計(jì)算得到入口數(shù)據(jù)速率和出口數(shù)據(jù)速率保持一致(156.25*32==40*125)。存儲(chǔ)模塊是由寄存器搭建的。那么需要多大存儲(chǔ)模塊呢?32和40的最小公倍數(shù)為160,極限場(chǎng)景下,只需要160bit的寄存器作為存儲(chǔ)就夠了,但是讀操作通常晚于寫操作,并且考慮到時(shí)鐘有抖動(dòng)有偏移,為了避免溢出,稍微增加一部分緩存,我們可以采用320bit作為存儲(chǔ)模塊。因此寫側(cè)32bit寫10次,讀側(cè)40bit讀8次,讀寫兩側(cè)所需的時(shí)間相等。注意事項(xiàng):寫地址(wr_addr)跳轉(zhuǎn)范圍是0~9,讀地址(rd_addr)跳轉(zhuǎn)范圍0~7。


如圖所示: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文章
5434瀏覽量
124500 -
RAM
+關(guān)注
關(guān)注
8文章
1392瀏覽量
117533 -
存儲(chǔ)模塊
+關(guān)注
關(guān)注
0文章
16瀏覽量
9020
原文標(biāo)題:IC設(shè)計(jì):ram的應(yīng)用 - 位寬轉(zhuǎn)換
文章出處:【微信號(hào):IP與SoC設(shè)計(jì),微信公眾號(hào):IP與SoC設(shè)計(jì)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
IC設(shè)計(jì):ram的應(yīng)用-異步時(shí)鐘域位寬轉(zhuǎn)換

請(qǐng)推薦反激有源鉗位的IC
Ultrascale器件中如何將字節(jié)寬寫入啟用轉(zhuǎn)換為位wibe寫入enalbe?
在SpinalHDL里有沒(méi)有什么好的方式實(shí)現(xiàn)一個(gè)接口位寬轉(zhuǎn)換呢
顯卡的顯存位寬
不用D-A轉(zhuǎn)換器IC的8位廉價(jià)D-A轉(zhuǎn)換電路

采用乘法D-A轉(zhuǎn)換器IC的廉價(jià)8位D-A轉(zhuǎn)換器

TANDY WP 2 RAM IC卡開源分享

IC設(shè)計(jì):ram的折疊設(shè)計(jì)操作步驟

評(píng)論