0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

IC设计:ram的应用-异步时钟域位宽转换

冬至子 来源:IC的世界 作者:IC小鸽 2023-11-23 16:41 次阅读

在进行模块设计时,我们经常需要进行数据位宽的转换,常见的两种转换场景有同步时钟域位宽转换和异步时钟域位宽转换。本文将介绍异步时钟域位宽转换

异步时钟域的位宽转换读时钟和写时钟属于两个时钟。如下案例中,数据位宽由32bit转40bit,写时钟频率156.25MHz,读时钟频率125Mhz,写数据为32bit,读数据位宽为40bit,通过计算得到入口数据速率和出口数据速率保持一致(156.25 *32==40 *125)。

存储模块是由寄存器搭建的。那么需要多大存储模块呢?32和40的最小公倍数为160,极限场景下,只需要160bit的寄存器作为存储就够了,但是读操作通常晚于写操作,并且考虑到时钟有抖动有偏移,为了避免溢出,稍微增加一部分缓存,我们可以采用320bit作为存储模块。因此写侧32bit写10次,读侧40bit读8次,读写两侧所需的时间相等。

注意事项:写地址(wr_addr)跳转范围是09,读地址(rd_addr)跳转范围07。

image.png

如图所示:

buff_array为320bit的数据存储。

vld_array为80bit的有效标志位存储:vld_array[n]为1表示buff_array[4n+3:4n]存在4bit的有效数据。

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
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5336

    浏览量

    120230
  • IC设计
    +关注

    关注

    38

    文章

    1295

    浏览量

    103918
  • RAM
    RAM
    +关注

    关注

    8

    文章

    1368

    浏览量

    114641
  • CLK
    CLK
    +关注

    关注

    0

    文章

    127

    浏览量

    17158
  • 异步时钟
    +关注

    关注

    0

    文章

    17

    浏览量

    9404
收藏 人收藏

    评论

    相关推荐

    关于异步时钟的理解问题:

    关于异步时钟的理解的问题: 这里面的count[25]、和count[14]和count[1]算是多时钟吧?大侠帮解决下我的心结呀,我
    发表于 02-27 15:50

    FPGA请重视异步时钟问题

    [size=11.818181991577148px]FPGA开发中,遇到的最多的就是异步时钟了。[size=11.818181991577148px]检查初学者的代码,发现最多的就是这类
    发表于 08-13 15:36

    如何处理好FPGA设计中跨时钟问题?

    以手到擒来。这里介绍的三种方法跨时钟处理方法如下:打两拍;异步双口 RAM;格雷码转换。01方法一:打两拍大家很清楚,处理跨
    发表于 09-22 10:24

    探寻FPGA中三种跨时钟处理方法

    以手到擒来。这里介绍的三种方法跨时钟处理方法如下:打两拍;异步双口 RAM;格雷码转换。01方法一:打两拍大家很清楚,处理跨
    发表于 10-20 09:27

    三种跨时钟处理的方法

    的三种方法跨时钟处理方法如下:  1. 打两拍;  2. 异步双口RAM;  3. 格雷码转换。  方法一:打两拍  大家很清楚,处理跨
    发表于 01-08 16:55

    三种FPGA界最常用的跨时钟处理法式

    时钟处理方法如下:打两拍;异步双口RAM;格雷码转换。01方法一:打两拍大家很清楚,处理跨时钟
    发表于 02-21 07:00

    FPGA初学者的必修课:FPGA跨时钟处理3大方法

    时钟处理方法如下:打两拍;异步双口RAM;格雷码转换。01方法一:打两拍大家很清楚,处理跨时钟
    发表于 03-04 09:22

    异步FIFO的设计分析及详细代码

    (每个数据的) FIFO有同步和异步两种,同步即读写时钟相同,异步即读写时钟不相同 同步FI
    发表于 11-15 12:52 8620次阅读
    <b class='flag-5'>异步</b>FIFO的设计分析及详细代码

    如何解决异步FIFO跨时钟亚稳态问题?

    时钟的问题:前一篇已经提到要通过比较读写指针来判断产生读空和写满信号,但是读指针是属于读时钟的,写指针是属于写时钟
    的头像 发表于 09-05 14:29 6056次阅读

    如何将一种异步时钟转换成同步时钟

     本发明提供了一种将异步时钟转换成同步时钟的方法,直接使用同步
    发表于 12-21 17:10 5次下载
    如何将一种<b class='flag-5'>异步</b><b class='flag-5'>时钟</b><b class='flag-5'>域</b><b class='flag-5'>转换</b>成同步<b class='flag-5'>时钟</b><b class='flag-5'>域</b>

    Verilog电路设计之单bit跨时钟同步和异步FIFO

    FIFO用于为匹配读写速度而设置的数据缓冲buffer,当读写时钟异步时,就是异步FIFO。多bit的数据信号,并不是直接从写时钟同步到读
    发表于 01-01 16:48 1285次阅读

    单位信号如何跨时钟

    单位(Single bit)信号即该信号的为1,通常控制信号居多。对于此类信号,如需跨时钟可直接使用xpm_cdc_single
    的头像 发表于 04-13 09:11 1314次阅读

    时钟电路设计总结

    时钟操作包括同步跨时钟操作和异步时钟操作。
    的头像 发表于 05-18 09:18 735次阅读
    跨<b class='flag-5'>时钟</b><b class='flag-5'>域</b>电路设计总结

    时钟电路设计:单位信号如何跨时钟

    单位(Single bit)信号即该信号的为1,通常控制信号居多。对于此类信号,如需跨时钟可直接使用xpm_cdc_single,如
    的头像 发表于 08-16 09:53 1333次阅读
    跨<b class='flag-5'>时钟</b><b class='flag-5'>域</b>电路设计:单位<b class='flag-5'>宽</b>信号如何跨<b class='flag-5'>时钟</b><b class='flag-5'>域</b>

    IC设计:ram的折叠设计操作步骤

    IC设计中,我们有时会使用深度很大,很小的ram。例如深度为1024,为4bit的
    的头像 发表于 03-04 15:08 2131次阅读
    <b class='flag-5'>IC</b>设计:<b class='flag-5'>ram</b>的折叠设计操作步骤