0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

IC設(shè)計(jì):ram的應(yīng)用-異步時(shí)鐘域位寬轉(zhuǎn)換

冬至子 ? 來源:IC的世界 ? 作者:IC小鴿 ? 2023-11-23 16:41 ? 次閱讀

在進(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,通過計(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)范圍是09,讀地址(rd_addr)跳轉(zhuǎn)范圍07。

image.png

如圖所示:

buff_array為320bit的數(shù)據(jù)存儲(chǔ)。

vld_array為80bit的有效標(biāo)志位存儲(chǔ):vld_array[n]為1表示buff_array[4n+3:4n]存在4bit的有效數(shù)據(jù)。

image.png

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
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5250

    瀏覽量

    119200
  • IC設(shè)計(jì)
    +關(guān)注

    關(guān)注

    37

    文章

    1287

    瀏覽量

    103434
  • RAM
    RAM
    +關(guān)注

    關(guān)注

    8

    文章

    1344

    瀏覽量

    114214
  • CLK
    CLK
    +關(guān)注

    關(guān)注

    0

    文章

    125

    瀏覽量

    17039
  • 異步時(shí)鐘
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    9394
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    關(guān)于異步時(shí)鐘的理解問題:

    關(guān)于異步時(shí)鐘的理解的問題: 這里面的count[25]、和count[14]和count[1]算是多時(shí)鐘吧?大俠幫解決下我的心結(jié)呀,我
    發(fā)表于 02-27 15:50

    FPGA請(qǐng)重視異步時(shí)鐘問題

    [size=11.818181991577148px]FPGA開發(fā)中,遇到的最多的就是異步時(shí)鐘了。[size=11.818181991577148px]檢查初學(xué)者的代碼,發(fā)現(xiàn)最多的就是這類
    發(fā)表于 08-13 15:36

    如何處理好FPGA設(shè)計(jì)中跨時(shí)鐘問題?

    以手到擒來。這里介紹的三種方法跨時(shí)鐘處理方法如下:打兩拍;異步雙口 RAM;格雷碼轉(zhuǎn)換。01方法一:打兩拍大家很清楚,處理跨
    發(fā)表于 09-22 10:24

    探尋FPGA中三種跨時(shí)鐘處理方法

    以手到擒來。這里介紹的三種方法跨時(shí)鐘處理方法如下:打兩拍;異步雙口 RAM;格雷碼轉(zhuǎn)換。01方法一:打兩拍大家很清楚,處理跨
    發(fā)表于 10-20 09:27

    三種跨時(shí)鐘處理的方法

    的三種方法跨時(shí)鐘處理方法如下:  1. 打兩拍;  2. 異步雙口RAM;  3. 格雷碼轉(zhuǎn)換?! 》椒ㄒ唬捍騼膳摹 〈蠹液芮宄幚砜?/div>
    發(fā)表于 01-08 16:55

    三種FPGA界最常用的跨時(shí)鐘處理法式

    時(shí)鐘處理方法如下:打兩拍;異步雙口RAM;格雷碼轉(zhuǎn)換。01方法一:打兩拍大家很清楚,處理跨時(shí)鐘
    發(fā)表于 02-21 07:00

    FPGA初學(xué)者的必修課:FPGA跨時(shí)鐘處理3大方法

    時(shí)鐘處理方法如下:打兩拍;異步雙口RAM;格雷碼轉(zhuǎn)換。01方法一:打兩拍大家很清楚,處理跨時(shí)鐘
    發(fā)表于 03-04 09:22

    異步FIFO的設(shè)計(jì)分析及詳細(xì)代碼

    (每個(gè)數(shù)據(jù)的) FIFO有同步和異步兩種,同步即讀寫時(shí)鐘相同,異步即讀寫時(shí)鐘不相同 同步FI
    發(fā)表于 11-15 12:52 ?8441次閱讀
    <b class='flag-5'>異步</b>FIFO的設(shè)計(jì)分析及詳細(xì)代碼

    如何解決異步FIFO跨時(shí)鐘亞穩(wěn)態(tài)問題?

    時(shí)鐘的問題:前一篇已經(jīng)提到要通過比較讀寫指針來判斷產(chǎn)生讀空和寫滿信號(hào),但是讀指針是屬于讀時(shí)鐘的,寫指針是屬于寫時(shí)鐘
    的頭像 發(fā)表于 09-05 14:29 ?5903次閱讀

    如何將一種異步時(shí)鐘轉(zhuǎn)換成同步時(shí)鐘

     本發(fā)明提供了一種將異步時(shí)鐘轉(zhuǎn)換成同步時(shí)鐘的方法,直接使用同步
    發(fā)表于 12-21 17:10 ?5次下載
    如何將一種<b class='flag-5'>異步</b><b class='flag-5'>時(shí)鐘</b><b class='flag-5'>域</b><b class='flag-5'>轉(zhuǎn)換</b>成同步<b class='flag-5'>時(shí)鐘</b><b class='flag-5'>域</b>

    Verilog電路設(shè)計(jì)之單bit跨時(shí)鐘同步和異步FIFO

    FIFO用于為匹配讀寫速度而設(shè)置的數(shù)據(jù)緩沖buffer,當(dāng)讀寫時(shí)鐘異步時(shí),就是異步FIFO。多bit的數(shù)據(jù)信號(hào),并不是直接從寫時(shí)鐘同步到讀
    發(fā)表于 01-01 16:48 ?1202次閱讀

    單位信號(hào)如何跨時(shí)鐘

    單位(Single bit)信號(hào)即該信號(hào)的為1,通??刂菩盘?hào)居多。對(duì)于此類信號(hào),如需跨時(shí)鐘可直接使用xpm_cdc_single
    的頭像 發(fā)表于 04-13 09:11 ?1193次閱讀

    時(shí)鐘電路設(shè)計(jì)總結(jié)

    時(shí)鐘操作包括同步跨時(shí)鐘操作和異步時(shí)鐘操作。
    的頭像 發(fā)表于 05-18 09:18 ?617次閱讀
    跨<b class='flag-5'>時(shí)鐘</b><b class='flag-5'>域</b>電路設(shè)計(jì)總結(jié)

    時(shí)鐘電路設(shè)計(jì):?jiǎn)挝?b class='flag-5'>寬信號(hào)如何跨時(shí)鐘

    單位(Single bit)信號(hào)即該信號(hào)的為1,通常控制信號(hào)居多。對(duì)于此類信號(hào),如需跨時(shí)鐘可直接使用xpm_cdc_single,如
    的頭像 發(fā)表于 08-16 09:53 ?987次閱讀
    跨<b class='flag-5'>時(shí)鐘</b><b class='flag-5'>域</b>電路設(shè)計(jì):?jiǎn)挝?b class='flag-5'>寬</b>信號(hào)如何跨<b class='flag-5'>時(shí)鐘</b><b class='flag-5'>域</b>

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

    IC設(shè)計(jì)中,我們有時(shí)會(huì)使用深度很大,很小的ram。例如深度為1024,為4bit的
    的頭像 發(fā)表于 03-04 15:08 ?2015次閱讀
    <b class='flag-5'>IC</b>設(shè)計(jì):<b class='flag-5'>ram</b>的折疊設(shè)計(jì)操作步驟