FPGA流水线技术原理与实例

来源:互联网 发布:邮轮上有网络吗 编辑:程序博客网 时间:2024/05/21 16:58

在FPGA学习中,流水线技术是FPGA工程师必须要了解的一个重要知识点,我在面试的时候面试官详细问过流水线的知识,因此,这里总结一下流水线知识。
第一, 有哪些模块可以用流水线的方式。
一般的定义是如果某个设计的处理流程可分为若干步骤,而且整个数据处理是“单流向”的,即没有反馈或者迭代运算,且前一个步骤的输出是下一个步骤的输入,则可以考虑采用流水线设计方法来提高系统频率。从这里我们可以看出,流水线就是将我们的以前的大逻辑块分解为小逻辑块,以此来降低寄存器间的传播时延,从而保证系统维持在一个高的系统时钟速度。
第二,那这优势又是啥那?
因为在FPGA,关键路径延迟的倒数就是系统可以到达的最大运行频率,而关键路径就是定义为由非时钟逻辑元件引起的最大延迟。因此就可以看出,降低寄存器使用就可以有效减小关键路径的时延,从而提高运行频率。可以看出,流水线技术可以有效的提高运行速度。
下面是一个我采用的4级流水线加法器的代码模块
//////4级流水线结构

module top(clk,rst_n,din1,din2,cin,cout,sum    );input clk,rst_n;input cin;input [7:0] din1,din2;output reg cout;output reg [7:0] sum;reg [1:0] sum_temp;reg cout_temp;reg [3:0] sum_temp1;reg cout_temp1;reg [5:0] sum_temp2;reg cout_temp2;reg [5:0] a,b;reg [3:0] a1,b1;reg [1:0] a2,b2;always@(posedge clk)begin    if(!rst_n)        begin            cout_temp<=1'b0;            sum_temp<=2'd0;            a<=6'd0;            b<=6'd0;        end    else        begin            {cout_temp,sum_temp}<=din1[1:0]+din2[1:0]+cin;             a<=din1[7:2];             b<=din2[7:2];        endendalways@(posedge clk)begin    if(!rst_n)        begin            cout_temp1<=1'b0;            sum_temp1<=4'd0;            a1<=4'd0;            b1<=4'd0;        end    else        begin            {cout_temp1,sum_temp1}<={{1'b0,a[1:0]}+{1'b0,b[1:0]}+cout_temp,sum_temp};            a1<=a[5:2];            b1<=b[5:2];        endendalways@(posedge clk)begin    if(!rst_n)        begin            cout_temp2<=1'b0;            sum_temp2<=6'd0;            a2<=2'd0;            b2<=2'd0;        end    else        begin            {cout_temp2,sum_temp2}<={{1'b0,a1[1:0]}+{1'b0,b1[1:0]}+cout_temp1,sum_temp1};            a2<=a1[3:2];            b2<=b1[3:2];        endendalways@(posedge clk)begin    if(!rst_n)        begin            cout<=1'b0;            sum<=8'd0;        end    else        begin            {cout,sum}<={{1'b0,a2[1:0]}+{1'b0,b2[1:0]}+cout_temp2,sum_temp2};        endendendmodule