FPGA面试:异步FIFO如何解决跨时钟域数据传输?为什么要使用格雷码指针?
两个模块使用不同频率、不同相位的时钟时,不能简单把多位数据总线逐位打两级触发器就认为完成了跨时钟域。异步FIFO是处理连续数据流的常用结构。
FPGA面试:异步FIFO如何解决跨时钟域数据传输?为什么要使用格雷码指针?
面试回答
异步FIFO通常使用双口存储器保存数据,写端和读端分别在自己的时钟域维护指针。指针在本地用二进制计数,跨时钟域传递前转换成格雷码,再通过同步触发器送到另一时钟域,用于判断FIFO的满和空。格雷码相邻状态通常只有一位发生变化,可以降低多位二进制指针同时变化时被异步采样造成的不一致风险。
01数据和指针分开处理
写时钟域负责写入数据、更新写指针;读时钟域负责读取数据、更新读指针。数据本身保存在双口RAM或专用FIFO存储结构中。
写指针和读指针各自在本地时钟域更新。跨时钟域同步的是经过编码的指针信息,而不是把整条多位数据总线逐位同步。
02为什么使用格雷码
普通二进制计数器从一个状态跳到下一个状态时,可能同时有多位发生变化;异步采样时,不同位可能在不同时间稳定,导致接收端读到不一致的组合。
格雷码相邻计数状态只有一位变化,经过两级同步触发器后,接收时钟域可以更可靠地观察指针变化,并据此计算满、空状态。
同步器只能降低亚稳态传播概率,并不能让亚稳态从物理上消失;格雷码总线还需要按设计约束控制位间偏斜。
03工程实现中的检查点
满空标志应使用同步到本时钟域的对侧指针计算,不能直接跨域读取对方的二进制指针。
复位释放要考虑两个时钟域各自的同步过程;读写时钟停止、频率变化或复位顺序异常时,也要验证FIFO状态能否正确恢复。
多位数据跨域不要简单对每一位各加两级触发器,这不能保证数据字整体一致。
只记住“异步FIFO用了双口RAM”,却说不清为什么指针要转格雷码、为什么满空标志需要在本地时钟域判断,以及同步器的作用边界。
如果读时钟远快于写时钟,或者写时钟突然停止,异步FIFO的满空标志和数据读取需要注意什么?
相关业务入口
了解电子硬件设计与PCB工程实战课程

扫码关注































