skid buffer
今天来学习一下滑动缓冲器。
在总线协议中,反馈握手信号是很常见的。最典型的就是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相关推荐
- 【PIPE】流水线设计中的基本模块
大概分成以下几节: 1,概述及协议 2,valid forward-valid超前 3, bubble collapse - 消除气爆 4, input/output skid - 不知中文怎 ...
- 如何写控制逻辑(三):模块级流水和valid/ready协议
如何写控制逻辑(三):模块级流水和valid/ready协议 大概八月份就开始想总结下控制逻辑的写法了,然后开始找资料,没有直接讲这个的,零零散散的看了很多,断断续续的写了很长时间,自闭无岁月··· ...
- axi_crossbar IP使用说明
#总体简介 图例是2X3的配置 #主要特性 ▲支持Master.Slave接口数量配置 ▲支持全连接.部分连接 ▲支持多threads.多issue效率匹配 ▲支持输入BURST最大数量匹配 ▲支持M ...
- IEEE-Micro 2021-2010年间CPU Micro-architecture方向文章总结
2021 IBM's POWER10 Processor 服务器 特性概述 提升20%性能和30%core 吞吐量(相对于power9) 优化矩阵运算 1TB/s的跨系统存储集群带宽 模块化die,支 ...
- ready_valid 协议
[PIPE]流水线设计中的基本模块 大概分成以下几节: 1,概述及协议 2,valid forward-valid超前 3, bubble collapse - 消除气爆 4, input/o ...
- [WARNING] unable to add QUERY_STRING=XXXX to uwsgi packet, consider increasing buffer size
1. 问题现象 在用 flask uwsgi api 报文发送 GET 请求时,请求参数的 value 值 "XXX" 太长时,会报下面的错误. [WARNING] unable ...
- Java NIO中的Buffer
简介 Buffer缓冲区,首先要弄明白的是,缓冲区是怎样一个概念.它其实是缓存的一种,我们常说的缓存,包括保存在硬盘上的浏览器缓存,保存在内存中的缓存(比如Redis.memcached).Buffe ...
- Buffer的工作方式
1.Buffer的工作方式 前面<java NIO的工作方式>介绍了Selector检测到通信信道I/O有数据传输时,通过select()方法取得SocketChannel,将数据读取或写 ...
- TCP性能和发送接收Buffer的关系
本文希望解析清楚,当我们在代码中写下 socket.setSendBufferSize 和 sysctl 看到的rmem/wmem系统参数以及最终我们在TCP常常谈到的接收发送窗口的关系,以及他们怎样 ...
最新文章
- 【ASP.NET】判断访问网站的客户端是PC还是手机
- Spark实战系列目录
- 你以为的论文答辩,实际的论文答辩,看着看着就哭系列
- 23种设计模式之原型模式
- 管理运筹学软件计算机解咋看,运筹学软件结果解析总结计划题1-20210618123710.docx-原创力文档...
- 电脑位数怎么看_看完了这篇文章你就知道怎么选电脑了...
- mediarecorder 录制的文件无法拖动进度条_如何下载网络ts视频文件
- Android ScrollView 实现整个界面变成列表
- 【转】使用AIDL实现进程间的通信之复杂类型传递
- access 跳过一次for循环_Java中的循环结构
- 前端绝对路径不显示图片_Vue cli使用绝对路径引用图片问题的解决_情愫_前端开发者...
- nginx反向代理负载均衡简述
- 黄淮江淮等地有大雾 较强冷空气将影响中东部地区
- 阿尔兹海默症AD最新研究进展(2022年2月)
- 零基础学VB6.0仿真:用四阶龙格库塔法计算传递函数状态方程的结果
- DeskSpace 显示Dash board
- Torch安装及使用
- Unity绳子插件Obi Rope下载与简单使用方法
- 【CV】Reg2Net:一种用于计算机视觉任务的多尺度骨干架构
- 离散数学实验报告三——真值表与主范式
热门文章
- ctfshow 萌新22 (类似级客巅峰web4)
- Swift语法学习--字典
- [bzoj4084][Sdoi2015]双旋转字符串_hash
- mysql 导出dmp文件_15款优秀的mysql管理工具与应用程序推荐
- 美元霸权·《看懂世界格局的第一本书·2》
- 2012-2013-1 (实变函数56, 高等数学84)
- torch.flatten、np.flatten 详解
- 用python制作田字格_2分钟学会在Word中制作田字格 米字格 书法练字再也不用买本子了...
- 【Bilibili视频嵌入技巧】如何嵌入720PBilibili视频
- 修改android.policy.jar全屏