前言
FPGA中的流水线操作是FPGA的优势之一,可以并行的进行单向数据流处理,提高数据处理速度。
一、什么是流水操作?
就是需要N步处理一组数据时,处理单元的前级输入是上一个处理单位的后级输出,可以M组数据同时输入并行流入处理单元,实现原本需要N个的处理单元的时间t之和(t*N)输出一次,在固定延迟之后,以每t个时间输出一次。
二、代码
1.实现了c= (a*b + a)*b的流水计算;
代码如下(示例):
module run_water (
input clk ,
input _rst ,
input [7:0] a ,
input [7:0] b ,
output[15:0] c
);
reg [7:0] a1 = 'd0;
reg [7:0] a2 = 'd0;
reg [7:0] a3 = 'd0;
reg [7:0] a4 = 'd0;
reg [7:0] b1 = 'd0;
reg [7:0] b2 = 'd0;
reg [7:0] b3 = 'd0;
reg [7:0] b4 = 'd0;
reg [16:0] c1 = 'd0;
reg [16:0] c2 = 'd0;
reg [16:0] c3 = 'd0;
reg [16:0] c4 = 'd0;
assign c = c3;
always @(posedge clk or negedge _rst) begin
if (!_rst) begin
a1 <= 'd0;
b1 <= 'd0;
end
else begin
a1 <= a;
b1 <= b;
// (a*b + a)b
a2 <= a1;
b2 <= b1;
a3 <= a2;
b3 <= b2;
c1 <= a1 * b1;
//c4 <= c1;
c2 <= c1 + a2;
c3 <= c2 * b3;
end
end
always @(posedge clk or negedge _rst) begin
a4 = a;
b4 = b;
c4 = (a4*b4 + a4)*b4;
end
endmodule
2.仿真结果
这里由于(a*b+a)*b,+a与)*b的时候要用到第一级的输入,所以对输入数据做了三次的流水(缓存?!),c3是最终的输出,(2*3+2)*3=24,(3*4+3)*4=60,(4*5+4)*5=120,结果是符合的。
然而这种延迟较小的组合逻辑门延迟很低,完全可以放在一个时钟周期内计算,如上图。
总结
对于组合逻辑使用流水的看法,流水操作可以降低复杂组合逻辑的门延迟,以达到解决时序违例的问题,流水后路径延迟减小,clk频率可以上的更高从而实现性能的提升,对于图像处理中使用流水的看法,可以在遍历一遍图像之后,就可以得出相应处理后的图像,并且通过模块的重复使用,可以提升各种需要多点重复性算法的性能。
本文仅仅简单介绍了流水操作设计思想的使用,不足之处多多包涵。