FPGA · Bank乒乓 · 双缓冲
一帧图像还没写完,
下一帧已经来了?
Bank乒乓把读写冲突拆成两个时段
双缓冲让生产者和消费者并行,交换边界决定数据是否完整
Bank 乒乓用两个存储区轮换角色:写端填充一个 Bank 时,读端从另一个 Bank 取走完整数据;在帧、行或数据块边界,双方确认后再交换。它解决的是读写并发与数据一致性,不是自动提高存储器速度。
摄像头仍在写当前帧,显示端已经开始读取;如果两边访问同一块缓存,画面可能上半部分来自新帧、下半部分还是旧帧。
Bank 乒乓通过两块缓冲把写入和读出分开:一个负责接收新数据,另一个保持完整旧数据供消费。真正难点不在地址多一位,而在什么时候交换所有权。
一、单缓冲为什么容易发生读写冲突生产者和消费者速率不完全一致时,同一块存储区可能一边被覆盖、一边被读取。读端拿到的数据来自不同时间片,形成撕裂、重复或局部更新。
通过仲裁强制一方等待可以避免同时访问,但吞吐会被压低,实时视频、采集和数据搬运更容易错过边界。
二、Bank乒乓怎样把冲突拆开两个 Bank 在同一周期承担不同角色:写端只修改写 Bank,读端只访问读 Bank。等写端完成一个完整帧、行或数据块后,在双方认可的同步边界交换角色。
图 1 Bank A 与 Bank B 在相邻周期交换读写角色(原理示意,非实测结果)
交换前,读端看到的 Bank 保持不变;交换后,刚写完的数据才成为新的可读版本。这样可以避免读到半完成内容。
三、它提高的是并行度,不是存储器峰值带宽Bank 乒乓让写端与读端在不同区域并行工作,减少彼此等待。但总线带宽、存储器时序和控制器效率仍决定系统上限。
图 2 单缓冲与双缓冲的并发关系(原理示意,非实测结果)
如果写入平均速率长期高于读出能力,双缓冲只能推迟溢出,不能凭空消除数据积压。系统仍需要丢帧、覆盖、背压或更大缓存策略。
四、最容易出错的是角色交换· 完成标志过早:最后一段数据尚未真正写入,Bank 就被交给读端。
· 跨时钟域直接翻转:写端和读端时钟不同,标志与指针需要可靠同步。
· 双方同时改所有权:没有单一仲裁者,可能出现同读或同写。
· 边界定义不一致:写端按行交换,读端却按帧理解,数据天然错位。
五、一次安全交接至少有这5步
图 3 Bank 乒乓的一次安全交接(原理示意,非实测结果)
1. 写端只写当前空闲 Bank,并维护明确的块内地址。
2. 完整数据写入后产生完成标志,不以软件猜测时间代替。
3. 若跨时钟域,使用适合的同步、握手或异步 FIFO 结构传递状态。
4. 在帧/行/块边界由单一控制逻辑交换角色。
5. 读端确认释放旧 Bank 后,写端才可再次覆盖。
六、验证不能只看画面“能动”
图 4 Bank 乒乓的四项验证(原理示意,非实测结果)
· 制造速率差:让写端略快或略慢,观察溢出、重复与丢帧策略。
· 在边界打标记:为每帧或每块加入序号,检查是否混帧。
· 覆盖复位场景:复位发生在任意 Bank 角色下,都要回到一致所有权。
工程判断:Bank 乒乓的价值,是让读端永远看到完整版本,让写端只修改空闲版本。地址切换只是表面;完成标志、所有权和同步边界才决定系统是否可靠。
写在最后看到双 Bank 设计时,别只检查 A 写 B 读的框图。真正要追的是:谁宣布写完、谁批准交换、旧 Bank 什么时候才允许覆盖。
把所有权和边界写成状态机,再去优化带宽,乒乓缓存才不会变成偶发撕裂的来源。

扫码关注







































