一、什么是流水线?
流水线设计是系统划分组合逻辑,在各部分(级)之间插入寄存器,临时存储中间数据的方法。目的是把一个大的操作分解成几个小的操作,每个小操作的时间短,所以可以增加频率,每个小操作可以并行执行,所以可以提高数据吞吐率(处理速度)。
二、什么时候用流水线设计?
流水线的使用通常是在时序比较紧,电路工作频率比较高的时候。典型情况如下:
1)功能模块之间的流水线使用乒乓缓冲来交换数据。代价是增加内存的数量,但与巨大的性能提升相比,可以忽略不计。
2) I/O瓶颈。比如某个操作需要输入8个数据,而memroy只能同时提供2个数据。如果操作步骤划分得当,使用流水线反而会减少面积。
3)片内sram的读操作,因为sram的读操作本身就是一个两极流水线,除非下一步操作依赖于读结果,否则自然要用流水线。
4)组合逻辑过长,如(a b)*c,所以在加法和乘法之间插入寄存器比较安全。
三、使用管道的优缺点
1)优点:流水线缩短了给定信号在一个时钟周期内必须经过的路径长度,提高了数据吞吐量,从而提高了时钟频率,但也导致了数据延迟。例子如下:例如一个2级组合逻辑,假设每一级的延迟与Tpd相同,
1.无流水线总延迟为2Tpd,一个时钟周期即可完成,但时钟周期限制为2 tpd
2.装配线:
每一级加入寄存器后(延迟为Tco),单级的延迟为Tpd Tco,每一级消耗一个时钟周期。流水线需要两个时钟周期才能得到第一个计算结果,称为第一个延迟,需要2*( Tpd Tco)。但是,当重复运算时,只需要一个时钟周期就可以得到最终的计算结果,这就是所谓的吞吐量延迟(Tpd Tco)。可见,只要Tco小于Tpd,流水线就能提速。特别是流水线减少的不是单个操作的时间,而是整个数据的操作时间。请仔细感受。
2)缺点:功耗增加,面积增大,硬件复杂度增加。特别是对于cpu等复杂逻辑的流水线,流水线越深,需要hold流水线或reset流水线时,时间损耗越大。所以,用流水线不是有利无害的,需要权衡。
第四个8位流水线加法器的一个小例子
非管道:
模块添加8(
一,
b,
c);
输入[7:0]a;
输入[7:0]b;
输出[8:0]c;
赋值c[8:0]={1'd0,a} {1'd0,b };
末端模块
采用两级流水线:第一级低4位,第二级高4位,所以第一个输出需要2个时钟周期才有效,后续数据都是1个周期。
之后就有效了。
模块地址8_2(
clk,
cin,
西纳,
cinb,
总和,
cout);
输入clk
输入CIN;
输入[7:0]Cina;
输入[7:0]cinb;
输出[7:0]sum;
输出cout
注册cout
reg cout1//插入的寄存器
reg[3:0]sum 1;//插入的寄存器
reg[7:0]sum;
cina _ reg
reg[3:0]cinb _ reg;//插入的寄存器
Always @(posedge clk) //第一级流水
开始
{cout1,sum 1 }=Cina[3:0]cinb[3:0]CIN;
结束
始终@(posedge时钟)
开始
Cina _ reg=Cina[7:4];
cinb _ reg=cinb[7:4];
结束
Always @(posedge clk) //第二级流水
开始
{cout,sum[7:0]}={
标签:流水线数据逻辑