1.流水线设计的概念

所谓流水线设计,实际上就是把规模较大、层次较多的组合逻辑电路分为几级,在每一级插入寄存器组并暂存中间数据。K级流水线就是从组合逻辑的输入到输出恰好有K个寄存器组,上一级的输出是下一级的输入而又无反馈的电路。

2.流水线的作用

(1)流水线可以提高电路的吞吐率

吞吐率就是数据输入机器的速率或处理数据的速率。吞吐率最终受到以下几种具有最大传播延时的通路的限制:

a. 原始输入到一个寄存器的通路;

b. 一对寄存器间的通路;

c. 由寄存器到原始输出间的通路;

d. 从一个原始输入到原始输出间的通路。

每种情况下,组合逻辑都限制了机器的性能。作为一种能够提高电路性能的可选方法,可以将流水线型寄存器插入到组合逻辑的关键位置上,将逻辑分割成具有更短路径的群组。流水线技术减少了组合逻辑中的级数,缩短了存储元件之间的数据通路,并且因为能用更高的时钟频率而提高了电路的吞吐能力。

(2)流水线提高了电路的频率

假设通过原多级组合逻辑的最长路径的时间为Tmax,则工作频率为 f1 = 1 / Tmax。如果用寄存器可以将该路径从中间切开,创建两个逻辑块,每个都具有最大时间长度 Tmax / 2,那么流水线型电路将可以工作在 f2 = 2 / Tmax = 2f1 的频率上。

需要注意的是:数据通路的划分必须要保证数据的相关性——从原始输入到原始输出的所有数据通路必须要穿过同样数量的流水线寄存器。如下图所示的四选一电路中,插入流水线寄存器时,不仅要在MUX1、MUX2之后,在MUX3的select端同样需要一个流水线寄存器。若没有这个寄存器,会导致选择信号 s[1] 到达MUX3的时间点和MUX1、MUX2的输出到达MUX3的时间点不一致。

插入流水线寄存器后(三个寄存器,分别在两个MUX之后和s[1]):

3.流水线深度越大越好吗?

上面讲到了流水线的优点:可以缩短时钟的周期并提高吞吐能力。而流水线的缺点在于:

(1)产生了输入-输出延迟:由于插入了流水线寄存器,会导致第一个输出必须在K个clk之后才能得到。而之后每个clk都能得到一个输出。

(2)流水线技术是用空间(硬件)的复杂度来换取时间(性能)的复杂度。由上述分析可知,电路中插入了流水线计数器,必然会导致电路的面积增大。

所以:流水线深度并不是越大越好。在提高电路速度和吞吐的同时,电路的面积也随之加大。所以必须根据具体的需求来对流水深度进行择优选择。

4.什么时候采用流水线?

        设计中应采用最小数目的流水线寄存器来获取最短的循环周期。在关键路径上的时间裕度无法满足时,就要考虑使用流水线技术。

5.流水线设计实例:流水线型加法器

        对于两个8位加法器串行连接形成的16位加法器,电路图:

verilog代码:

adder.v

module adder (c_in,a,b,sum,c_out
);input            c_in    ;input    [7: 0]  a, b    ;output   [7: 0]  sum     ;output           c_out   ;assign { c_out, sum } = a + b + c_in;endmodule

top.v

module top (c_in,a,b,sum,c_out
);input               c_in    ;input    [15: 0]    a, b    ;output   [15: 0]    sum     ;output              c_out   ;wire                 cout1   ;adder adder1 (.c_in   ( c_in      ),.a     ( a[7: 0]   ),.b     ( b[7: 0]   ),.sum   ( sum[7: 0] ),.c_out ( cout1    )); adder adder2 (.c_in   ( cout1      ),.a     ( a[15: 8]   ),.b     ( b[15: 8]   ),.sum   ( sum[15: 8] ),.c_out ( c_out     )); endmodule

      

插入流水线寄存器后的电路:

verilog:

module adder_pipe(a,b,c_in,clock,sum,c_out);input   [15: 0]     a, b        ;input               c_in, clock ;output  [15: 0]     sum         ;output              c_out       ;reg      [32: 0]     IR          ;reg      [24: 0]     PR          ;reg      [16: 0]     OR          ;assign  { c_out, sum }  =   OR  ;always @( posedge clock ) begin// load input registerIR[0]       <=  c_in        ;IR[ 8: 1]   <=  a[ 7: 0]    ;IR[16: 9]   <=  b[ 7: 0]    ;IR[24: 17]  <=  a[15: 8]    ;IR[32: 25]  <=  b[15: 8]    ;// load pipeline registerPR[24: 17]  <=  IR[32: 25]  ;PR[16:  9]  <=  IR[24: 17]  ;PR[ 8:  0]  <=  IR[16:  9] + IR[8: 1] + IR[0]   ;OR          <=  {{ 1'b0, PR[24: 17] } + { 1'b0, PR[16: 9] } + PR[8] + PR[7: 0] }   ;endendmodule

流水线(pipeline)设计详解+实例:为什么要用流水线?流水线的作用和优缺点?流水线深度越大越好吗?什么时候采用流水线?相关推荐

  1. HDL输入设计详解攻略

    Altera公司的Quartus为设计者提供了多种设计输入方法,包括原理图输入.状态图输入.HDL语言描述.网络表文件等,所不同的是,Quartus可以在一个工程中同时使用VHDL.Verilog语言 ...

  2. UWA Pipeline 功能详解|如何快速创建UWA服务

    今天为大家详细介绍的是如何在一条UWA Pipeline内快速创建UWA服务,包括自动化测试.GOT Online测试.真人真机测试.本地资源检测服务,让UWA性能保障体系无缝融入到项目工业化之中,进 ...

  3. ueditor上传组件显示乱码_最全面的移动端 UI组件设计详解:中篇

    上一期给大家讲解了<最全面的移动端UI组件设计详解:上篇>,主要分享了:布局组件和导航组件2个部分:这次给大家带来:基础组件.表单组件和反馈组件详解,希望你在设计APP.小程序.H5页面中 ...

  4. 常用经典SQL语句大全完整版--详解+实例 (存)

    常用经典SQL语句大全完整版--详解+实例 转 傻豆儿的博客 http://blog.sina.com.cn/shadou2012  http://blog.sina.com.cn/s/blog_84 ...

  5. java 重启线程_java 可重启线程及线程池类的设计(详解)

    了解JAVA多线程编程的人都知道,要产生一个线程有两种方法,一是类直接继承Thread类并实现其run()方法:二是类实现Runnable接口并实现其run()方法,然后新建一个以该类为构造方法参数的 ...

  6. Message,MessageQueue,Looper,Handler详解+实例

    Message,MessageQueue,Looper,Handler详解+实例 原文地址 Android的Handler使用(这篇简单介绍Handler的使用) 一.几个关键概念 1.Message ...

  7. 分布式 | Dubbo 架构设计详解

    转载自   分布式 | Dubbo 架构设计详解 Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务 ...

  8. 【转】图形流水线中坐标变换详解:模型矩阵、视角矩阵、投影矩阵

    转自:图形流水线中坐标变换详解:模型矩阵.视角矩阵.投影矩阵_sherlockreal的博客-CSDN博客_视角矩阵 图形流水线中坐标变换详解:模型矩阵.视角矩阵.投影矩阵 图形流水线中坐标变换过程 ...

  9. Oracle Merge Into 的用法详解实例

    Oracle merge into 的用法详解实例 作用:merge into 解决用B表跟新A表数据,如果A表中没有,则把B表的数据插入A表: 语法: MERGE INTO [your table- ...

最新文章

  1. 第四次作业-团队介绍
  2. IDEA常用快捷键整理
  3. jira以及jira API简单介绍
  4. 雅思听力的词语练习打字!!!
  5. Tomcat上下文JUnit @Rule
  6. 如何用代码爬抓电商数据(附淘宝API调用实例)
  7. Eclipse + Spring + maven Building a RESTful Web Service ---需要添加注释
  8. 以二进制输出64位类型的数据_Java入门第五课:Java基本数据类型与变量的声明...
  9. bzoj1051 [HAOI2006]受欢迎的牛
  10. 使用python调用浏览器实现自动转发微博
  11. CH579 以太网转串口 串口服务器代码
  12. wsimport命令介绍
  13. 通过PHP访问MYSQL外文书籍,通过PHP访问MySQL外文翻译(模版2)
  14. 计算机用户没有管理员权限,电脑没有管理员权限怎么办
  15. python反转整数的几种方法_小白python整数反转
  16. linux任务调度crontab和at
  17. fpga+ADS1256
  18. uniapp实现退款理由的界面
  19. python 图片文字识别orc
  20. 3年Android开发工程师面试经验分享,先收藏了

热门文章

  1. P1542 包裹快递
  2. Qt使用Ogre引擎开发3d项目
  3. MySQL 解压包 安装
  4. Mac 下输入法的比较与选择,rime,鼠须管
  5. “王鹏你妹”让人笑不起来
  6. linux ntp时间源服务器,NTP时间服务器
  7. session的removeAttribute()和invalidate()的区别 1
  8. PID控制学习--原理(一)
  9. 计算机ip地址配置参数,如何正确设置电脑的IP地址和DNS等参数[图文]
  10. windows 7编辑启动菜单 bcdedit linux,windows7系统下删除wubi安装的ubuntu启动项使用命令bcdedit解决...