微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 问一个异步fifo中读指针和写指针同步的问题

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

时间:10-02 整理:3721RD 点击:
读指针和写指针随着fifo的深度的不同而有所变化,那么两者是用格雷码也需要同步才能产生空满信号标志,那么两者是如何同步的呢?是不是每一位设计一个同步装置呢?谢谢!



当然是指针的每一位都需要对应的同步电路,因为格雷码每次只有一位翻转,所以不会存在指针输出不一致的问题(多位的亚稳态退出时间可能不一样)。

不是。由于读写时钟异步引起的亚稳态问题是无法消除的,值能尽可能减少它发生的概率,比如使用gray码。格雷码的作用不是同步而是减小亚稳态发生的概率

faint,格雷码的作用是保证每次只有一位的信息翻转,与亚稳态发生概率没有任何关系。减少亚稳态传播的手段是采用基于多级串联触发器的同步电路——一般认为在N个时钟周期内第N+1级触发器进入亚稳态的概率将大大降低(即N越大概率越低)。实际应用中通常采用两级串联触发器作同步电路,少数苛求可靠性的应用会采用更多级的设计。
格雷码主要用于并行信号的传递。如果采用普通二进制编码,那么当指针变化时多个比特位将可能发生信息翻转,由于亚稳态的进入/退出时间可能不一致,这些翻转的比特位在经过并行同步电路之后会在某个时钟周期输出错误的指针值。而格雷码只有一位信息翻转,也就是说只有一位可能会进入/退出亚稳态,因此不会产生类似的错误。

同意frankrick的观点,也就是说如果有很多位同时翻转的话,空满标志产生错误的可能性会很大,而使用格雷码,只有一位变化,那么同步的时候只有一位可能进入亚稳态,这样出现错误的概率会很小,是不是可以这样理解呢?

我的回答确实不妥,当时的主要意思是想说gray码不是用来做同步的,是为了改善由于读写时钟异步所引起的亚稳态,而亚稳态引起对空满的错误判断概率问题。 当时有点心不在焉,不好意思啦,:p。我已经对自己的回复进行了修正。有不妥的地方请继续指出。

学习一下,


嗯....减小信号进入亚稳态的主要措施是串接更多的触发器,因为后一级触发器进入亚稳态的概率(或者说前一级触发器维持亚稳态的概率)随时间的增加而大大降低,因此每增加一级触发器,就多出了一个时钟周期的时间。

回复 #3 wice3 的帖子
gray码也会产生亚稳态,因为gray只有一位变化,当产生亚稳态时重新同步的指针可能是前一个值或者是当前值,这样当fifo同时读写的时候空满标记可能会提早产生,也就是实际fifo不空却产生空标记,或者fifo不满却产生满标记。但这样并不会造成数据错误。但如果计数器不是gray的话,指针计数器可能出现多位变化的情况,当同步的时钟刚好采到变化的边沿时,就会输出一个错误的值,可能既不是计数器的前一个值也不是当前值,这样fifo就进入了错误的状态了

回复 #9 ILvM 的帖子
这样解释更为简单易懂,就是说即使错也只错一位,但这一位并不会对电路有太大的影响

反正即使用了gray码。指针跨时钟域的时候仍然要加同步电路

仅仅依靠格雷码,是完成不了同步的

格雷码和同步电路是两码事儿

正解!

我的经验是FPGA在100M主频以下可以不使用格雷码,保持足够的判断时间就可以了。

学习一下

哪位能否简单讲讲格雷码是什么东东?

哦,明白了!

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

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

比较同意楼上的说法。
gray的亮点就是只有一位翻转,所以即使发生亚稳态也不会导致错误。

异步fifo的读/写时钟不同,将读地址,写地址分别用两个模块实现,这两个模块中分别只有一个时钟。

足够的判断时间是指同步之后等待足够的时间再去使用同步之后的信号吗?
这样的话和主频有什么关系呢,即使超过100M的话,我还是等足够长的时间不就可以了吗。
还有就是“足够的判断时间”怎么确定呢,多长时间是足够的?

thanksgiving!

真格雷码循环的时候只有一位变化,同步后用于判断空满标志,2level-FF后,已经降到很小概率。

另外ASYN FIFO的full和empty都是悲观设计的

看楼上的同学解释了半天,还是有些同学对于格雷码的作用和亚稳态混在一起了。
我的理解是:消除亚稳态很简单,两种方式,其他的,不多做解释。
第一,将一个信号打两拍,无论单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倍?)

新人学习一下~

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top