凡亿教育-小文
凡事用心,一起进步
打开APP
公司名片
凡亿专栏 | 一帧图像还没写完, 下一帧已经来了? Bank乒乓把读写冲突拆成两个时段
一帧图像还没写完, 下一帧已经来了? Bank乒乓把读写冲突拆成两个时段

FPGA · Bank乒乓 · 双缓冲

一帧图像还没写完,
下一帧已经来了?
Bank乒乓把读写冲突拆成两个时段

双缓冲让生产者和消费者并行,交换边界决定数据是否完整

Bank 乒乓用两个存储区轮换角色:写端填充一个 Bank 时,读端从另一个 Bank 取走完整数据;在帧、行或数据块边界,双方确认后再交换。它解决的是读写并发与数据一致性,不是自动提高存储器速度。

摄像头仍在写当前帧,显示端已经开始读取;如果两边访问同一块缓存,画面可能上半部分来自新帧、下半部分还是旧帧。

Bank 乒乓通过两块缓冲把写入和读出分开:一个负责接收新数据,另一个保持完整旧数据供消费。真正难点不在地址多一位,而在什么时候交换所有权。

一、单缓冲为什么容易发生读写冲突

生产者和消费者速率不完全一致时,同一块存储区可能一边被覆盖、一边被读取。读端拿到的数据来自不同时间片,形成撕裂、重复或局部更新。

通过仲裁强制一方等待可以避免同时访问,但吞吐会被压低,实时视频、采集和数据搬运更容易错过边界。

二、Bank乒乓怎样把冲突拆开

两个 Bank 在同一周期承担不同角色:写端只修改写 Bank,读端只访问读 Bank。等写端完成一个完整帧、行或数据块后,在双方认可的同步边界交换角色。

3.png 

1  Bank A 与 Bank B 在相邻周期交换读写角色(原理示意,非实测结果)

交换前,读端看到的 Bank 保持不变;交换后,刚写完的数据才成为新的可读版本。这样可以避免读到半完成内容。

三、它提高的是并行度,不是存储器峰值带宽

Bank 乒乓让写端与读端在不同区域并行工作,减少彼此等待。但总线带宽、存储器时序和控制器效率仍决定系统上限。

2.png 

2  单缓冲与双缓冲的并发关系(原理示意,非实测结果)

如果写入平均速率长期高于读出能力,双缓冲只能推迟溢出,不能凭空消除数据积压。系统仍需要丢帧、覆盖、背压或更大缓存策略。

四、最容易出错的是角色交换

· 完成标志过早:最后一段数据尚未真正写入,Bank 就被交给读端。

· 跨时钟域直接翻转:写端和读端时钟不同,标志与指针需要可靠同步。

· 双方同时改所有权:没有单一仲裁者,可能出现同读或同写。

· 边界定义不一致:写端按行交换,读端却按帧理解,数据天然错位。

五、一次安全交接至少有这5

1.png 

3  Bank 乒乓的一次安全交接(原理示意,非实测结果)

1. 写端只写当前空闲 Bank,并维护明确的块内地址。

2. 完整数据写入后产生完成标志,不以软件猜测时间代替。

3. 若跨时钟域,使用适合的同步、握手或异步 FIFO 结构传递状态。

4. 在帧/行/块边界由单一控制逻辑交换角色。

5. 读端确认释放旧 Bank 后,写端才可再次覆盖。

六、验证不能只看画面能动

0.png 

4  Bank 乒乓的四项验证(原理示意,非实测结果)

· 制造速率差:让写端略快或略慢,观察溢出、重复与丢帧策略。

· 在边界打标记:为每帧或每块加入序号,检查是否混帧。

· 覆盖复位场景:复位发生在任意 Bank 角色下,都要回到一致所有权。

工程判断:Bank 乒乓的价值,是让读端永远看到完整版本,让写端只修改空闲版本。地址切换只是表面;完成标志、所有权和同步边界才决定系统是否可靠。

写在最后

看到双 Bank 设计时,别只检查 A 写 B 读的框图。真正要追的是:谁宣布写完、谁批准交换、旧 Bank 什么时候才允许覆盖。

把所有权和边界写成状态机,再去优化带宽,乒乓缓存才不会变成偶发撕裂的来源。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表凡亿课堂立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。
相关阅读
进入分区查看更多精彩内容>
精彩评论

暂无评论