13 Verilog语法_流水线设计

发布时间 2024-01-07 12:37:09作者: 米联客(milianke)

软件版本:无

操作系统:WIN10 64bit

硬件平台:适用所有系列FPGA

登录"米联客"FPGA社区-www.uisrc.com视频课程、答疑解惑!

1概述

本小节讲解Verilog语法的流水线设计,需要掌握流水线的设计方法。

2流水线简介

2.1 什么是流水线

流水线的基本思想是:把一个重复的过程分解为若干个子过程,每个子过程由专门的功能元件来实现。将多个处理过程在时间上错开,依次通过各功能段,这样每个子过程就可以与其他子过程并行进行。

例:小张在快递站工作,日常任务就是打包快递,打包快递分为四个步骤,称重、打包、贴单和入库,每个步骤耗时5分钟。临近双十一,快递寄送任务变多,小张一个人忙不过来,临时添加三个人一起打包快递,每人负责一个步骤,原先打包4个快递需要80分钟,现在需要35分钟。如图所示:

2.2 设计流水线

设计一个32位的全加器,使用四级流水线。例:

module  full_add (

input           rst_n,

input           clk,

input    [31:0] add_a,

input    [31:0] add_b,

input           c_in,

input           vld,

output   [31:0] add_sum,

output          c_out,

output          sum_vld

);

 

reg         c_in_ff;

reg [31:0]  add_a_ff;

reg [31:0]  add_b_ff;

reg [31:0]  add_a_1;

reg [31:0]  add_b_1;

reg [31:0]  add_a_2;

reg [31:0]  add_b_2;

reg [31:0]  add_a_3;

reg [31:0]  add_b_3;

 

reg         vld_temp;

reg         vld_1;

reg         vld_2;

reg         vld_3;

reg         sum_vld;

reg         cout1;

reg         cout2;

reg         cout3;

reg         c_out;

reg [7:0]   sum1;

reg [15:0]  sum2;

reg [23:0]  sum3;

reg [31:0]  add_sum;

always@(posedge clk or negedge rst_n) //输入数据的四级缓存

begin

if (!rst_n)

    begin

        c_in_ff  <= 'd0;

        add_a_ff <= 'd0;

        add_a_1  <= 'd0;

        add_a_2  <= 'd0;

        add_a_3  <= 'd0;            

        add_b_ff <= 'd0;

        add_b_1  <= 'd0;

        add_b_2  <= 'd0;

        add_b_3  <= 'd0;            

        vld_temp <= 'd0;

        vld_1    <= 'd0;

        vld_2    <= 'd0;

        vld_3    <= 'd0;

        sum_vld  <= 'd0;

    end

else

    begin

        c_in_ff  <= c_in;

        add_a_ff <= add_a;

        add_a_1  <= add_a_ff;

        add_a_2  <= add_a_1;

        add_a_3  <= add_a_2;

        add_b_ff <= add_b;

        add_b_1  <= add_b_ff;

        add_b_2  <= add_b_1;

        add_b_3  <= add_b_2;

        vld_temp <= vld;

        vld_1    <= vld_temp;

        vld_2    <= vld_1;

        vld_3    <= vld_2;

        sum_vld  <= vld_3;          

    end

end

always@(posedge clk or negedge rst_n) //四级流水线设计

begin

    if (!rst_n)

        begin

            sum1     <= 8'b0;

            sum2     <= 16'd0;

            sum3     <= 24'd0;

            add_sum  <= 32'd0;

            cout1    <= 1'b0;

            cout2    <= 1'b0;

            cout3    <= 1'b0;

            c_out    <= 1'b0;              

        end

    else

        begin

            {cout1,sum1}        <=  9'b0+add_a_ff[7:0]  +add_b_ff[7:0]  +c_in_ff;

            {cout2,sum2}        <= {9'b0+add_a_1[15:8]  +add_b_1[15:8]  +cout1,sum1};

            {cout3,sum3}        <= {9'b0+add_a_2[23:16] +add_b_2[23:16] +cout2,sum2};

            {c_out,add_sum  }   <= {9'b0+add_a_3[31:24] +add_b_3[31:24] +cout3,sum3};              

        end        

end

endmodule

流水线设计就是将路径系统的分割成一个个数字处理单元,并在各个处理单元之间插入寄存器来暂存中间阶段的数据。被分割的单元能够按阶段并行的执行,相互间没有影响。所以最后流水线设计能够提高数据的吞吐率,即提高数据的处理速度。