异步FIFO是FPGA面试中几乎必问的题目。它的核心作用是在两个不同时钟域之间安全地传输数据,解决跨时钟域的数据同步问题。面试官考察的不只是你能不能说出它的用途,更看重你对空满判断、格雷码编码、亚稳态处理这些细节的理解。
什么是异步FIFO
简单来说,FIFO就是先进先出的数据缓冲区。异步FIFO的特点是读时钟和写时钟来自不同的时钟域,两者之间没有固定的相位关系。这和同步FIFO(读写共用一个时钟)是最根本的区别。
为什么要用格雷码指针
这是面试中的高频问题。如果用普通二进制指针跨时钟域传递,多位同时翻转时很容易出现中间态,导致采样到错误的指针值。比如四位二进制从0111变到1000,四位全跳变,实际电路中不可能同时翻转,中间会出现各种暂态值。
格雷码的特点是相邻两个数之间只有一位不同。这样指针递增时,每次只有一位信号翻转,跨时钟域采样时即使出现亚稳态,也不会出现偏离正确值很远的错误指针,最多就是判断为"没变",属于保守的、安全的错误。
空满判断逻辑
空和满的判断是异步FIFO设计的核心难点。直接比较读写指针会有问题:空的时候读写指针相等,满的时候读写指针也相等(绕了一圈回来了),怎么区分?
| 状态 | 指针关系 | 判断方法 | 在哪个时钟域判断 |
|---|---|---|---|
| 空 | 读指针 == 同步后的写指针 | 完全相等 | 读时钟域 |
| 满 | 写指针 == 同步后的读指针 且 MSB不同 | 高两位相反,其余相同 | 写时钟域 |
实际工程中常用的做法是给指针多扩展一位(MSB)。当写指针比读指针多跑了一圈,最高位就会不同。具体来说:格雷码下,满的条件是写指针和同步过来的读指针的高两位相反、其余位都相同;空的条件是两者完全相等。
两级同步器的作用
跨时钟域传递单比特信号时,标准做法是用两级寄存器同步(打两拍)。它不能消除亚稳态,但能大大降低亚稳态向后级电路传播的概率。第一级寄存器可能进入亚稳态,但在一个时钟周期内(只要MTBF足够大)大概率能稳定下来,第二级就能采到稳定的值。
FIFO深度怎么计算
这也是常见的面试计算题。基本思路是:写速率比读速率快的那段时间内,积压的数据量就是需要的最小深度。实际计算要考虑突发长度、读写时钟频率比、数据宽度等因素。面试时一般不会让你现场算很复杂的,但基本思路得说清楚。
常见面试问题汇总
异步FIFO和同步FIFO的区别? 时钟域数量不同,异步的读写各自由不同时钟驱动。
为什么指针用格雷码不用二进制? 多位同时翻转容易采样错误,格雷码每次只跳一位,更安全。
空满标志为什么在不同时钟域判断? 空标志在读域判断(读侧关心能不能读),满标志在写域判断(写侧关心能不能写),保证安全性。
亚稳态能消除吗? 不能完全消除,只能通过同步器降低其传播概率,提升MTBF。
FIFO深度怎么估算? 考虑最坏情况下写入速率减去读出速率乘以持续时间,再留一定余量。
核心关键词
异步FIFO、格雷码指针、跨时钟域、亚稳态、两级同步器、空满判断、双口RAM、FIFO深度计算、MTBF、Verilog

扫码关注





























