米联客-FPGA程序设计Verilog语法入门篇连载-13 Verilog语法_流水线设计

软件版本:无

操作系统:WIN10 64bit

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

板卡获取平台:https://milianke.tmall.com/

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

1 概述

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

2 流水线简介

2.1 什么是流水线

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

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

2.2 设计流水线

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

cpp 复制代码
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

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

相关推荐
简简单单做算法41 分钟前
基于FPGA的图像退化算法verilog实现,分别实现横向和纵向运动模糊,包括tb和MATLAB辅助验证
fpga开发·verilog·图像退化
通信小小昕7 小时前
FPGA|Verilog-自己写的SPI驱动
fpga开发
太爱学习了19 小时前
AXI接口总结
fpga开发
博览鸿蒙1 天前
FPGA前端设计适合哪些人学?该怎么学?
fpga开发
北京阿尔泰科技厂家1 天前
2路模拟量同步输出卡、任意波形发生器卡—PCIe9100数据采集卡
fpga开发·工业自动化·数据采集卡·任意波形发生器·模拟量输出卡
szxinmai主板定制专家1 天前
基于ARM+FPGA的高端伺服驱动与运动控制解决方案
大数据·arm开发·人工智能·fpga开发·架构
通信小小昕2 天前
FPGA|Verilog-SPI驱动
fpga开发·蓝桥杯·优化·verilog·spi·竞赛
TJ_Dream2 天前
clk_prepare函数详细解析
驱动开发·fpga开发
起床学FPGA2 天前
IBUF和BUFG
fpga开发
_Hello_Panda_2 天前
基于AMD AU15P FPGA的SLVS-EC桥PCIe设计方案分享
fpga开发