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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: windzjy

问一个异步fifo中读指针和写指针同步的问题

[复制链接]
发表于 2008-6-18 12:33:33 | 显示全部楼层
我的理解:在异步FIFO中,如果只是采用二进制等的编码作为地址线的比较,则在跨时钟域过程中,由于地址多比特发生变化,导致异步采样后(即使是打两拍),也无法完全避免亚稳态,可能导致采样数据0和1翻转没有正确识别,使得空满标志出错。所以建议采用格雷码(每次只有1bit发生变化),这样即使同样的问题出现(0和1没有被正确识别),被采样得到的数据只是+1 或-1的区别,在地址比较时,仅是可能FIFO 还没有真正满时得到FULL,在还没有真正空时得到EMPTY,并不会使得FIFO进入OVERFLOW和UNDERFLOW。
发表于 2010-6-6 09:50:26 | 显示全部楼层


我的理解:在异步FIFO中,如果只是采用二进制等的编码作为地址线的比较,则在跨时钟域过程中,由于地址多比特发生变化,导致异步采样后(即使是打两拍),也无法完全避免亚稳态,可能导致采样数据0和1翻转没有正确识 ...
yl1012744447 发表于 2008-6-18 12:33



大家都知道用gray码来同步,也知道如果用二进制码来同步会出现同步后的值不一致。有个问题请大家想一想,即使出现不一致(使用二进制同步)的时候真的一定会有问题吗?
举个例子:
rd_addr: 4'b0001
wr_addr: 4'b0011 -> 4'b0100
中间过程有可能是:4'b0011 -> 4'b0001 -> 4'b0101 -> 4'b0100
这时候fifo会出错吗?(即发生overfow或underflow)
我觉得如果能理解这个问题,对于异步fifo中为什么用gray码就完全掌握了。
发表于 2010-6-8 23:30:47 | 显示全部楼层


faint,格雷码的作用是保证每次只有一位的信息翻转,与亚稳态发生概率没有任何关系。减少亚稳态传播的手段是采用基于多级串联触发器的同步电路——一般认为在N个时钟周期内第N+1级触发器进入亚稳态的概率将大大 ...
frankrick 发表于 2007-1-12 23:45



比较同意楼上的说法。
gray的亮点就是只有一位翻转,所以即使发生亚稳态也不会导致错误。
发表于 2010-6-19 00:01:39 | 显示全部楼层
异步fifo的读/写时钟不同,将读地址,写地址分别用两个模块实现,这两个模块中分别只有一个时钟。
发表于 2010-10-22 15:47:57 | 显示全部楼层


我的经验是FPGA在100M主频以下可以不使用格雷码,保持足够的判断时间就可以了。
rhythm1988 发表于 2007-4-6 00:24



足够的判断时间是指同步之后等待足够的时间再去使用同步之后的信号吗?
这样的话和主频有什么关系呢,即使超过100M的话,我还是等足够长的时间不就可以了吗。
还有就是“足够的判断时间”怎么确定呢,多长时间是足够的?
发表于 2010-10-24 22:05:13 | 显示全部楼层
thanksgiving!!!!!!!!!!
发表于 2011-5-23 18:31:36 | 显示全部楼层
真格雷码循环的时候只有一位变化,同步后用于判断空满标志,2level-FF后,已经降到很小概率。
发表于 2011-5-23 18:35:12 | 显示全部楼层
另外ASYN FIFO的full和empty都是悲观设计的
发表于 2011-5-23 23:10:55 | 显示全部楼层
看楼上的同学解释了半天,还是有些同学对于格雷码的作用和亚稳态混在一起了。
我的理解是:消除亚稳态很简单,两种方式,其他的,不多做解释。
第一,将一个信号打两拍,无论单bit或者多半bit,打了两拍之后基本上就可以保证没有亚稳态了(我说基本上,是因为概率已经低到我们有生之年见不到的概率),但是对于多bit的信号,能否保证正确采样就是另外一回事了,这时候就是格雷码的工作了,下面解释。
第二,使用DMUX,在信号缓变的时候可用(缓变指的是需要跨时钟域的信号相对于采样时钟域来说是缓变的)DMUX是使用一个单bit信号,该信号有着和多bit信号同样的变化方式,通过打两拍的方式将该单bit信号同步到采样时钟域中,然后在采样时钟域中使用该同步后的信号去采样多bit总线(注意总线不需要在打拍了,如果总线也打两拍,反而会可能出现采样错误,为什么?大家想想)

ok,打两拍之后,亚稳态都没有了,那么使用bin编码和grey编码有神马区别呢?我们举一个极端的例子。
假如说一个二进制编码的地址如下:
000  0 下一个写地址(此时FIFO非空)
001  1
010  2
011  3
100  4
101  5
110  6
111  7上一个写地址(同时也是读地址)此时FIFO空
当写地址从111跳变到000的时候,采样到读时钟域的时候会变成什么鬼样子?000~111都有可能!!!那么采样到的这个值如果去做比较判断出空或者几乎空就会出错(空和几乎空在读时钟域中产生,为什么?大家思考一下)。这时候如果去读FIFO,就可能出现空的时候报非空而导致读穿的情况。
如果是格雷码会怎样呢?
000  0 下一个写地址(此时FIFO非空)
001  1
011  2
010  3
110  4
111  5
101  6
100  7上一个写地址(同时也是读地址)此时FIFO空
当写地址从7跳变到0的时候,格雷码从100跳变到000,采样的结果只可能是100或者000,无论哪种,同步到读时钟之后,都只会导致出现非空的时候报空,或者在写时钟域的时候,非满的时候报满,但是这样不会出现读穿或者写穿的可能,所以是安全的。
当然,这种异步FIFO也有应用场景,据说是频差2倍以下(或者4倍??)
发表于 2011-7-28 21:53:07 | 显示全部楼层
新人学习一下~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-4-25 16:05 , Processed in 0.027209 second(s), 6 queries , Gzip On, Redis On.

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