凡亿助教-小满
凡事用心,一起进步
打开APP
公司名片
凡亿课堂 | 面试指南
当前位置: 首页 面试指南
FPGA异步FIFO设计的原理和注意事项
浏览量:328
2026-08-12 10:02:35
分类:FPGA设计经验级别:中级难度:★★★★☆
FPGA异步FIFO设计示意图

异步FIFO是FPGA面试中几乎必问的题目。它的核心作用是在两个不同时钟域之间安全地传输数据,解决跨时钟域的数据同步问题。面试官考察的不只是你能不能说出它的用途,更看重你对空满判断、格雷码编码、亚稳态处理这些细节的理解。

什么是异步FIFO

简单来说,FIFO就是先进先出的数据缓冲区。异步FIFO的特点是读时钟和写时钟来自不同的时钟域,两者之间没有固定的相位关系。这和同步FIFO(读写共用一个时钟)是最根本的区别。

双口RAM
存储介质,支持同时读写
格雷码
指针编码,每次只跳1位
两级同步
降低亚稳态传播概率
空满标志
保护FIFO不越界

为什么要用格雷码指针

这是面试中的高频问题。如果用普通二进制指针跨时钟域传递,多位同时翻转时很容易出现中间态,导致采样到错误的指针值。比如四位二进制从0111变到1000,四位全跳变,实际电路中不可能同时翻转,中间会出现各种暂态值。

格雷码的特点是相邻两个数之间只有一位不同。这样指针递增时,每次只有一位信号翻转,跨时钟域采样时即使出现亚稳态,也不会出现偏离正确值很远的错误指针,最多就是判断为"没变",属于保守的、安全的错误。

空满判断逻辑

空和满的判断是异步FIFO设计的核心难点。直接比较读写指针会有问题:空的时候读写指针相等,满的时候读写指针也相等(绕了一圈回来了),怎么区分?

状态指针关系判断方法在哪个时钟域判断
空读指针 == 同步后的写指针完全相等读时钟域
满写指针 == 同步后的读指针 且 MSB不同高两位相反,其余相同写时钟域

实际工程中常用的做法是给指针多扩展一位(MSB)。当写指针比读指针多跑了一圈,最高位就会不同。具体来说:格雷码下,满的条件是写指针和同步过来的读指针的高两位相反、其余位都相同;空的条件是两者完全相等。

两级同步器的作用

跨时钟域传递单比特信号时,标准做法是用两级寄存器同步(打两拍)。它不能消除亚稳态,但能大大降低亚稳态向后级电路传播的概率。第一级寄存器可能进入亚稳态,但在一个时钟周期内(只要MTBF足够大)大概率能稳定下来,第二级就能采到稳定的值。

面试延伸问:什么时候用三级同步?当时钟频率特别高、或者工艺节点比较差、MTBF不满足要求时,会用到三级甚至更多级。一般低速设计中两级就够了。

FIFO深度怎么计算

这也是常见的面试计算题。基本思路是:写速率比读速率快的那段时间内,积压的数据量就是需要的最小深度。实际计算要考虑突发长度、读写时钟频率比、数据宽度等因素。面试时一般不会让你现场算很复杂的,但基本思路得说清楚。

常见面试问题汇总

  1. 异步FIFO和同步FIFO的区别? 时钟域数量不同,异步的读写各自由不同时钟驱动。

  2. 为什么指针用格雷码不用二进制? 多位同时翻转容易采样错误,格雷码每次只跳一位,更安全。

  3. 空满标志为什么在不同时钟域判断? 空标志在读域判断(读侧关心能不能读),满标志在写域判断(写侧关心能不能写),保证安全性。

  4. 亚稳态能消除吗? 不能完全消除,只能通过同步器降低其传播概率,提升MTBF。

  5. FIFO深度怎么估算? 考虑最坏情况下写入速率减去读出速率乘以持续时间,再留一定余量。

核心关键词

异步FIFO、格雷码指针、跨时钟域、亚稳态、两级同步器、空满判断、双口RAM、FIFO深度计算、MTBF、Verilog


声明:本网站所收集的部分公开资料来源于互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。仅供学习交流使用,不构成商业目的。版权归原作者所有,如果您发现网站上有侵犯您的知识产权的作品,请与我们取得联系,我们会及时删除。 侵权投诉

相关文章

STM32定时器PWM输出怎么配置与死区设置

2026-08-19 09:50:39

HR常用通用面试问题和答案汇总

2023-09-10 20:07:43

FPGA面试:定点数为什么越算位宽越长?截断、舍入和饱和怎么控制量化误差

2026-10-20 21:55:05

EMC测试前,PCB布局阶段的分区和接地策略能提前避免多少辐射问题?面试要从能量路径讲起

2026-08-01 21:54:57

STM32 ADC多通道采样怎么配置与校准?规则组、扫描模式与DMA怎么做?嵌入式面试

2026-09-13 21:25:31