前言
在之前我们已经聊过乒乓操作的本质,但如果真正要在工程里落地,一个绕不开的问题就是:缓存大小到底该怎么定?
缓存设计看似只是“多放点数据”,但如果过小,就可能因为上下游速率不匹配而造成丢包;如果过大,又会带来资源浪费和延迟增加。乒乓缓存的大小,其实取决于系统数据流的特性、上下游接口的速率差,以及处理链路中的延迟。
乒乓操作的本质
乒乓操作就是双缓冲切换:
- • 当 A buffer 正在被读时,B buffer 正在写;
- • 当 B 写满后,切换过去读 B,写 A。
所以至少要保证 单个缓冲区足够容纳一帧/一批次数据,否则无法切换。
因此最基本的缓存大小:
单缓冲大小最大一帧数据量
总缓存池大小单缓冲大小
数据流速率匹配
- • 上游写入速率:数据源进入FPGA的速率(例:ADC、PCIe、DMA、以太网)。
- • 下游读取速率:FPGA处理或写出数据的速率。
- • 乒乓缓冲的作用就是在 上游快/下游慢 或 上游突发/下游均匀 时,保证数据不会丢失。
计算公式思路
输入速率输出速率最长速率不匹配时间
如果两端速率相等(理论上),那只需要覆盖处理延迟就够了。
总线突发传输
- • 如果你的数据通过 AXI、PCIe、DDR 等突发传输接口搬运,必须考虑 突发长度。
- • 缓冲池至少要能覆盖一个 最大突发长度,避免拆分造成效率下降。
处理延迟 (Latency)
- • 如果 FPGA 内部处理 pipeline 有延迟,缓存必须能“撑住”这段延迟时间。
- • 举例:上游连续写,FPGA需要等某个计算完成才能输出,就要准备足够的 buffer 以存放这段时间的数据。
系统设计习惯
- • 通常会加 安全裕量 (headroom) ,一般取 1.2× ~ 2× 理论值。
- • 如果外设时钟域不同,buffer 还要能吸收 时钟抖动/漂移 带来的速率差。
EXAMPLE
假设一个场景:
- • 数据源:ADC → FPGA,速率 200 MB/s
- • 下游接口:PCIe DMA,平均速率 180 MB/s
- • 速率差:20 MB/s
- • 可能出现的最大突发时间:10 ms
计算:
一个 buffer 至少 0.2 MB,那乒乓就需要 0.4 MB,再加裕量,大约取 1 MB 比较。
写在最后
乒乓缓存的大小没有固定答案,它更多取决于系统本身的特性。一般来说,设计时需要综合考虑以下几个方面:
- 1. 单帧数据大小 —— 确保一次完整切换不被打断。
- 2. 上下游速率差 × 最大突发时间 —— 吸收速率不匹配带来的数据积压。
- 3. 总线突发特性 —— 保证突发传输的效率与完整性。
- 4. 处理延迟 —— 缓存要能撑住内部流水线或处理等待时间。
- 5. 安全裕量 —— 预留一定冗余,避免极端情况下出问题。
总而言之,乒乓缓存的大小设计,就是在性能、可靠性与资源利用率之间寻找平衡点。