文章目录

  • 1、流水线技术
  • 2、流水线设计的概念
  • 3、流水线设计的优缺点
  • 4、实验目的
  • 5、程序设计
  • 5、引用

1、流水线技术

​ 硬件描述语言的一个突出优点就是指令执行的并行性。多条语句能够在相同时钟周期内并行处理多个信号数据。但是当数据串行输入时,指令执行的并行性并不能体现出其优势。而且很多时候有些计算并不能在一个或两个时钟周期内执行完毕,如果每次输入的串行数据都需要等待上一次计算执行完毕后才能开启下一次的计算,那效率是相当低的。流水线就是解决多周期下串行数据计算效率低的问题。

​ 流水线(pipe_line)的设计方法已在高性能的、需要经常进行大规模运算的系统中得到广泛的应用,如cpu(中央处理器)等。流水线处理方法之所以能够很大程度上提高数据流的处理速度,是因为它进行了处理模块的复制,也能很好的体现了面积换速度的思想。

​ 如果某个设计可以分为若干步骤进行处理,而且整个数据处理过程是单向的,即没有反馈运算或者迭代运算,前一个步骤的输入即使下一个步骤的输出,就可以考虑采用流水线设计方法来提高系统的工作频率。

2、流水线设计的概念

​ 专业词汇解释:

首次延迟(latency):将(从输入到输出)最长的路径进行初始化所需要的时间总量。

吞吐延迟:执行一次重复性操作所需要的时间总量。

吞吐率:单位时间内通过某通信信道(a communication channel)或某个节点成功交付数据的平均速率,通常以每秒比特数(bps, bits per second )为单位。

​ 所谓流水线设计实际上是把规模较大、层次较多的组合逻辑电路分为几个级,在每一级插入寄存器组并暂存中间数据。

​ K级流水线就是从组合逻辑的输入到输出恰好有K个寄存器组(分为K级,每一级都有一个寄存器组),上一级的输出是下一级的输入而又无反馈的电路。

上图表示如何将组合逻辑设计转换为相同组合逻辑功能的流水线设计。

组合逻辑包括两级,延迟分析如下:

第一级延迟:max(T1,T3),即T1和T3两个延迟中的最大值。

第二级延迟:T2,即T2的延迟。

总传播延迟:max(T1,T3)+ T2

从输入到输出的每一级插入寄存器后,流水线设计的延迟分析如下:

第一级延迟:max(T1,T3)+ Tco,即第一级寄存器所具有的总的延迟为T1和T3两个延迟中的最大值加上寄存器的Tco(触发时间)。

第二级延迟:T2 + Tco,即第二级寄存器延迟为T2的时延加上Tco

总传输延迟:max(max(T1,T3)+ Tco,(T2 + Tco))

​ 流水线的设计需要两个时钟周期来获取第一个计算结果,而只需要一个时钟周期来获取随后的计算结果。 获取第一个结果所需的两个时钟周期为首次延迟,而执行后面操作所需的一个时钟周期便为吞吐延迟。

3、流水线设计的优缺点

优点:提高吞吐率(throughput)。

假设T1、T2、T3具有相同的传递延迟Tpd。组合逻辑设计和流水线设计的延迟对比如下:

首次延迟 吞吐延迟
组合逻辑设计 2*Tpd 2*Tpd
流水线设计 2*(Tpd+Tco) Tpd+Tco

对于FPGA来说,器件的延迟如T1、T2、T3相对于触发器的Tco要长的多,并且寄存器的建立时间Tsu也要比器件的延迟快的多。如果FPGA硬件能提供快速的Tco,则流水线设计相对于同样功能的组合逻辑设计能提供更大的吞吐量。

缺点:消耗的寄存器资源更多。

将复杂的组合逻辑转换成流水线设计的过程中,为了保证中间的计算结果都在同一时钟内得到,必须在各级之间加入更多的寄存器。

4、实验目的

开发平台:vivado2020.1

开发板:Xilinx Artix-7 xc7a100tfgg676-2

目的:编写一个8位的4级流水线加法器。

5、程序设计

8位4级流水线的RTL代码如下:

//8位4级流水线加法器
module addr_4(input sys_rst_n,input sys_clk,   input cin,       input [7:0] a,   input [7:0] b,//8位流水线加法器   output reg cout,  output reg [7:0] sum,//8位单周期加法器output reg cout1,output reg [7:0] sum1);   //-----------------------------单周期加法器---------------------------------------//
always@(posedge sys_clk or negedge sys_rst_n)
beginif(!sys_rst_n)begincout1<=1'b0;sum1<=8'd0;endelse{cout1,sum1} <= a+b+cin;
end//-------------------------------流水线加法器--------------------------------------//
reg cin_temp;
reg [7:0] a_temp,b_temp;reg firstc,secondc,thirdc;
reg [1:0] firsts;
reg [3:0] seconds;
reg [5:0] thirds;
reg [5:0] a_temp1,b_temp1;
reg [3:0] a_temp2,b_temp2;
reg [1:0] a_temp3,b_temp3;//将输入的值先缓存
always @(posedge sys_clk or negedge sys_rst_n) begin if(!sys_rst_n) begincin_temp <= 1'b0;a_temp <= 7'b0;b_temp <= 7'b0;endelse begincin_temp <= cin;a_temp <= a;b_temp <= b;end
end
//第一级
always @(posedge sys_clk or negedge sys_rst_n) begin if(!sys_rst_n) beginfirstc <= 1'b0;firsts <= 2'b0;a_temp1 <= 6'b0;b_temp1 <= 6'b0;endelse begin{firstc,firsts} <= a_temp[1:0] + b_temp[1:0] + cin_temp;a_temp1 <= a_temp[7:2]; b_temp1 <= b_temp[7:2];end
end
//第二级
always @(posedge sys_clk or negedge sys_rst_n) begin if(!sys_rst_n) beginsecondc <= 1'b0;seconds <= 4'b0;a_temp2 <= 4'b0;b_temp2 <= 4'b0;endelse begin{secondc,seconds[3:2]} <= a_temp1[1:0] + b_temp1[1:0] + firstc;a_temp2 <= a_temp1[5:2]; b_temp2 <= b_temp1[5:2];seconds[1:0] <= firsts;end
end
//第三级
always @(posedge sys_clk or negedge sys_rst_n) begin if(!sys_rst_n) beginthirdc <= 1'b0;thirds <= 6'b0;a_temp3 <= 2'b0;b_temp3 <= 2'b0;endelse begin{thirdc,thirds[5:4]} <= a_temp2[1:0] + b_temp2[1:0] + secondc;a_temp3 <= a_temp2[3:2];b_temp3 <= b_temp2[3:2];thirds[3:0] <= seconds;end
end
//第四级
always @(posedge sys_clk or negedge sys_rst_n) begin if(!sys_rst_n) begincout <= 1'b0;sum <= 2'b0;endelse begin{cout,sum[7:6]} <= a_temp3[1:0] + b_temp3[1:0] + thirdc;sum[5:0] <= thirds;end
endendmodule

Testbech编写如下:

`timescale 1ns / 1ns
//4级流水线加法器
module add_4_tb;addr_4 addr4_inst(.sys_rst_n(sys_rst_n) ,.sys_clk  (sys_clk) ,.cout     (cout) ,.sum      (sum) ,.a        (a) ,.b        (b) ,.cin      (cin) ,.sum1     (sum1) ,.cout1(cout1));
reg            sys_rst_n;
reg            sys_clk;
wire           cout;
wire     [7:0] sum;
reg      [7:0] a;
reg      [7:0] b;
reg            cin;
wire     [7:0] sum1;
wire           cout1;initial beginsys_rst_n = 0;sys_clk = 0;@(posedge sys_clk) beginsys_rst_n = 1;a = 8'd120;b = 8'd100;cin = 1;end$write("sum is %d ,cout is %d\n",sum,cout);$write("sum1 is %d,cout1 is %d\n",sum1,cout1);$write("time is : %t\n",$time);@(posedge sys_clk) beginsys_rst_n = 1;a = 8'd10;b = 8'd255;cin = 1;end$write("sum is %d ,cout is %d\n",sum,cout);$write("sum1 is %d,cout1 is %d\n",sum1,cout1);$write("time is : %t\n",$time);@(posedge sys_clk) beginsys_rst_n = 1;a = 8'd92;b = 8'd33;cin = 0;end $write("sum is %d ,cout is %d\n",sum,cout);$write("sum1 is %d,cout1 is %d\n",sum1,cout1);$write("time is : %t\n",$time);#20$write("sum is %d ,cout is %d\n",sum,cout);$write("sum1 is %d,cout1 is %d\n",sum1,cout1);$write("time is : %t\n",$time);#20$write("sum is %d ,cout is %d\n",sum,cout);$write("sum1 is %d,cout1 is %d\n",sum1,cout1);$write("time is : %t\n",$time);#20$write("sum is %d ,cout is %d\n",sum,cout);$write("sum1 is %d,cout1 is %d\n",sum1,cout1);$write("time is : %t\n",$time);#20$write("sum is %d ,cout is %d\n",sum,cout);$write("sum1 is %d,cout1 is %d\n",sum1,cout1);$write("time is : %t\n",$time);#20$write("sum is %d ,cout is %d\n",sum,cout);$write("sum1 is %d,cout1 is %d\n",sum1,cout1);$write("time is : %t\n",$time);#20$stop;
endalways #10 sys_clk = ~sys_clk;
endmodule

得到仿真结果如下:

5、引用

1、verilog数字系统设计教程

2、深入浅出玩转fpga

流水线加法器的实现(verilog)相关推荐

  1. Verilog 流水线加法器

    <数字系统设计与Verilog HDL>上面有这么一段代码,用于实现8位4级流水线加法器. module adder8pip(cout,sum,cin,ina,inb,clk );inpu ...

  2. 数字IC经典电路(1)——经典加法器的实现(加法器简介及Verilog实现)

    加法器简介及Verilog实现 写在前面的话 经典加法器 8bit并行加法器 8bit超前进位加法器 8bit流水线加法器 8bit级联加法器 总结 写在前面的话 加法器是数字系统最基础的计算单元,用 ...

  3. 加法器的实现(半加器,全加器,行波进位加法器,超前进位加法器,流水线加法器)

    一.半加器和全加器 二.行波进位加法器 三.超前进位加法器(Carry-Lookahead Adder,CLA) https://www.jianshu.com/p/6ce9cad8b467 四.流水 ...

  4. 实验十三 流水线加法器

    (学习笔记!只是笔记) 实验十三 流水线加法器 实验目的 实验内容 实验步骤(请同学们自行完成) 顶层模块,scan_led_hex_disp adder_substractor_32模块 adder ...

  5. 超前进位加法器(附Verilog代码)

    超前进位加法器: 普通全加器(行波进位加法器)是单比特全加器的级联,高位需要低位的进位位,故位宽增大时,加法的组合逻辑不断增大,超前进位加法器解决了这一问题. 优点:不需要等待低位的进位.直接计算就可 ...

  6. 多路选择器,加法器原理及verilog实现

    1.数据选择器是指经过选择,把多个通道的数据传到唯一的公共数据通道上.实现数据选择功能的逻辑电路称为数据选择器,它的作用相当于多个输入的单刀多掷开关.本例程以四选一数据选择器(电平触发)为例. 四选一 ...

  7. FPGA中的流水线设计(含Verilog范例)

    一.流水线设计介绍 在高速通信系统设计中,如何提高系统的工作速度至关重要,通常使用的方法有两种: 1. 并行方式设计:可减少模块间的延时: 2. 流水线设计:流水线设计如同生产线一样,将整个执行过程分 ...

  8. 加法器与减法器verilog

    文章目录 无符号加法器 有符号加法器 有符号减法器 加减法器 TB Reference 减法器中也有类似于半减器.全减器.串行借位减法器之类的,但是为了实现简单和复用代码,计划采用加法器来实现减法器. ...

  9. 加法器的verilog实现(串行进位、并联、超前进位、流水线)

    总结: 从下面的Timing summary来看,流水线的频率最高.并行加法器次之,串行进位加法器再次,超前进位加法器最慢. 按理论,超前进位加法器应该比串行进位加法器快,此处为何出现这种情况,原因未 ...

最新文章

  1. not syncing : corrupted stack end detected inside scheduler解决办法 以及高版本的激活码!
  2. Tuple解决在视图中通过razor获取控制器传递给视图的匿名对象的报错问题
  3. HDLC和 PPP的实验
  4. extjs用iframe的问题
  5. 计算机网络部分(共44题),全国自学考试自考04741计算机网络原理4月考试真题
  6. 树莓派 Raspberry Pi 更换国内源
  7. 兼容PD和QC快充充电器输入单节锂电池2A充电芯片-2号电路板
  8. Sublime Text3设置浏览器预览
  9. jd_seckill 使用记录
  10. 安装telnet服务
  11. 推荐一款MD5解密在线网站
  12. 用友文件服务器不存在,用友T6软件备份提示超时已过期,错误'53'文件不存在
  13. 联通云图片上传官方文档
  14. 2.2数据选择与分析及折线图柱状图Selecting_data_and_analysis_part1
  15. 摩托罗拉手机连接Wifi后提示“网络受限”问题的解决!
  16. 让台式机通过笔记本上网的方法
  17. CTime 和COleDateTime的常用操作和比较
  18. php 7.1.0 下载,PHP7正式版下载|PHP7新特性|PHP32位下载7.1.0-游迅网
  19. 山东师范大学硕士研究生入学考试试题汇总
  20. 大连海事大学电子线路课程设计/频率电压转化器/LM324multisim仿真图与LM331原理图

热门文章

  1. 全国计算机等级考试二级教程c语言程序设计考试大纲,全国计算机等级考试二级C语言程序设计考试大纲.docx...
  2. python 实现双纵轴(y)轴图像的绘制(中文label),解决只显示一个折线label的问题
  3. pms输变电状态监测_智能电网输变电设备综合状态监测系统的设计与实现
  4. java同学录_java校友录系统
  5. 生成式 AI 与强人工智能:探索 AI 技术的未来
  6. DNS解析中的A记录、AAAA记录、CNAME记录、MX记录、NS记录、TXT记录、SRV记录、URL转发等
  7. Vue实现类似Spring官网图片滑动效果
  8. 大数据培训课程MapReduce编程规范
  9. idea点击接口的方法的跳到实现类的快捷键
  10. 1.2生成树协议STP