[X]关闭

13 Verilog语法_流水线设计

文档创建者:uisrc
浏览次数:1538
最后更新:2024-01-07
FPGA基础知识
FPGA基础: FPGA编程语言 » Verilog编程入门
软件版本:无
操作系统:WIN10 64bit
硬件平台:适用所有系列FPGA
登录"米联客"FPGA社区-www.uisrc.com视频课程、答疑解惑!
1概述
本小节讲解Verilog语法的流水线设计,需要掌握流水线的设计方法。
2流水线简介2.1 什么是流水线
流水线的基本思想是:把一个重复的过程分解为若干个子过程,每个子过程由专门的功能元件来实现。将多个处理过程在时间上错开,依次通过各功能段,这样每个子过程就可以与其他子过程并行进行。
例:小张在快递站工作,日常任务就是打包快递,打包快递分为四个步骤,称重、打包、贴单和入库,每个步骤耗时5分钟。临近双十一,快递寄送任务变多,小张一个人忙不过来,临时添加三个人一起打包快递,每人负责一个步骤,原先打包4个快递需要80分钟,现在需要35分钟。如图所示:
2504661-20240107123533809-1058608952.jpg
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


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

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则