文章目录

  • 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. NutzWk 5.2.4 发布,Java 微服务分布式开发框架
  2. anaconda安装yolov3_YOLOv3_图像识别_神经网络_人工智能
  3. ModuleNotFoundError: No module named ‘mmcv._ext‘
  4. Eclipse里web的依赖工程部署的简便方法
  5. ThreadLocal的两种用法总结
  6. 的it生活_在日本生活了10年的IT女,聊聊回国工作的亲身经历
  7. .NET LINQ分析AWS ELB日志避免996
  8. c语言程序综合实习学生成绩,C语言程序设计综合实习报告
  9. 几种在shell命令行中过滤adb logcat输出的方法
  10. 四、Spring中使用@Conditional按照条件注册Bean
  11. HBase数据模型和读写原理
  12. linux内存源码分析 - 内存池
  13. android原生滑块验证
  14. 开源版禅道与jira bug关联
  15. QT的UI界面效果预览快捷键
  16. yum install 命令报错Could not retrieve mirrorlist
  17. jar启动出错:Failed to get nested archive for entry BOOT-INF/lib/activiti-core-common-dependencies-7.1.0
  18. 北理工2013《Java程序设计》课程设计要求
  19. 需求开发应用部署“一条龙”,平安云如何加速容器场景落地
  20. Oracle PURGE子句清除回收站中的对象

热门文章

  1. 苹果键盘怎么手写_支持9种外语语音识别,新增4款外语键盘,搜狗输入法10.8版本上线丨18周新闻...
  2. (翻译)完成模式(Completion)
  3. CompletableFuture.thenCompose
  4. enet java 可靠udp,可靠的UDP编程(ENET库)
  5. 74HC244;74HCT244——三态八路缓冲器/线路驱动器
  6. PDU(Protocol Data Unit)协议数据单元
  7. cmc色差的matlab程序,CIEDE2000 色差公式 CMC 容差方法 CIE LAB
  8. http小型服务器搭建
  9. 鸡啄米vc++2010系列27(列表视图控件List Control 上)
  10. Opengl全家桶!附赠gltools!!蓝宝书读者福利!