米联客-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

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

相关推荐
邹莉斯2 小时前
FPGA基本结构和简单原理
fpga开发·硬件工程
悲喜自渡7212 小时前
易灵思FPGA开发(一)——软件安装
fpga开发
ZxsLoves2 小时前
【【通信协议ARP的verilog实现】】
fpga开发
爱奔跑的虎子4 小时前
FPGA与Matlab图像处理之伽马校正
图像处理·matlab·fpga开发·fpga·vivado·xilinx
机器未来21 小时前
基于FPGA的SD卡的数据读写实现(SD NAND FLASH)
arm开发·嵌入式硬件·fpga开发
贾saisai1 天前
Xilinx系FPGA学习笔记(八)FPGA与红外遥控
笔记·学习·fpga开发
吉孟雷2 天前
ZYNQ FPGA自学笔记
fpga开发·verilog·led·仿真·vivado·zynq
行者..................2 天前
1. ZYNQ 2. MPSOC 3. FPGA 4. IO分配 5. 硬件设计
fpga开发
tsumikistep2 天前
【无标题】Efinity 0基础进行流水灯项目撰写(FPGA)
fpga开发
行者..................2 天前
FPGA学习 VIVADO Verilog 编程
学习·fpga开发