在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 29174|回复: 46

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

[复制链接]
发表于 2012-10-25 14:39:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

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

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

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

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

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

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

希望明人指点~~~~
发表于 2012-10-26 11:14:19 | 显示全部楼层
要使用hand shake 機制,通過一訊號傳達溝通
 楼主| 发表于 2012-10-26 14:45:31 | 显示全部楼层
回复 2# IceXmas

不要忘了 这是在FIFO里 地址有可能一直变 握手来得及吗?
发表于 2012-10-26 16:57:42 | 显示全部楼层
本帖最后由 vongy 于 2012-10-26 17:00 编辑

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




    现在有个问题就是,格雷码是保证相邻两个数字只有一位跳变,那么有个问题:从快时钟域过渡到慢时钟域的地址,不一定能保证慢时钟前后两拍所采到的是两个相邻的地址的值,有可能慢时钟采到一拍来自快时钟域的地址之后,在慢时钟的下一个有效沿到来之前,快时钟域的地址已经跳变了几次了,这样慢时钟所采到的地址也可能同时变化了好几位,这样做格雷码转换就失去意义了。。。。。。。这个问题一直困扰着我
发表于 2012-10-27 16:59:16 | 显示全部楼层
回复 7# arccosx

1. 快时钟域地址变化很快,但我想在某一个时刻慢时钟域只能采到其中的一个地址,把这个地址传到慢时钟域,这个过程跟用什么编码没有关系,无论是gray code还是bin code都是一样的。2. 对于多bit数据,gray code只是能降低整个数据因发生亚稳态而采到数据的范围。举个例子,如果使用二进制编码,4'b1111跳变到4'b0000,因为4根数据线都在发生变化,都可能产生亚稳态,在这种情况下,采到的数据可能值范围是0x0~0xf。
假设使用gray code, 4'b1111跳变到4'b1110,只有一根数据线在发生变化,如果发生亚稳态采到的数据范围仅限于0xf和0xe这两个值,因为其它三根线没有发生变化,所以不会产生亚稳态。
所以我觉得gray code的意义在于慢时钟采到当前的数据时发生亚稳态的几率,而不是因为快时钟域内地址变化很快导致慢时钟两次采到的数据不是相邻的,这之间没有什么关系,慢时钟某一时刻只能采到一个值,但我们不希望慢时钟在采数据的时候这个数据的每一个bit都在变化,所以相邻可以理解为相邻两个时钟沿之间的数据变化,而不是具体的数据值。
看一下这样解释gray code的意义您能不能理解。
发表于 2012-10-29 08:08:16 | 显示全部楼层
继续关注~
发表于 2012-10-29 10:50:02 | 显示全部楼层
回复 8# vongy


    谢谢热心的指教。我的问题主要是这个意思:格雷码是保证二进制情况下相邻的两个数字只有一位跳变,例如从011到100,格雷码分别是010和110,这样没什么问题。但是我困惑的是,从快时钟域过度到慢时钟域的时候,假设慢时钟采第一拍的时候,快时钟域的地址是011转换为格雷码是100,当慢时钟采第二拍的时刻,快时钟域的二进制地址已经变成101而不是与011相邻的数(010或者100),这个时候转换成格雷码的值就是111了,也就是说慢时钟域第一拍采到的格雷码值为100,而第二拍采到的值为111,同时跳变了两位,这样在我看来格雷码就失去意义了,我很困惑。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-28 18:28 , Processed in 0.043702 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表