微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于异步FIFO中的信号同步问题以及格雷码

关于异步FIFO中的信号同步问题以及格雷码

时间:10-02 整理:3721RD 点击:
      最近学异步FIFO时有问题没弄懂:                                                                                                            (1) 关于空满信号同步,我理解的是:在异步FIFO中,因为满信号决定能不能写入,写时钟到来时,先判断是否满,若不满才发出写请求,所以需要将满信号与写时钟同步。满信号从不满(0)变成满(1)是由写入操作导致的,所以本身就和写时钟同步。从满(1)变成不满(0)是读操作导致的,所以要和写时钟同步。空信号同理。不知道这样理解对不对?还有没有其他原因导致必须同步?                                                                                                                                               (2)关于使用格雷码:网上很多异步FIFO的程序中都提到要使用格雷码,但是他们都是使用二进制计数器,再将结果转换成格雷码,那这样在二进制计数器中计数时还是会造成多位反转,那转换成格雷码不是没有意义了?                                         谢谢!

最近刚好学完异步FIFO,谈谈我的见解:
首先,异步FIFO的读写时钟是分开的,属于两个不同的时钟域,因此对于满状态的判断,具体操作上得先将工作于读时钟的读地址指针同步到写时钟域,而一般同步所用的方法无非是通过写时钟域的寄存器打两个节拍,这种跨时钟域的数据传输有着误判的问题,而采用格雷码的好处在于即便误判差错也只有1位,特别是在引入预留多位阈值的即将满信号会很有用,极大降低数据溢出的风险。空信号同理
可以看看一些书上的讲解,如《FPGA深度解析》第九章 异步FIFO原理和使用

(1) 空满信号是通过比较读写地址而得来的,而读写地址分别属于不同的时钟域,所以要对地址信号进行跨时钟域同步后才能比较。
(2) 二进制计数器产生的是本时钟域的读(写)地址,对本时钟域来说是同步的,多位变化不会有问题。转化成格雷码是用来处理异步时钟域之前同步多位地址的,我理解的使用格雷码的好处主要有两点:
一是降低亚稳态出现的概率,因为同步多个异步信号出现亚稳态的概率远远大于同步一个异步信号的概率;
二是可以防止误判断,因为地址信号有多位,每一位的延迟可能不同,即地址变化时每一位的跳变时刻可能不同,会出现错误数值,若此数值被采样则可能发生误判断。比如使用二进制地址时由‘1(001)’跳变为‘2(010)’,则有可能出现暂态‘3(011)’,导致误判断,而使用格雷码就不会有这种情况。

感谢分享,希望真的有用!

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

网站地图

Top