今天想介绍一下乒乓buffer。乒乓buffer是一种常用的提高数据通路带宽的技术,是一种面积换性能的经典设计。在流水线设计中,灵活应用还可以在保证带宽的基础上解决时序问题。
乒乓buffer的基本流程
乒乓buffer又叫double buffer,由两块同样大小的memory组成,一乒一乓。放在数据通路的中间,在大部分时候都能保证一块memory收上游的数据,一块memory往下游发数据,一读一写并行操作。
如果用抽象的状态机来描述其工作机制,大致如下:
如上图所示,从IDLE状态开始,先随机挑一块buffer写入数据,进入PREPARE态,写完之后进入SYNC态,然后Ping和Pang读写swap调换,进入WORK态。
之后在WORK0->SYNC1->WORK1->SYNC0几个状态之间循环,不断调换Ping-Pang读写,直到某个时刻上游不写,只有下游读,则跳出Ping-Pang循环,进入END态,最后下游读完回到IDLE状态。
乒乓buffer的应用场景:
乒乓buffer主要应用在以下场景进行带宽的提升:
- 下游必须等到上游数据全部写完或者积累到某个程度才能开始读
- 上游必须等到下游数据全部读完或者读到某个程度才能开始写
如果数据的读写没有以上的约束,那么没必要使用乒乓buffer,直接用普通的buffer就可以实现缓存以及切割通路握手,提高带宽的目的。乒乓buffer要解决的关键性能点就在于上下游的互相等待这段latency。
让下游等待上游写数据的同时可以读数据,上游等待下游读数据的同时可以写数据,实现时间并行,将两个时间overlap起来。
如上图所示,在时间横轴上,假设一笔读写的latency一样,同样时间内,使用乒乓buffer可以完成4笔数据读写,而使用单一个buffer只能完成2笔半。而这里的关键便是由于资源的加倍带来的并行度加倍。
如果读写的时延不同,为了保证ping-pang的同步,先完成的一方要等待另一方完成,然后才能交换两个buffer的读写操作。这段时间从状态的角度来看属于SYNC状态,而整个ping-pang的latency取决于慢的那一方。
乒乓buffer的使用代价:
作为一种用加倍储存资源来解决性能问题的方法,当然最大的代价就是面积和功耗的开销。因此在设计中还是要因地制宜地进行选择。
本文作者 | L.L.点击查看往期内容回顾
【IC/FPGA基础】芯片设计小技巧-共享buffer
【IC/FPGA基础】芯片设计小技巧-抢一拍
【IC/FPGA基础】Makefile脚本(VCS与Verdi实例)
【IC/FPGA基础】多比特信号跨时钟域之握手
【IC/FPGA基础】多比特信号跨时钟域之FIFO
end
觉得不错,请点个在看