数字IC设计verilog编写——4流水线握手协议
1 流水线与握手协议
流水线在电路设计过程中,是必不可少的一种实现方式,其可以提高电路的性能,当我们需要设计高速电路的时候,就需要用到流水线;
流水线的设计,就是指对延时较大的组合逻辑插入寄存器,把较大的组合逻辑拆分成几个时钟周期来完成,以提高系统的最大时钟频率。但是这样做,会导致数据输出的延时,假若插入一个寄存器,则数据输出就到产生一个时钟周期的延时,假若插入N个寄存器,就会产生N个时钟周期的延时;
而握手协议能够确保数据的上游和下游能够正确的接收数据,握手协议的原则是:当Valid和Ready信号同时高有效时,数据在时钟上升沿传输:
2 流水线握手协议的电路设计
下面主要介绍使用Verilog设计一个简单的Valid-Ready握手协议电路的基本原理
本设计可以实现数据的流入和数据的流出,这样一个双端口握手协议通道传输。Valid和Ready信号的原理类似于FIFO的读写和空满信号,就好像FIFO外边包了一层。
在FIFO的端口信号上加上如上图所示反相器,也可达到握手的效果。
Valid-Ready信号产生有两种情况
1.Ready-Before-Valid
Ready-Before-Valid是Ready信号在Valid信号之前有效。
这样设计使得在数据来临之前,通道已准备好接收数据,可以保持通道的最大吞吐量,因为Ready先产生,这个通道保持刷新等待数据。通道作为接受数据端采用这样的设计。
2.Valid-before-Ready
Valid-before-Ready是Valid信号在Ready信号之前有效。通道作为数据输出端采用这样的设计。收到下游接收端的准备接收信号,才开始传输数据。
Valid-Ready协议Stalemate情况
Stalemate可以理解为“锁住”。假设我们不遵守上面两种接收端和输出端的设计规则。
输出端用Ready-Before-Valid而接受端使用Valid-before-Ready,就会出现输出端等待接受端给出的Ready来输出数据,但是接收端也在等待输出端给出Valid信号来接受数据。两者都在等待却没有一方先给,所以这个时候这个通道就是无效的,被“锁住”了。
握手协议的几种连接情况
3.握手流水线的Verilog设计(其中一级)
前面说过握手协议的接口可以在同步FIFO的基础上加以修改,修改电路如图:
assign valid_o = ~fifo_empty;
assign ready_o = ~fifo_full;
assign wr_en = ready_o & valid_i;
assign rd_en = ready_i & valid_o;
verilog实现代码:
module Handshake_Protocol(input clk,input rst_n,input valid_i, //from pre-stageinput data_i, //from pre-stageinput ready_i, //from post-stageoutput ready_o, //to pre-stageoutput valid_o, //to post-stageoutput data_o //to post-stage
);reg valid_o_r;reg ready_o_r;reg data_r;reg dout;always @(posedge clk or negedge rst_n) beginif(!rst_n) beginvalid_o_r <= 1'b0;data_r <= 0;endelse if(valid_i && ready_o) beignvalid_o_r <= 1'b1;data_r <= data_i;endelsevalid_o_r <= 1'b0;endalways @(posedge clk or negedge rst_n)if(!rst_n) beginready_o_r <= 1'b0;dout <= 0;endelse if(valid_o_r && ready_i) beginready_o_r <= 1'b1;dout <= data_r;endelseready_o_r <= 1'b0;endassign ready_o = ready_o_r;assign valid_o = valid_o_r;assign data_o = dout;endmodule
当vld_o为拉高时,表示这一级数据已经准备好,下一级数据可以将其读走;
当ready_o为拉高时,表示这几数据已经被读走,上一级数据可以写入新的数据;
此外,如果要实现高速的流水线作业,即这一级数据被读走时,上一级数据同时进来,这样每一级寄存器都会无缝的连接上(流水);
但是上述RTL存在优先级问题,即数据没有被读走之前,不能被写入;
always @(posedge clk or negedge rst_n) beginif(!rst_n) beginvalid_o_r <= 1'b0;data_r <= 0;endelse if(valid_i && ready_o) beign //数据可写进来,同时将valid_o置高,告诉下一级读取数据valid_o_r <= 1'b1;data_r <= data_i;endelse if(valid_o_r && ready_i) //如果数据读走之后,因此将valid_o拉低;valid_o_r <= 1'b0;
endalways @(posedge clk or negedge rst_n)if(!rst_n) beginready_o_r <= 1'b0;dout <= 0;endelse if(valid_o_r && ready_i) beginready_o_r <= 1'b1;dout <= data_r;endelse if (ready_o_r && valid_i)ready_o_r <= 1'b0;end
当该级ready_o与valid_i同时为高时,将valid拉高,表明数据已经被写入了,下一级可以读出;
有问题的欢迎指正!
数字IC设计verilog编写——4流水线握手协议相关推荐
- 数字IC设计入门篇:APB总线协议学习心得
声明:本文章是本人学习AMBA APB协议的一些个人理解,仅用于学习交流之用.本人学习APB协议时参考的是ARM公司官方的APB协议技术规范文档(编号:IHI0024D).受限于本人的知识水平,本文 ...
- 数字IC设计流程(全),芯片设计流程,集成电路设计流程
一 数字IC设计流程 前端: 1.规格制定 甲方提要求,确定芯片的功能,性能等方面. 2.架构设计 架构工程师制定方案,设计架构,划分模块功能,定义接口时序. 3.RTL编码 数字IC设计工程师编写R ...
- verilog hdl数字集成电路设计原理与应用_数字IC设计经典书籍推荐
数字IC设计流程很复杂,从前端到后端,也有很多职位.在这里整理了个数字IC各个环节的经典必读书籍.市面上的书籍种类纷繁复杂,这里每种只推荐两本左右,如果需要,建议知识类的书籍还是购买正版,尊重作者,也 ...
- 数字IC设计 FPGA——再谈加法器设计(使用Verilog 原语 进行四位加法器设计)
数字IC设计 FPGA--再谈加法器设计(使用Verilog 原语 进行四位加法器设计) 前面介绍了关于xilinx FPGA CLB的基本原理和结构,以及如何使用原语进行设计(在一般的设计中使用不到 ...
- 数字IC设计工程师笔试面试经典100题
1:什么是同步逻辑和异步逻辑? 同步逻辑是时钟之间有固定的因果关系.异步逻辑是各时钟之间没有固定的因果关系.同步时序逻辑电路的特点:各触发器的时钟端全部连接在一起,并接在系统时钟端,只有当时钟脉冲到来 ...
- 数字IC设计经典书籍
1 <Verilog HDL高级数字设计> 中文版和原著.这本书本人以为是讲Verilog方面的最好的一本书,看完此书后,相信大家的code水平会有很大提高.书中例子及其丰富,涵盖了RIS ...
- 数字 IC 设计、FPGA 设计秋招笔试题目、答案、解析(1)2022 紫光展锐(上)
引言 最近收到诸多粉丝的来信,要求出一版<数字 IC 设计.FPGA 设计秋招笔试题精讲>,于是,通过几天几夜的加班加点,终于出了这一版<2022 紫光展锐秋招笔试题目.答案.解析& ...
- 数字IC设计工程师笔试面试经典100题-有答案
转自知乎答主ictown_数字IC设计工程师笔试面试经典100题-有答案-陈恩 1:什么是同步逻辑和异步逻辑?(汉王) 同步逻辑是时钟之间有固定的因果关系.异步逻辑是各时钟之间没有固定的因果关系. 同 ...
- 常见数字IC设计、FPGA工程师面试题
转载自:常见数字IC设计.FPGA工程师面试题 我怕弄丢了,找不到了,所以转载过来吧,回答的还挺具有参考意义. 借个位置,顺便把另外一篇好文的地址附上:FPGA中的亚稳态 1:什么是同步逻辑和异步逻辑 ...
最新文章
- SQL Server 2005 18452登录错误 的解决方法
- Kafka源码剖析 —— 网络I/O篇 —— 浅析KafkaSelector
- kali如何制作php字典_Kali Linux安装搜狗输入法
- JAVA线程的interrupt
- 【C】strcpy()需谨慎使用;
- c语言程序设计平时作业代刷,C语言程序设计——小学生口算刷题系统
- 子元素个数不定的垂直居中布局
- 2022年4月中国数据库排行榜:华为GaussDB 挺进前四,榜单前八得分扶摇直上
- 电子技术基础(三)_第3章集成运放及其应用__同相比例运算
- Java基本数据类型及对应包装类
- 微信怎样知道经常聊天的人
- uniapp 自定义模板
- 使用OpenSSL库函数测试AES-CCM加密算法
- English语法_人称代词 - It
- 七牛 java 加水印_七牛云图片加水印
- 做人温和一点,做事狠一点。
- 【Halcon】插值算法通俗讲解
- imperva ssl加速卡查询
- 什么是接口测试?接口测试的流程步骤
- 饿了么的PWA升级实践
热门文章
- 手术器械​RFID追踪管理系统方案
- ☆ C/C++ 枚举型变量(enum)与布尔型变量(bool)
- 电脑数据丢失了有什么办法可以恢复
- “泛在电力物联网”究竟是什么?
- 什么是真正的用户画像
- null blob mysql_图像存入MySQL数据库longBLOB出错
- 黑龙江省人力资源和社会保障网上服务大厅 - https://www.renshenet.org.cn/sionline/loginControler
- 美国政府警告:西门子医疗扫描设备存在多处漏洞
- 【181203】VC++ 签名鉴定/笔迹识别源代码
- 【小程序源码】2022虎年全新姓氏头像制作多模板