异步FIFO

参考文献为:Clifford的经典论文《Simulation and Synthesis Techniques for Asynchronous FIFO Design》一共有两篇文章。

格雷码和二进制之间的转换:


                                       图1

异步FIFO的设计难点:

1.判断空/满标志

设置一个快要空/快要满,空/满的标志位。

空:“空”信号产生在读时钟域,此时的读指针和写指针完全相同,包括MSB。


:“满”信号产生在写时钟域,此时的写指针追上了读指针,且MSB不同。但是格雷码的“满”状态判断很容易出错,如下图2所示,会出现错误的判断。在读7和写8的地方误判为已经满了,会造成读空,读0和写8是满状态,没有判断会造成溢出。解决办法如下图3所示。还有一种解决方法就是:把地址指针转化为二进制,比较二进制的值。


                                                  图2


                                                    图3

2.不同时钟域的速度问题

当数据从一个较快的时钟域传递到一个较慢的时钟域。wclk>rclk

问题1:同步的格雷码变化了2次,但是只采样到了一次,则同步值发生了多个bit改变,将会造成多比特同步问题吗?

  • 当然不会,因为多比特的同步问题只发生在多个比特同时在一个慢时钟的上升沿发生变化,而格雷码变化了2个比特,意思是在慢时钟上升沿到来之前格雷码就已经发生了一个bit的变化。只有第2个bit在慢时钟的上升沿时间变化。因此不存在格雷码计数器的同步问题。

问题2:因为写时钟域中格雷码变化值比读时钟域快,会不会发生格雷码在快时钟域已经增加到满状态了甚至超过满状态了,还没有检测到“满”,导致FIFO溢出?

  • 不会发生这种情况,因为wclk>rclk,写指针会很快赶上读指针,当写指针和读指针相等的时候,wfull=1,就会停止继续写数据。直到读指针传递过来。
  • 同理读指针也是类似的。
  • 转:不会,因为Overflow和Underflow发生的条件只有一个:就是本时钟域的指针超过了对面时钟域的指针,而从对面时钟域同步过来的指针本来就是对面时钟域指针的延迟,所以本时钟域的指针永远没办法超过对面时钟域同步过来的指针

3.多个比特异步复位问题

转:Reset的问题

    ★读与写时钟域使用的是不同的Reset信号

    ★在reset的时候,FIFO中的数据也被清空,变为无效数据,所以reset是同步的

    ★但是读写两端的set是异步的


转载的文献为:https://blog.csdn.net/u014395662/article/details/79770821

后续的学习计划是:编写验证代码,对设计的正确性进行验证


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页