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

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

相关推荐
szxinmai主板定制专家11 分钟前
基于FPGA的热电偶测温数据采集系统,替代NI的产品(二)总体设计方案
arm开发·人工智能·嵌入式硬件·fpga开发
I'm a winner1 小时前
FPGA+护理:跨学科发展的探索(二)
笔记·fpga开发
晓晓暮雨潇潇13 小时前
FPGA开发技能(11)用iperf测试网络性能
计算机网络·fpga开发·以太网·iperf
ShiMetaPi2 天前
GM3568JHF:FPGA+ARM异构开发板环境搭建教程
嵌入式硬件·fpga开发
从今天开始学习Verilog2 天前
接收PID输出的可调占空比PWM
fpga开发
璞致电子2 天前
【PZSDR P201MINI】 P201Mini 软件无线电开发板:紧凑型射频系统的性能标杆
fpga开发
I'm a winner3 天前
用LaTeX优化FPGA开发:结合符号计算与Vivado工具链
fpga开发
国科安芯3 天前
质子试验:守护芯片安全的关键防线
嵌入式硬件·安全·fpga开发·性能优化·硬件架构
ChipCamp3 天前
ChipCamp探索系列 -- 1. Soft-Core RISC-V on FPGA
fpga开发·verilog·risc-v
XINVRY-FPGA4 天前
XCKU115-2FLVB2104E AMD Xilinx Kintex UltraScale FPGA
嵌入式硬件·计算机视觉·fpga开发·云计算·硬件工程·dsp开发·fpga