异步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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2024-02-26 00:00  NoNounknow  阅读(432)  评论(0编辑  收藏  举报