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;

always @(posedge clk )

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

ping-pong buffer的更多相关文章

  1. HDU 2492 Ping pong (树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2492 Ping pong Problem Description N(3<=N<=2000 ...

  2. UVALive 4329 Ping pong

                                      Ping pong Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Fo ...

  3. POJ 3928 Ping pong(树状数组)

                                                                          Ping pong Time Limit: 1000MS   ...

  4. LA4329 Ping pong(树状数组与组合原理)

    N (3N20000)ping pong players live along a west-east street(consider the street as a line segment). E ...

  5. Ping pong

    Ping pong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  6. POJ 3928 Ping pong

    题目链接:http://poj.org/problem?id=3928 乒乓比赛,有N个人参加,输入每个玩家的技能等级,对每个人设置一个特定ID和一个技能值,一场比赛需要两个选手和一个裁判,只有当裁判 ...

  7. Frequent values && Ping pong

    Frequent values 题意是不同颜色区间首尾相接,询问一个区间内同色区间的最长长度. 网上流行的做法,包括翻出来之前POJ的代码也是RMQ做法,对于序列上的每个数,记录该数向左和向右延续的最 ...

  8. 【暑假】[实用数据结构]UVAlive 4329 Ping pong

    UVAlive 4329 Ping pong 题目: Ping pong Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: % ...

  9. Ping pong(树状数组经典)

    Ping pong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  10. hdu2492 Ping pong

    hdu2492 Ping pong 题意:一群乒乓爱好者居住在一条直线上,如果两个人想打比赛需要一个裁判,裁判的 位置 必须在两者之间 ,裁判的能力也必须不大于 参赛者最大的,不小于参赛者最小的 白皮 ...

随机推荐

  1. v8引擎详解(摘)-- V8引擎是一个JavaScript引擎实现

    随着Web相关技术的发展,JavaScript所要承担的工作也越来越多,早就超越了“表单验证”的范畴,这就更需要快速的解析和执行JavaScript脚本.V8引擎就是为解决这一问题而生,在node中也 ...

  2. js展示long型精度问题解决(server端解决)

    问题:后端返回了个Long型的数据,在前端展示时最后2位变为00了 例如返回Long型的数据为75874464836881101,结果接口返回变为75874464836881100了 解决方法: 1. ...

  3. 【06】Kubernets:资源清单(控制器 - Deployment)

    写在前面的话 上一节主要简单的提了一下控制器都有哪些常用的,并且简单的功能是啥,最后一并提了 ReplicaSet 控制器. 但是 ReplicaSet 一般不需要我们直接配置,多以从本节开始,开始学 ...

  4. Winform中设置ZedGraph的曲线为折线、点折线、散点图

    场景 Winform中设置ZedGraph的曲线为散点图: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102465399 在上 ...

  5. 349套HTML5+CSS3各行各业网站模板免费下载

    场景 349套HTML5+CSS3各行各业网站模板. Web前端开发是从网页制作演变而来的,名称上有很明显的时代特征.在互联网的演化进程中,网页制作是Web1.0时代产物,那时网站的主要内容是静态的, ...

  6. 立即执行函数(function(){})()与闭包

    立即执行函数 匿名(function(){})() 当一个匿名函数被括起来,然后再在后面加一个括号,这个匿名函数就能立即运行起来. $(function(){}) $(function(){});是$ ...

  7. vue中路由拦截无限循环的情况

    router.beforeEach(async (to, from, next) => { if (token) { if (whiteList.indexOf(to.path) != -1) ...

  8. 原生ajax中readyState中的含义以及HTTP协议状态码的含义

    xmlhttp.readyState的值及解释: 0:请求未初始化(还没有调用 open()). 1:请求已经建立,但是还没有发送(还没有调用 send()). 2:请求已发送,正在处理中(通常现在可 ...

  9. sigaction信号处理

    1. sigaction int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact); signu ...

  10. Django rest framework ---- 权限

    Django rest framework ---- 权限 添加权限 api/utils文件夹下新建premission.py文件,代码如下: message是当没有权限时,提示的信息 # FileN ...