异步FIFO的笔记:深度、格雷码
FIFO的设计关键在于:亚稳态的消除和空满标志的判断;
只要不是空,就可以读,只要不是满,就可以写;
使用gray码进行编码,如何判断异步FIFO空满?是否有漏洞? - 知乎 (zhihu.com)
【FIFO漫谈】异步FIFO·格雷码与跨异步 - 知乎 (zhihu.com)
异步FIFO相对于同步FIFO最大的不同:考虑到多个时钟域的处理。
这导致了读写指针处于不同的时钟域,计算起来更加复杂了。
因为读写指针处于不同时钟域,我们常会遇到这个问题:即读写指针可能会被对方”追上“的问题;
为了解决这个问题,我们需要加入标志信号来解决,这个标志信号一般位于指针的MSB,用于表示回折次数,所以实际上地址指针的位宽需要比实际大一位;
---------------------------------------------
指针
写000 读000
写满:写1000 读000 输出满
读1 :写1000 读001 低位不等,满信号拉低
读空:写1000 读1000:输出空
写1:回折拉低
写0000 读1000
读1 写0000 读0000 输出空;
回折拉高,低位对齐:输出满;
全部相等:输出空;
---------------------------------------------
格雷码
但,这个时候仍有问题,即向不同的时钟域传递信息存在着亚稳态的问题。
这个时候需要引入格雷码;
格雷码连续位的变化只改变一位,能够减小亚稳态出现的概率;
简便的格雷码转换方法:
右往左异或;
格雷码的编码方式使得他的空满信号判断和二进制计数有差异,
其中空信号判断相同:全等,而满信号判断要复杂很多:
需要满足:MSB不同,次高位不同,其他相同。
格雷码作为传递读写指针的编码方式,仅在深度为二次幂的时候生效,这一点在Xilinx FIFO的Config里面有所体现。
---------------------------------------------
FIFO深度的计算
FIFO深度的计算:
背靠背:传输一段数据结束连续传输下一段数据
基本场景:
depth = burst_length - [(brust_length)/(wclk)]x(rclkx(x/y))
复杂场景:
主体思想:写完一个brust的时间内,能够读走的数据,用brust减去这部分数据的个数就是最小深度。
史上最细的FIFO最小深度计算,(大多数笔试题中都会涉及)_fifo最小深度计算公式-CSDN博客
PPT