使用Verilog HDL 实现异步FIFO 设计与实现 FIFO 读写 时序 在现代IC 设计中,特别是在模块与外围芯片的通信设计中,多时钟域的情况不可避免
当数据从一个时钟域传递到另一个域,并且目标时钟域与源时钟域不相关时,这些域中的动作是不相关的,从而消除了同步操作的可能性,并使系统重复地进入亚稳定状态[1]
在有大量的数据需要进行跨时钟域传输且对数据传输速度要求比较高的场合,异步FIFO是一种简单、快捷的解决方案
异步FIFO 用一种时钟写入数据,而用另外一种时钟读出数据
读写指针的变化动作由不同的时钟产生
因此,对FIFO 空或满的判断是跨时钟域的
如何根据异步的指针信号产生正确的空、满标志,是异步FIFO 设计成败的关键
本文提出一种新颖的异步FIFO 设计方案,它通过先比较读写地址并结合象限检测法产生异步的空/满标志,再把异步的空/满标志同步到相应的时钟域
通过仿真验证,该方法是稳定有效的
1 异步信号传输问题的分析 在一个ASIC 或 FPGA 库 中,每 种触 发 器 都 有时序要求
对于 使用上升 沿 触 发 的触 发 器 来 说 ,建 立 时间 (Setup Time)是在时钟上 升 沿 到来 之前 ,触 发 器 数据保 持 稳定的最 小 时间 ; 而保 持 时间 (Hold Time)是在时钟上 升 沿 到来 之 后 ,触 发 器 数据还 应该保 持 的最 小 时间 [2]
如图 1 所示,在时钟上升沿前后的这个窗口内数据应该保持不变,否则会使触发器工作在一个不确定的状态,即亚稳态
当触发器处于亚稳态,且处于亚稳态的时间超过了一个时钟周期时,这种不确定的状态将会影响到下一级的触发器,最终导致连锁反应,从而使整个系统功能失常
当一个信号跨越某个时钟域时,对新时钟域的电路来说它就是一个异步信号
由于异步信号之间的时序是毫无关系的,因此必然存在Setu