FPGA中流水线的详细解析

流水线

流水线技术几乎是最常用的提供系统工作速率的强有力手段。
• 它是面积换取速度思想的又一种具体体现。
考虑一个电路每个时钟周期执行N个操作,工作频率为F。我们可以认为吞吐量为 N*F ops/sec。
• Pipeline本质上是通过增加F来提高吞吐量,达到latency和area的tradeoff。
• 什么决定了最高工作频率呢?
• 回忆static timing analysis
• 在flip flops之间的最大延时
时序电路之间的组合电路延时决定整个电路的速度,即最大工作时钟频率
FPGA中流水线的详细解析_第1张图片
通过将Algorithm算法分为两个部分,在中间插入触发器;
FPGA中流水线的详细解析_第2张图片

流水线技术

其思想是利用寄存器将一条长路径切分成几段小路径,从而达到提高工作速率的作用。
• 假设原路径延时为t,加入2级流水线并且假设路径切割均匀,则路径延时可以减少到约t/3,从而系统速率
可以提高到原来的3倍左右。
• 当然要注意的是输出同时会往后推迟3个时钟周期。所以采用流水线技术时,要记得进行时序调整;

一个加法器的例子

不使用流水线
module add(a, b, c);
input [7:0] a;
input [7:0] b;
output [8:0] c;
assign c[8:0] = {1’d0, a} + {1’d0, b};
endmodule

采用两级流水线:第一级低 4bit,第二级高 4bit,进位信号缓存后在第二个时钟一起计算
module add(clk,cin,cina,cinb,sum,cout);

input clk;
input cin;
input [7:0] cina;
input [7:0] cinb;
output [7:0] sum;
output cout;

reg cout;
reg cout1; //插入寄存器
reg [3 :0 ] sum1 ; //插入寄存器
reg [7 :0 ] sum;
reg [3:0] cina_reg; //插入寄存器
reg [3:0] cinb_reg;//插入寄存器

always @(posedge clk) //第一级流水
begin
{cout1 , sum1} <= cina[3:0] + cinb [3:0] + cin ;
end

always @(posedge clk)
begin
cina_reg <= cina[7:4];
cinb_reg <= cinb[7:4];
end

always @(posedge clk) //第二级流水
begin
{cout ,sum[7:0]} <= { {1’b0,cina_reg[3:0]} + {1’b0,cinb_reg[3:0]} + cout1 ,sum1[3:0]} ;
end
endmodule

总结来说就是规模较大、层次较多的组合逻辑电路不采用流水线的时候,给一个输入需要一段时间输出,中途不可以更改输入,因为是组合逻辑;加入流水线之后,每个时钟周期都会完成一部分,除去开头的几个时钟周期,速度就比不加入流水线的快了!

你可能感兴趣的:(FPGA)