在進行模塊設計時,我們經常需要進行數據位寬的轉換,常見的兩種轉換場景有同步時鐘域位寬轉換和異步時鐘域位寬轉換。本文將介紹異步時鐘域位寬轉換 異步時鐘域的位寬轉換讀時鐘和寫時鐘屬于兩個時鐘。如下案例中,數據位寬由32bit轉40bit,寫時鐘頻率156.25MHz,讀時鐘頻率125Mhz,寫數據為32bit,讀數據位寬為40bit,通過計算得到入口數據速率和出口數據速率保持一致(156.25*32==40*125)。存儲模塊是由寄存器搭建的。那么需要多大存儲模塊呢?32和40的最小公倍數為160,極限場景下,只需要160bit的寄存器作為存儲就夠了,但是讀操作通常晚于寫操作,并且考慮到時鐘有抖動有偏移,為了避免溢出,稍微增加一部分緩存,我們可以采用320bit作為存儲模塊。因此寫側32bit寫10次,讀側40bit讀8次,讀寫兩側所需的時間相等。注意事項:寫地址(wr_addr)跳轉范圍是0~9,讀地址(rd_addr)跳轉范圍0~7。
如圖所示:buff_array為320bit的數據存儲。vld_array為80bit的有效標志位存儲:vld_array[n]為1表示buff_array[4n+3:4n]存在4bit的有效數據。
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
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
寄存器
+關注
關注
31文章
5357瀏覽量
120681 -
RAM
+關注
關注
8文章
1369瀏覽量
114776 -
存儲模塊
+關注
關注
0文章
15瀏覽量
8927
原文標題:IC設計:ram的應用 - 位寬轉換
文章出處:【微信號:IP與SoC設計,微信公眾號:IP與SoC設計】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
請推薦反激有源鉗位的IC
請TI工程師推反激有源鉗位的IC,主要應用在DC-DC電源上,因寬電壓輸入9-36V范圍,若用正激有源鉗位的話二次側續流管會是比較難處理的問題,加之體積小,所以想用反激有源鉗
發表于 07-05 11:51
Ultrascale器件中如何將字節寬寫入啟用轉換為位wibe寫入enalbe?
大家好, 在Ultrascale器件中,RAM具有字節寬寫入使能,但我想要Bit Wide Write Enable,所以 如何將字節寬寫入啟用轉換為
發表于 04-26 13:53
評論