FIFO 深度怎么计算?
更新时间:2026-09-21。问题驱动短答页。异步 FIFO 的 Gray 码指针与空满判断见 异步 FIFO 与 CDC,完整推导见 FIFO 深度计算与设计。
一句话回答
FIFO 深度 = 最坏情况下「突发写进来但还没被读走」的最大数据量,即 深度 ≥ 突发周期内写入数 − 同期能读出数,再按工程余量向上取整并凑成 2 的幂(配合 Gray 码指针)。
核心公式
在一个突发窗口内:
bash
depth ≥ B_write − B_read
B_write = 突发拍数 × 写使能占空比
B_read = 同一段时间内读侧最多能取走的个数
= (突发持续时间 / 读时钟周期) × 读使能占空比关键是找最不利场景:写最快、读最慢、读使能空闲最多、且背靠背(back-to-back)突发连续到来。
一个典型例子
写时钟 100MHz、每拍都可写;读时钟 50MHz、10 个读周期里只有 8 个允许读。突发为连续 40 个写周期背靠背:
- 写入:40 个数据。
- 突发耗时 40/100MHz = 400ns,期间可读 400ns/20ns = 20 个读周期,取走 20×(8/10)=16 个。
- 积压 ≈ 40−16 = 24,取整并留余量,深度取 32。
工程注意
- 突发模型要和上游协议一致:AXI 要按最大 burst 长度与 outstanding,视频行/帧按一行像素数,别用平均速率掩盖突发。
- 加余量:时钟抖动、读写相位、空满判断的保守边界都会让有效容量略小,通常 +10%~25% 并向上取 2 的幂。
- 不是越深越好:FIFO 用寄存器/BRAM 实现,深了浪费面积、增加延迟;够用即可。
- 空满是保守的:异步比较指针存在跨域延迟,可能「实际未满却报满」,属正常安全边界。
常见坑
- 只用平均读写速率算深度:平均够不代表突发不溢出,必须按最坏突发。
- 忘记读使能/写使能不是 100%:要乘占空比。
- 忽略背靠背突发与相位最差对齐。
- 深度不取 2 的幂又自己写指针:二进制指针跨域会出错,标准做法是 Gray 码 + 2^n 深度。
- 满了还写(上溢)、空了还读(下溢):靠上游反压/valid-ready 握手防止数据丢/重。
总结
FIFO 深度按最坏背靠背突发期间的净积压估算:突发写入数减去同时间读侧最多能取走的数,读写两侧都要乘各自的使能占空比并取时钟相位最差对齐,再留 10%~25% 余量向上凑成 2 的幂以配合 Gray 码指针;必须基于突发模型(如 AXI 最大 burst、视频行长)而非平均速率,深度过大会浪费 BRAM、过小则上溢,空满标志因跨域比较天然偏保守,最终还要靠反压握手避免满写空读。