zoukankan      html  css  js  c++  java
  • 流水线设计 转:http://www.opengpu.org/forum.php?mod=viewthread&tid=2424

    提高设计频率之基本功:流水线设计(pipeline Design)

    第一、什么是流水线 流水线设计就是将组合逻辑系统地分割,并在各个部分(分级)之间插入寄存器,并暂存中间数据的方法。目的是将一个大操作分解成若干的小操作,每一步小操作的时间较小,所以能提高频率,各小操作能并行执行,所以能提高数据吞吐率(提高处理速度)。% k$ y0 q5 D/ G* ^

    SoC Vista -- 开源IP通吃岛" m" O  g' L. s( l: P. o; ~

    第二、什么时候用流水线设计7 l( h; A$ T6 O1 Z# M6 ]3 X    使用流水线一般是时序比较紧张,对电路工作频率较高的时候。典型情况如下:      

    1)功能模块之间的流水线,用乒乓buffer来交互数据。代价是增加了memory的数量,但是和获得的巨大性能提升相比,可以忽略不计。      

    2)I/O瓶颈,比如某个运算需要输入8个数据,而memroy只能同时提供2个数据,如果通过适当划分运算步骤,使用流水线反而会减少面积。       

    3)片内sram的读操作,因为sram的读操作本身就是两极流水线,除非下一步操作依赖读结果,否则使用流水线是自然而然的事情。 8 b    

    4)组合逻辑太长,比如(a+b)*c,那么在加法和乘法之间插入寄存器是比较稳妥的做法。


    第三、使用流水线的优缺点:       

    1)优点:流水线缩短了在一个时钟周期内给的那个信号必须通过的通路长度,增加了数据吞吐量,从而可以提高时钟频率,但也导致了数据的延时。举例: 

    例如:一个2级组合逻辑,假定每级延迟相同为Tpd,. Y9 a9 a) @7 C, S2 o0 x: f$ |1.  无流水线的总延迟就是2Tpd,可以在一个时钟周期完成,但是时钟周期受限制在2Tpd; 2.  流水线:" d" N7 d7 H- f! D4 R4 h; \   每一级加入寄存器(延迟为Tco)后,单级的延迟为Tpd+Tco,每级消耗一个时钟周期,流水线需要2个时钟周期来获得第一个计算结果,称为首次延迟,它要2*(Tpd+Tco),但是执行重复操作时,只要一个时钟周期来获得最后的计算结果,称为吞吐延迟(Tpd+Tco)。可见只要Tco小于Tpd,流水线就可以提高速度。特别需要说明的是,流水线并不减小单次操作的时间,减小的是整个数据的操作时间,请大家认真体会
    2) 缺点:( B/ d6 C' p3 ^0 ~" j:功耗增加,面积增加,硬件复杂度增加,特别对于复杂逻辑如cpu的流水线而言而言,流水越深,发生需要hold 流水线或reset 流水线的情况时,时间损失越大。所以使用流水线并非有利无害,大家需权衡考虑。

    第四、一个8bit流水线加法器的小例子。 非流水线:

    1. module add8(a, b, c);
    2.    input  [7:0] a;
    3.    input  [7:0] b;+
    4.    output [8:0] c;
    5.     assign   c = {1'b0, a} + {1'b0, b};
    6. endmodule


    采用两级流水线:第一级低4bit,第二级高4bit,所以第一个输出需要2个时钟周期有效,后面的数据都是1个周期之后有效。

    1. module adder8_2(cout,sum ,clk ,cina ,cinb ,cin);
    2.    output [7:0] sum;
    3.    output cout ;
    4.    input [7:0] cina ,cinb ;
    5.    input clk ,cin ;
    6.    reg cout ;
    7.    reg cout1 ; ////插入的寄存器
    8.    reg[3 :0 ]sum1 ; //插入的寄存器
    9.    reg[7 :0 ]sum;
    10.    reg[3:0] cina_reg,cinb_reg;//插入的寄存器,
    11.    always @(posedge clk)begin
    12.     {cina_reg,cinb_reg} <= {cina[7:4],cinb[7:4]};
    13.    end
    14.   
    15.    always @(posedge clk)  //第一级流水
    16.    begin
    17.       {cout1 , sum1} <= cina[3:0] + cinb [3:0] +cin ;
    18.   end
    19.    always @(posedge clk)  //第二级流水.
    20.    begin
    21.      {cout ,sum} <= {{1'b0,cina_reg} + {1'b0,cinb_reg} + cout1 ,sum1} ;
    22.    end
    23. endmodule
  • 相关阅读:
    字符串 CSV解析 表格 逗号分隔值 通讯录 电话簿 MD
    Context Application 使用总结 MD
    RxJava RxPermissions 动态权限 简介 原理 案例 MD
    Luban 鲁班 图片压缩 MD
    FileProvider N 7.0 升级 安装APK 选择文件 拍照 临时权限 MD
    组件化 得到 DDComponent JIMU 模块 插件 MD
    gradlew 命令行 build 调试 构建错误 Manifest merger failed MD
    protobuf Protocol Buffers 简介 案例 MD
    ORM数据库框架 SQLite 常用数据库框架比较 MD
    [工具配置]requirejs 多页面,多入口js文件打包总结
  • 原文地址:https://www.cnblogs.com/sccdlyc/p/2539757.html
Copyright © 2011-2022 走看看