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流水线握手协议相关推荐

  1. 数字IC设计入门篇:APB总线协议学习心得

    声明:本文章是本人学习AMBA  APB协议的一些个人理解,仅用于学习交流之用.本人学习APB协议时参考的是ARM公司官方的APB协议技术规范文档(编号:IHI0024D).受限于本人的知识水平,本文 ...

  2. 数字IC设计流程(全),芯片设计流程,集成电路设计流程

    一 数字IC设计流程 前端: 1.规格制定 甲方提要求,确定芯片的功能,性能等方面. 2.架构设计 架构工程师制定方案,设计架构,划分模块功能,定义接口时序. 3.RTL编码 数字IC设计工程师编写R ...

  3. verilog hdl数字集成电路设计原理与应用_数字IC设计经典书籍推荐

    数字IC设计流程很复杂,从前端到后端,也有很多职位.在这里整理了个数字IC各个环节的经典必读书籍.市面上的书籍种类纷繁复杂,这里每种只推荐两本左右,如果需要,建议知识类的书籍还是购买正版,尊重作者,也 ...

  4. 数字IC设计 FPGA——再谈加法器设计(使用Verilog 原语 进行四位加法器设计)

    数字IC设计 FPGA--再谈加法器设计(使用Verilog 原语 进行四位加法器设计) 前面介绍了关于xilinx FPGA CLB的基本原理和结构,以及如何使用原语进行设计(在一般的设计中使用不到 ...

  5. 数字IC设计工程师笔试面试经典100题

    1:什么是同步逻辑和异步逻辑? 同步逻辑是时钟之间有固定的因果关系.异步逻辑是各时钟之间没有固定的因果关系.同步时序逻辑电路的特点:各触发器的时钟端全部连接在一起,并接在系统时钟端,只有当时钟脉冲到来 ...

  6. 数字IC设计经典书籍

    1 <Verilog HDL高级数字设计> 中文版和原著.这本书本人以为是讲Verilog方面的最好的一本书,看完此书后,相信大家的code水平会有很大提高.书中例子及其丰富,涵盖了RIS ...

  7. 数字 IC 设计、FPGA 设计秋招笔试题目、答案、解析(1)2022 紫光展锐(上)

    引言 最近收到诸多粉丝的来信,要求出一版<数字 IC 设计.FPGA 设计秋招笔试题精讲>,于是,通过几天几夜的加班加点,终于出了这一版<2022 紫光展锐秋招笔试题目.答案.解析& ...

  8. 数字IC设计工程师笔试面试经典100题-有答案

    转自知乎答主ictown_数字IC设计工程师笔试面试经典100题-有答案-陈恩 1:什么是同步逻辑和异步逻辑?(汉王) 同步逻辑是时钟之间有固定的因果关系.异步逻辑是各时钟之间没有固定的因果关系. 同 ...

  9. 常见数字IC设计、FPGA工程师面试题

    转载自:常见数字IC设计.FPGA工程师面试题 我怕弄丢了,找不到了,所以转载过来吧,回答的还挺具有参考意义. 借个位置,顺便把另外一篇好文的地址附上:FPGA中的亚稳态 1:什么是同步逻辑和异步逻辑 ...

最新文章

  1. SQL Server 2005 18452登录错误 的解决方法
  2. Kafka源码剖析 —— 网络I/O篇 —— 浅析KafkaSelector
  3. kali如何制作php字典_Kali Linux安装搜狗输入法
  4. JAVA线程的interrupt
  5. 【C】strcpy()需谨慎使用;
  6. c语言程序设计平时作业代刷,C语言程序设计——小学生口算刷题系统
  7. 子元素个数不定的垂直居中布局
  8. 2022年4月中国数据库排行榜:华为GaussDB 挺进前四,榜单前八得分扶摇直上
  9. 电子技术基础(三)_第3章集成运放及其应用__同相比例运算
  10. Java基本数据类型及对应包装类
  11. 微信怎样知道经常聊天的人
  12. uniapp 自定义模板
  13. 使用OpenSSL库函数测试AES-CCM加密算法
  14. English语法_人称代词 - It
  15. 七牛 java 加水印_七牛云图片加水印
  16. 做人温和一点,做事狠一点。
  17. 【Halcon】插值算法通俗讲解
  18. imperva ssl加速卡查询
  19. 什么是接口测试?接口测试的流程步骤
  20. 饿了么的PWA升级实践

热门文章

  1. 手术器械​RFID追踪管理系统方案
  2. ☆ C/C++ 枚举型变量(enum)与布尔型变量(bool)
  3. 电脑数据丢失了有什么办法可以恢复
  4. “泛在电力物联网”究竟是什么?
  5. 什么是真正的用户画像
  6. null blob mysql_图像存入MySQL数据库longBLOB出错
  7. 黑龙江省人力资源和社会保障网上服务大厅 - https://www.renshenet.org.cn/sionline/loginControler
  8. 美国政府警告:西门子医疗扫描设备存在多处漏洞
  9. 【181203】VC++ 签名鉴定/笔迹识别源代码
  10. 【小程序源码】2022虎年全新姓氏头像制作多模板