3. 写时钟快于读时钟(无空闲周期):深度公式与最坏情况分析

好,咱们进入第三个经典场景。写时钟比读时钟快,而且两边都不停——每个时钟周期都在读写。这可能是面试里被问得最多的情况了。我个人习惯把这种场景叫做“一边倒”模式,因为数据只会越积越多。

3.1 先理解问题本质

说白了,这就是个“进水快、出水慢”的问题。写时钟频率 f_w 大于读时钟频率 f_r,每个周期都写一个数据,每个周期都读一个数据。你想想看,进来的多出去的少,FIFO 里肯定要存数据。

那问题来了:到底需要多深的 FIFO,才能保证数据不丢?

嗯,这里要注意。我们讨论的是“无空闲周期”,也就是读写使能一直有效。实际项目中很少这么理想,但作为理论分析,这是最基础的模型。

3.2 深度公式推导

咱们一步步来。假设你要传输 N 个数据,写时钟周期是 T_w,读时钟周期是 T_r。那么:

  • 写完 N 个数据需要的时间:T_write = N × T_w
  • 在这段时间里,读走了多少个数据?N_read = T_write / T_r = N × (T_w / T_r)
  • 那 FIFO 里剩下的数据量:Depth = N - N_read = N × (1 - T_w / T_r)

因为频率和周期成反比,T_w / T_r = f_r / f_w,所以:

深度公式:Depth = N × (1 - f_r / f_w)

其中 N 是连续写入的数据总量,f_w 是写时钟频率,f_r 是读时钟频率。

我在项目中遇到过类似的计算。有一次做视频处理芯片,像素时钟 150MHz,输出时钟 100MHz,一帧图像有 1920×1080 个像素。当时我直接用这个公式算出了需要的 FIFO 深度,省了不少仿真时间。

3.3 最坏情况分析

公式有了,但咱们得聊聊“最坏情况”。为什么会这样?因为公式里的 N 不是随便取的。

最坏情况发生在:

  • 连续写入的数据量最大:比如一次突发传输(burst)的长度达到最大值
  • 读写频率比最悬殊:f_w 远大于 f_r,差距越大,需要的深度越大
  • 读使能没有提前拉高:如果读使能晚几个周期才有效,那数据堆积会更严重

我曾经踩过一个坑。有个项目里,我以为最坏情况就是连续写 1024 个数据,按公式算深度够了。结果仿真发现 FIFO 溢出了。查了半天才发现,读使能在复位后延迟了 10 个周期才拉高,这 10 个周期里数据全堆在 FIFO 里了。

避坑指南:计算深度时,一定要把读写使能的延迟、复位后的初始状态考虑进去。我曾经因为忽略了这个,多花了两天改代码。

3.4 实际工程中的修正

理论公式是基础,但实际用的时候我建议做两件事:

  1. 加裕量:算出来的深度再乘以 1.2 到 1.5。别问为什么,问就是经验。时钟抖动、工艺偏差、温度变化都会影响实际频率。
  2. 考虑异步处理:写时钟和读时钟是异步的,跨时钟域同步需要额外的深度。我记得有个项目,同步用了两级寄存器,相当于多占用了 2 个深度位置。

个人习惯:我一般会在公式结果上加 4 到 8 个深度作为安全余量。如果面积允许,多留点总没错。

3.5 举个例子

假设写时钟 200MHz,读时钟 100MHz,一次突发写 256 个数据。算一下:

参数 值
f_w 200 MHz
f_r 100 MHz
N 256
Depth = 256 × (1 - 100/200) 128
加 20% 裕量 约 154
取 2 的幂次 256(实际选 256 深度)

你看,理论算出来 128,实际我选了 256。为什么?因为 2 的幂次方便地址回绕,而且多出来的深度可以应对突发情况。这就是工程思维和纯理论的差别。

3.6 知识体系图

下面这张图帮你理清这个场景的核心逻辑:

写时钟快于读时钟(无空闲周期)知识体系 问题描述 写时钟 f_w > 读时钟 f_r 每个周期都读写 数据只进不出? 核心公式 Depth = N × (1 - f_r/f_w) N:连续写入数据量 f_r/f_w:读写频率比 工程实践 加裕量 1.2~1.5 倍 考虑异步同步深度 取 2 的幂次 最坏情况分析 ① 突发传输长度最大 ② 读写频率比最悬殊 ③ 读使能延迟 三者叠加时,FIFO 深度需求达到峰值 避坑指南 不要忽略复位延迟和使能抖动,仿真时务必覆盖最坏情况时序

3.7 小结

写快读慢的场景,公式其实不复杂。但真正考验人的是对“最坏情况”的理解。我见过不少工程师,公式背得滚瓜烂熟,一到实际项目就翻车。为什么?因为他们没把使能延迟、复位时序这些细节算进去。

记住一句话:理论算深度,工程加余量,仿真验边界。这三步走下来,你的 FIFO 设计基本稳了。

核心要点:

  • 深度公式:Depth = N × (1 - f_r/f_w)
  • 最坏情况:最大突发 + 最大频率差 + 使能延迟
  • 工程建议:加 20%~50% 裕量,取 2 的幂次

可可精品资料库