FPGA中的流水线操作

 


前言

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频率可以上的更高从而实现性能的提升,对于图像处理中使用流水的看法,可以在遍历一遍图像之后,就可以得出相应处理后的图像,并且通过模块的重复使用,可以提升各种需要多点重复性算法的性能。
本文仅仅简单介绍了流水操作设计思想的使用,不足之处多多包涵。

  • 7
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值