【Base】ping-pong buffer
###Date: 2018.3.24
======================================================
1 什么是pingpong?
pingpong是一种数据缓存的手段,通过pingpong操作可以提高数据传输的效率。
2 什么时候需要pingpong?
在两个模块间交换数据时,上一级处理的结果不能马上被下一级所处理完成,这样上一级必须等待下一级处理完成才可以送新的数据,这样就会对性能产生很大的损失。
引入pingpong后我们可以不去等待下一级处理结束,而是将结果保存在pong路的缓存中,pong路的数据准备好的时刻,ping路的数据也处理完毕(下一级),然后无需等待直接处理pong路数据,上一级也无需等待,转而将结果存储在ping路。这样便提高了处理效率。
3 实现
实现时我们需要,两个指针,ping_rd,pong_wr. 还要保存数据的缓存reg [31:0] buf [1:0];
always @(posedge clk or negedge rst)
if(!rst)
ping_rd <= 0;
else if(rd)
ping_rd <= ~ping_rd;
always @(posedge clk or negedge rst)
if(!rst)
ping_wr <= 0;
else if(wr)
ping_wr <= ~ping_wr;
if(wr)
buf[ping_wr] <= data_in;
assgin data_out = buf[ping_rd];
为了满足模块间的握手,可以再增加两个标识位,表示相应的buffer是否有效。
reg[1:0] buf_valid;
always @(posedge clk or negedge rst)
if(!rst)
buf_valid[0]<= 1'b0;
else if(rd & ~ping_rd)
buf_valid[0]<= 1'b0;
else if(wr & ~ping_wr)
buf_valid[0]<= 1'b1;
always @(posedge clk or negedge rst)
if(!rst)
buf_valid[1]<= 1'b0;
else if(rd & ping_rd)
buf_valid[1]<= 1'b0;
else if(wr & ping_wr)
buf_valid[1]<= 1'b1;
wire data_rdy = buf_valid[1] | buf_valid[0];
wire m_full = buf_valid[1] & buf_valid[0];
下图给出了pingpang的基本原理框图,从图上可以看出使用pingpang的主要作用 就是使用多个低速的数据预处理模块处理高速的输入数据流。这样做可以提高系统的数据吞吐量(如果不使用乒乓的话数据预处理模块会成为设计中限制系统数据吞 吐量的瓶颈),同时增加了数据缓冲延迟。
另一个解释:
所谓ping-pong buffer,也就是定义两个buffer,当有数据进来的时候,负责写入buffer的进程就寻找第一个没有被占用而且可写的buffer,进行写入,写好之后,将占用flag释放,同时设置一个flag提示此buffer已经可读,然后再接下去找另外一个可写的buffer,写入新的数据。
而读入的进程也是一直对buffer状态进行检测,一旦发现没有被占用,而且已经可以被读,就把这个buffer的数据取出来,然后标志为可写。
参考:
https://blog.csdn.net/MIThebut/article/details/44995959
https://blog.csdn.net/zhuzhiqi11/article/details/46289629
https://blog.csdn.net/hustbin/article/details/16951689
【Base】ping-pong buffer相关推荐
- uniapp的目录结构反思与整理 app.vue【base】pages.json【配置】main.json【框架入口文件】
App.vue 作用是 全局样式+全局的生命周期 相当于PHP里面的BaseControlller文件 [Base] pages.json作用是 配置路由+导航条+选项卡+tabbar ...
- ping pong buffer
Ping pong buffer is a buffer used in a transmission that contains two separate buffers, while one bu ...
- Ping Pong Buffer 双缓冲 C++代码学习
1.Ping Pong Buffer 原理分析 基本原理如上图所示,当设备有数据来时,先放入缓冲区1 然后将缓冲区1的数据放入缓冲区2,这时缓冲区1可接收下次数据.工作区可从缓冲区2拿数据 2.C++ ...
- 【C++】Google Protocol Buffer(protobuf)详解(二)
代码走读:caffe中protobuf的详细使用过程 [一]proto文件,以caffe.proto中BlobShape为例 syntax = "proto2"; //指明prot ...
- 【Ubuntu】ping: unknown host www.baidu.com
1.问题描述 每次重新设置网络后,ping百度总是报错: $ ping www.baidu.com ping: unknown host www.baidu.com 2.原因分析 原因是:查看/etc ...
- 【C++】Google Protocol Buffer(protobuf)详解(一)
1.简介 Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准, Protocol Buffers 是一种轻便高效的结构化数据存储格式 ...
- 【NIO】缓存区buffer
io中包含了很多东西,我个人认为最核心的是selector,那里我会使用大量的篇幅去介绍.但在那之前,我们还是从最简单的东西入手.今天只讲一下buffer. 在没有使用nio之前,我们只能自己维护一个 ...
- 【 FPGA 】认识关键BUFFER
目录 BUFG IBUF IBUFDS BUFGMUX BUFH BUFIO BUFR BUFMRCE 内容参考自: Vivado Design Suite 7 Series FPGA and Zyn ...
- 【Netty】NIO 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathering 操作
文章目录 I . 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathering 概念 II . 缓冲区 ( Buffer ) 分散 Scattering 与 聚合 Gathe ...
最新文章
- uva-10954-贪心
- 与班尼特·胡迪一起找简单规律(HZOJ-2262)
- 解决在使用 Qt 编译项目时出现 “C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode格式以防止数据丢失“ 的警告
- scala通过mkString方法把一个集合转化为一个字符串
- yii直接执行sql
- Asp.NET Core+ABP框架+IdentityServer4+MySQL+Ext JS之文件上传
- 软件开发人员电脑配置
- 联想E43升级bios激活windows 7
- 获取随机数的n种方法,你知道几种
- esp分区引导修复失败_gpt分区怎么修复引导?uefi+gpt分区修复esp引导教程
- 海思59V200PQtool环境的搭建
- 干货 | 关于等效电路图画法,不得不学的几个小窍门!
- 6 统计正数和负数的个数然后计算这些数的平均值
- 向量召回在躺平APP的实践
- 欧美插画系列-张聪-专题视频课程
- 出来混迟早是要还的:算法技术债
- 2014小学计算机教师招聘笔试,2014江西教师招聘考试《小学信息技术》真题及答案解析.doc...
- 「GitLab CI/CD」- You are not allowed to download code from this project @20210402
- Dr.COM宽带认证客户端共享上网破解V3.46
- 使用python的上海大学抢课方案
热门文章
- 同一张表查询一个字段为空则取另一个字段
- 使用frp内网穿透,用windows远程桌面连接
- 计算机一级考试操作题未来教育,2019年计算机一级考试MS Office操作试题002
- matlab耀输,基于 Matlab的BP神经网络在太阳耀斑级别预测中的应用
- 「禾连健康」轻松实现弹性降本20%以上,竟然是因为使用了它
- WPF 制作高性能的透明背景异形窗口(使用 WindowChrome 而不要使用 AllowsTransparency=True)
- openwrt 开启p2p下载后不定时断流处理办法
- 图像采集数据集整理和扩充方案(含代码)
- #文本编辑器#卸载Notepad++?除了Notepad++,还有啥能代替的吗?有,必须有!!!
- 中小企业管理信息化的一些事(一)