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

    关注

    30

    文章

    5028

    浏览量

    117721
  • IC设计
    +关注

    关注

    37

    文章

    1264

    浏览量

    102955
  • RAM
    RAM
    +关注

    关注

    7

    文章

    1321

    浏览量

    113705
  • CLK
    CLK
    +关注

    关注

    0

    文章

    122

    浏览量

    16908
  • 异步时钟
    +关注

    关注

    0

    文章

    17

    浏览量

    9366
收藏 人收藏

    评论

    相关推荐

    时钟数据传递的Spartan-II FPGA实现

    并行数据的异步转换,并且客户可以根据自己的要求进行数据定义。完成数据在不同时钟间的正确传递的同时防止亚稳态的出现,保持系统的稳定,是电路
    发表于 09-07 09:16

    FPGA设计中有多个时钟时如何处理?

    FPGA设计中有多个时钟时如何处理?跨时钟的基本设计方法是:(1)对于单个信号,使用双D触发器在不同时钟
    发表于 02-24 15:47

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

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

    FPGA请重视异步时钟问题

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

    quartus仿真双口RAM 实现跨时钟通信

    双口RAM如何实现跨时钟通信啊?怎么在quartus ii仿真???
    发表于 05-02 21:51

    关于异步fifo的安全问题:

    由于,如果异步fifo的双口ram真的空了,而跨时钟延迟造成的rdempty仍然非空,则读fifo的逻辑,就有可能根据rdempty信号(非空指示),发出将导致错误的读请求rdreq
    发表于 03-05 10:40

    如何构建一个具有不同读写异步双端口RAM模块?

    你好我正在尝试构建一个具有不同读写异步双端口RAM模块。我已经参考了Xilinx综合指南(UG901)和Xilinx用户指南(UG687)中提供的示例。这两个指南都会使用写入数据
    发表于 08-04 08:15

    如何处理好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

    时钟的设计和综合技巧系列

    通常不是问题,因为快时钟将对慢时钟的控制信号进行一次或多次采样。在异步时钟
    发表于 04-11 17:06

    高级FPGA设计技巧!多时钟异步信号处理解决方案

    于FIFO内。 需要额外注意的一点是,由于只有读写地址是需要在异步时钟之间传递,所以地址就有可能比预想的晚一个时钟周期,同时意味着空或者满标志置
    发表于 06-02 14:26

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

     本发明提供了一种将异步时钟转换成同步时钟域的方法,直接使用同步时钟异步
    发表于 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>域