跨时钟域FIFO的老话题:快时钟域的地址信息如何同步到慢时钟域?

跨时钟域FIFO的老话题:快时钟域的地址信息如何同步到慢时钟域?

昨天面试被问题这个问题,面试官问译码FIFO的关键技术如何解决?

我当时以为理解的没问题,就按照Clifford Cummings的论文上来讲。关键技术在于处理译码读写时钟域的地址信息,产生空满信号。解决方法是使用同步器降低亚稳态,使用格雷码保证每次只变1位,即使采错也是+1或-1的问题,不会造成致命错误。

但那个面试官就说,如果两个时钟相差很大,怎么保证快时钟域的信号传递到满时钟域?

我说需要在快时钟域进行信号宽带的展宽,保证被慢时钟域采到。

接着他就问,那FIFO两侧不能这样做吧,怎么保证快时钟域的地址被慢时钟域采到?会不会出现问题?

我就蒙了,感觉有问题,但觉得应该没问题。。。。就说没问题,但不知道为什么?

希望明人指点~~~~


本帖最后由 vongy 于 2012-10-26 17:00 编辑

我觉得既然是FIFO,就一定满足满了就不能再写,空了就不能再读这一个前提。
假设我们说写的时钟很快,而读的时钟很慢,那满标志的判断就得利用到从读时钟域同步过来的读地址,这是一个从慢到快的同步,就不说了。
空标志的判断需要将写时钟域的地址同步到读时钟域,因为写时钟很快,所以写地址的变化也很快,但无论变化得多快,一定是写到满为止。那同步到读时钟域的写地址到底是哪一个呢?我想这个没办法确定,也不需要确定,但唯一能确定的就是用传到读时钟域的写地址做空标志的运算,不会造成空读这种现象,原因是当某个写地址传到读时钟域后,写地址的当前值一定是大于或等于传递过去的写地址(我这里想说明的是FIFO中有多少数据,不是做地址大小的比较)。
所以从快到慢,这里是不需要展宽的,也不需要关于慢时钟到底采到了哪一个写地址。
因为使用了gray码,一次只有一位数据发生了变化,所以假设因为亚稳态出现了采错的情况,也不会发生任何错误(不是楼主说的不会发生致命错误,我想只要是这里发生了错误,就一定是致命的),可以这样分析原因,产生亚稳态的条件,数据在setup-hold time的时间窗内发生变化,无非是从0变到1,或从1变到0这两种情况,以从0变到1为例说明,如果因为亚稳态采到了0,那传递到慢时钟域的就还是上一个地址,如果采到了1就是正确的,想要的当前地址,一定不会采到下一个地址去,从1到0也是一样的情况。
不需要展宽信号,如果从快到慢同步,不管时钟相差多大,同步过来的指针总是滞后于实际指针,因此最多造成虚空虚满,不会有问题的。

原文地址:http://bbs.eetop.cn/thread-357548-1-1.html



  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值