关于异步FIFO读写指针同步的理解(打两拍)

1.打两拍的操作就是将一个时钟域的信号同步到另外一个时钟域(其实打一拍也能同步,就是锁住信号),但逛博客有以下的说法:

https://www.cnblogs.com/streetlive/p/12872619.html
  实际上述的说法是有问题的,考虑这样一个问题,如果亚稳态经过打拍处理使稳定输出的概率为99.9999%,但系统在100MHZ的频率下进行工作,是不是说一秒钟内就会发生多次错误?
  其实,只要后面有寄存器采集,寄存器的输出总会是偏1或者是偏0,但偏1或者偏0这种情况并不是一个稳态,这种不稳的状态对于后面的触发器来说很容易出现的问题就是不满足建立时间setup和保持时间hold,建立时间setup和保持时间hold的定义是在采样时,数据信号要保持稳定不变,但处在偏1或者偏0的这种状态并不是稳定不变的,因此会引发时序不满足而导致错误的发生。
  打两拍的作用是什么呢?难道打两拍就能让信号稳定,答案是:是的。这主要取决于数字信号的再生特性,如下面图所示,打拍的作用是插入多级反相器,使得不确定信号x,再生到标准的0和1信号,对于单比特信号,01信号的出现时间早一拍或者晚一拍并不会影响系统整体功能,因此处理亚稳态可以使用打拍操作。数字信号的再生特性详细可见数字集成电路书籍。
在这里插入图片描述

2.在同步读写指针时不会出现错误吗

会的,但不影响

在这里插入图片描述
如上图所示,绿色框中打两拍,就是把读指针rptr信号同步到读时钟域wclk中(也就是用wclk将rptr锁住,使之保持稳定),红色框中就是把wptr同步到rclk时钟域下。
接下来分析如果不同步时钟域会发生什么?

  • 不同步时钟域:由于读空和写满信号是由wptr和rptr共同构成的组合逻辑实现的,如果不同步,由于时钟域不同,两个指针一直在变化(尤其快时钟域的指针不断变化),导致读空写满信号一直在变化,因此不论哪一个时钟去采集读空写满信号,都有可能在变化的状态下采集(亚稳态),由此发生错误!
  • 同步时钟域后对于各自的时钟域,读空、写满信号都是稳定的,因此可以在各自的时钟域放心采样。
  • 关于可能出现错误的问题:
    1.快写慢读(写指针变化快,读指针变化慢)
    写满标志:写满信号在快时钟域下发挥作用,因此将读指针同步到快时钟域,一般不会出现问(快时钟打两拍锁存慢信号)
    读空标志:将快的写指针锁存到慢的读时钟域,在锁存之后,写指针可能还在快速变化,但写操作是在写满信号的约束下,不会发生错误。关于读空标志,可能会出现错误,可能出现读空标志出现了,但快速的写又写了一些数据进去,但这在下一次时钟的时候,读空信号又会出现未读空,因此不用担心。
    2.快读慢写(读指针变化快,写指针变化慢)
    分析和上面一样
  • 总结:打两拍的作用是能同步时钟域,将其他时钟域的信号稳定在该时钟域,对于异步fifo,不会影响功能。
  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值