欢迎关注个人公众号摸鱼范式
异步FIFO
参考资料为Clifford E. Cummings的论文。
1.0 摘要
异步FIFO是一种FIFO设计,数据从一个时钟域进入到FIFO,在另一个时钟域读取数据,并且两个时钟域是异步。
异步FIFO的用于将数据从一个时钟域安全准确地传递到另一个时钟域。
设计异步FIFO的方法有很多,其中也有很多错误的设计方法。这些不正确的设计方法,在90%的时间内都能够正确运行,而大多数正确的设计方法能够保证在99%的时间中能够正确运行。不幸的是,在99%以上的时间中都能正常工作的FIFO也具有设计缺陷,这些缺陷通常最难检测和调试(如果你很幸运地在产品出厂前就注意到了此错误),或者诊断和召回的代价很高(直到产品由不满意的客户掌握之前才发现)。
本文讨论了一种FIFO设计风格,以及进行异步FIFO设计时必须考虑的重要细节。
下文将“异步FIFO”简称为“ FIFO”
2.0 传递多个异步信号
将多个信号从一个时钟域同步到另一个时钟域,并确保所有的信号都同步到新时钟域中的同一时钟周期这是一个关键问题。 FIFO在设计中用于将多位数据从一个时钟域安全地传递到另一个时钟域。 通过一个时钟域中的控制信号将数据存入FIFO缓存中,并通过来自第二时钟域的控制信号将数据从同一FIFO缓存的另一个端口中读取并删除。 看上去,设计FIFO似乎很容易。
FIFO设计的难点在于生成FIFO指针以及FIFO上的满和空状态确定。
2.1 同步FIFO指针
对于同步FIFO设计(在同一时钟域中执行FIFO读写操作),一种实现方式是对FIFO的写入和读取次数进行计数,递增(以FIFO写入但不读取) ),递减(在FIFO读取但无写入时)或保持(无写入和读或同时进行写入和读取操作)FIFO计数值。 当FIFO计数器达到预定的最大值时,FIFO为满,而当FIFO计数器为零时,FIFO为空。
不幸的是,对于异步FIFO设计,不能使用增减FIFO填充计数器,因为将需要两个不同的异步时钟来控制计数器。 异步FIFO设计的满状态和空状态,必须通过比较写指针和读指针确定。
2.2 异步FIFO指针
为了理解FIFO设计,需要了解FIFO指针是如何工作的。写指针总是指向下一个要写的字;因此,在复位时,两个指针都设置为零,这也恰好是下一个要写入的FIFO字位置。在FIFO写入操作中,将数据写入指针所指向的位置,然后将写指针递增以指向要写入的下一个位置。同样,读取指针始终指向要读取的当前FIFO字。再次复位时&#x