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

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

相关推荐
仲南音17 小时前
Xilinx FPGA——时钟IP核MMCM、PLL
fpga开发
I'm a winner1 天前
基于Xilinx FPGA的LVDS高速串行通信系统(三)--数据训练及握手机制【文末源码】
fpga开发
upper20201 天前
coremark移植坑之-nostartfiles -nostdlib参数
学习·fpga开发·coremark移植·riscv设计
Eloudy2 天前
Vivado 纯命令行构建 FPGA 项目教程
fpga开发
Rambo.xia2 天前
AXI跨时钟域与数据一致性——CDC FIFO深度不够、写后读冒险、多Master仲裁、乱序返回,出了Bug根本查不出来
fpga开发·bug
upper20202 天前
FPGA部署卷积神经网络识别MINST图片
fpga开发·卷积神经网络·minst·minst识别·部署神经网络·神经网络识别图片
你是我的解忧王子2 天前
嵌入式 ADC采样 原始数据分析上层(平均值 波动率 正态分布 线性补偿 系统误差)
fpga开发·数据挖掘·数据分析
9527华安3 天前
FPGA纯verilog代码ISP图像处理培训教程,基于IMX214,提供工程源码+视频教程+FPGA开发板
图像处理·fpga开发·isp·imx214·mipi
千寻xun3 天前
二、实战篇-NVME SSD控制之ZYNQ实现(六)-读写NVME SSD硬盘数据
fpga开发·nvme·nvme ssd
千寻xun3 天前
二、实战篇-NVME SSD控制之ZYNQ实现(三)
fpga开发·nvme ssd·nvme协议