今天来学习一下滑动缓冲器。

在总线协议中,反馈握手信号是很常见的。最典型的就是axi总线中的valid-ready信号对。

有数据要发送时,master就将valid拉高, 如果slave可以接收数据,则将ready信号也拉高,因此数据在valid=1且ready=1的时候完成一次传输。

如果slave暂无法接收数据,就将ready拉低,这时若master如果拉高了valid,那么需要保持valid和data的数据不变,直到ready信号拉高。

在这个方案下,可能会产生一个问题,如果ready信号出现时序违例了怎么办?

最常见的方法是在ready路径中加一级寄存器,将其组合逻辑隔断。

这样子我们就产生了两个ready信号,一个是slave输出的信号i_ready,一个是打一拍后给到master的信号o_ready。

这种做法造成的最直接后果就是master接收slave的ready信号会晚一拍,进而会引发至少两个问题。

对于master端而言,它只能看见o_ready,因此输出的data也是跟着o_ready来的,o_ready为低时,保持当前数据D3不变,直到o_ready拉高。

但数据传到slave后,和slave端真正的ready信号(即i_ready)产生错位。

①D2数据时,i_ready为低,因此该D2数据被slave所忽略。

②D3数据持续了三个周期,后两个周期时,i_ready都为高,因此D3数据传输了两次,即图中D3(1)、D3(2)。

那么这是个功能上的错误,解决的方法就是skid_buffer。核心思想就是在D2时刻,将数据保存到skid buffer的一个内部寄存器中,然后在i_ready拉高后的第一个周期输出,顶替图中D3(1)的周期,这样子可以使数据D2不丢失同时避免了传输两次D3的现象。

moudle skid_buff(input clk,
input rstn,//master to skid_buff
input i_valid,
input [63:0] i_data,
output o_ready,//skid_buff to slave
output o_valid,
output [63:0] o_data,
input i_ready);reg[63:0] r_data;
reg r_valid;always @ (posedge clk or negedge rstn)beginif(!rstn)r_valid <= 'b0;else if (i_valid && (!i_ready))r_valid <= 1'b1;else if (i_ready)r_valid <= 1'b0;
endalways @ (posedge clk or negedge rstn)beginif(!rstn)r_data <= 'b0;else if (i_valid && (!i_ready) && (!r_valid))r_data <= i_data;
endassign o_data = (r_valid)?r_data:i_data;
assign o_valid = r_valid | i_valid;endmodule

可以看到在内部我们首先对i_ready进行了一次打拍,然后声明了一个内部的r_data用来暂存数据,并声明了一个r_valid用来只是r_data是否暂存了数据。该模块主要的逻辑如下:

①如果master传输了一个数据(i_valid),但是slave的i_ready为0,则将数据暂存,防止丢失。同时拉高r_valid,说明内部寄存器已经暂存了一个来自master的数据。

②如果i_ready拉高,那么首先要将r_data的数据输出,这时由于内部寄存器的数据已经输出,那么需要拉低r_valid。

③如果内部寄存器有数据,或者master有数据要发送,那么slave都将收到来自skid buff的valid信号。同时内部寄存器的数据是要永远优先于master的数据发送的。

skid buffer相关推荐

  1. 【PIPE】流水线设计中的基本模块

    大概分成以下几节: 1,概述及协议  2,valid forward-valid超前  3, bubble collapse - 消除气爆   4, input/output skid - 不知中文怎 ...

  2. 如何写控制逻辑(三):模块级流水和valid/ready协议

    如何写控制逻辑(三):模块级流水和valid/ready协议 大概八月份就开始想总结下控制逻辑的写法了,然后开始找资料,没有直接讲这个的,零零散散的看了很多,断断续续的写了很长时间,自闭无岁月··· ...

  3. axi_crossbar IP使用说明

    #总体简介 图例是2X3的配置 #主要特性 ▲支持Master.Slave接口数量配置 ▲支持全连接.部分连接 ▲支持多threads.多issue效率匹配 ▲支持输入BURST最大数量匹配 ▲支持M ...

  4. IEEE-Micro 2021-2010年间CPU Micro-architecture方向文章总结

    2021 IBM's POWER10 Processor 服务器 特性概述 提升20%性能和30%core 吞吐量(相对于power9) 优化矩阵运算 1TB/s的跨系统存储集群带宽 模块化die,支 ...

  5. ready_valid 协议

    [PIPE]流水线设计中的基本模块 大概分成以下几节: 1,概述及协议  2,valid forward-valid超前  3, bubble collapse - 消除气爆   4, input/o ...

  6. [WARNING] unable to add QUERY_STRING=XXXX to uwsgi packet, consider increasing buffer size

    1. 问题现象 在用 flask uwsgi api 报文发送 GET 请求时,请求参数的 value 值 "XXX" 太长时,会报下面的错误. [WARNING] unable ...

  7. Java NIO中的Buffer

    简介 Buffer缓冲区,首先要弄明白的是,缓冲区是怎样一个概念.它其实是缓存的一种,我们常说的缓存,包括保存在硬盘上的浏览器缓存,保存在内存中的缓存(比如Redis.memcached).Buffe ...

  8. Buffer的工作方式

    1.Buffer的工作方式 前面<java NIO的工作方式>介绍了Selector检测到通信信道I/O有数据传输时,通过select()方法取得SocketChannel,将数据读取或写 ...

  9. TCP性能和发送接收Buffer的关系

    本文希望解析清楚,当我们在代码中写下 socket.setSendBufferSize 和 sysctl 看到的rmem/wmem系统参数以及最终我们在TCP常常谈到的接收发送窗口的关系,以及他们怎样 ...

最新文章

  1. 【ASP.NET】判断访问网站的客户端是PC还是手机
  2. Spark实战系列目录
  3. 你以为的论文答辩,实际的论文答辩,看着看着就哭系列
  4. 23种设计模式之原型模式
  5. 管理运筹学软件计算机解咋看,运筹学软件结果解析总结计划题1-20210618123710.docx-原创力文档...
  6. 电脑位数怎么看_看完了这篇文章你就知道怎么选电脑了...
  7. mediarecorder 录制的文件无法拖动进度条_如何下载网络ts视频文件
  8. Android ScrollView 实现整个界面变成列表
  9. 【转】使用AIDL实现进程间的通信之复杂类型传递
  10. access 跳过一次for循环_Java中的循环结构
  11. 前端绝对路径不显示图片_Vue cli使用绝对路径引用图片问题的解决_情愫_前端开发者...
  12. nginx反向代理负载均衡简述
  13. 黄淮江淮等地有大雾 较强冷空气将影响中东部地区
  14. 阿尔兹海默症AD最新研究进展(2022年2月)
  15. 零基础学VB6.0仿真:用四阶龙格库塔法计算传递函数状态方程的结果
  16. DeskSpace 显示Dash board
  17. Torch安装及使用
  18. Unity绳子插件Obi Rope下载与简单使用方法
  19. 【CV】Reg2Net:一种用于计算机视觉任务的多尺度骨干架构
  20. 离散数学实验报告三——真值表与主范式

热门文章

  1. ctfshow 萌新22 (类似级客巅峰web4)
  2. Swift语法学习--字典
  3. [bzoj4084][Sdoi2015]双旋转字符串_hash
  4. mysql 导出dmp文件_15款优秀的mysql管理工具与应用程序推荐
  5. 美元霸权·《看懂世界格局的第一本书·2》
  6. 2012-2013-1 (实变函数56, 高等数学84)
  7. torch.flatten、np.flatten 详解
  8. 用python制作田字格_2分钟学会在Word中制作田字格 米字格 书法练字再也不用买本子了...
  9. 【Bilibili视频嵌入技巧】如何嵌入720PBilibili视频
  10. 修改android.policy.jar全屏