当前位置:   article > 正文

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

米联客-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位的全加器,使用四级流水线。例:

  1. module  full_add (
  2. input           rst_n,
  3. input           clk,
  4. input    [31:0] add_a,
  5. input    [31:0] add_b,
  6. input           c_in,
  7. input           vld,
  8. output   [31:0] add_sum,
  9. output          c_out,
  10. output          sum_vld
  11. );
  12. reg         c_in_ff;
  13. reg [31:0]  add_a_ff;
  14. reg [31:0]  add_b_ff;
  15. reg [31:0]  add_a_1;
  16. reg [31:0]  add_b_1;
  17. reg [31:0]  add_a_2;
  18. reg [31:0]  add_b_2;
  19. reg [31:0]  add_a_3;
  20. reg [31:0]  add_b_3;
  21. reg         vld_temp;
  22. reg         vld_1;
  23. reg         vld_2;
  24. reg         vld_3;
  25. reg         sum_vld;
  26. reg         cout1;
  27. reg         cout2;
  28. reg         cout3;
  29. reg         c_out;
  30. reg [7:0]   sum1;
  31. reg [15:0]  sum2;
  32. reg [23:0]  sum3;
  33. reg [31:0]  add_sum;                                      
  34. always@(posedge clk or negedge rst_n)                        //输入数据的四级缓存
  35. begin
  36. if (!rst_n)
  37.     begin
  38.         c_in_ff  <= 'd0;
  39.         add_a_ff <= 'd0;
  40.         add_a_1  <= 'd0;
  41.         add_a_2  <= 'd0;
  42.         add_a_3  <= 'd0;            
  43.         add_b_ff <= 'd0;
  44.         add_b_1  <= 'd0;
  45.         add_b_2  <= 'd0;
  46.         add_b_3  <= 'd0;            
  47.         vld_temp <= 'd0;
  48.         vld_1    <= 'd0;
  49.         vld_2    <= 'd0;
  50.         vld_3    <= 'd0;
  51.         sum_vld  <= 'd0;
  52.     end 
  53. else
  54.     begin
  55.         c_in_ff  <= c_in;
  56.         add_a_ff <= add_a;
  57.         add_a_1  <= add_a_ff;
  58.         add_a_2  <= add_a_1;
  59.         add_a_3  <= add_a_2;
  60.         add_b_ff <= add_b;
  61.         add_b_1  <= add_b_ff;
  62.         add_b_2  <= add_b_1;
  63.         add_b_3  <= add_b_2;
  64.         vld_temp <= vld;
  65.         vld_1    <= vld_temp;
  66.         vld_2    <= vld_1;
  67.         vld_3    <= vld_2;
  68.         sum_vld  <= vld_3;          
  69.     end 
  70. end 
  71. always@(posedge clk or negedge rst_n)               //四级流水线设计
  72. begin
  73.     if (!rst_n)
  74.         begin
  75.             sum1     <= 8'b0;
  76.             sum2     <= 16'd0;
  77.             sum3     <= 24'd0;
  78.             add_sum  <= 32'd0;
  79.             cout1    <= 1'b0;
  80.             cout2    <= 1'b0;
  81.             cout3    <= 1'b0;
  82.             c_out    <= 1'b0;              
  83.         end 
  84.     else
  85.         begin
  86.             {cout1,sum1}        <=  9'b0+add_a_ff[7:0]  +add_b_ff[7:0]  +c_in_ff;
  87.             {cout2,sum2}        <= {9'b0+add_a_1[15:8]  +add_b_1[15:8]  +cout1,sum1};
  88.             {cout3,sum3}        <= {9'b0+add_a_2[23:16] +add_b_2[23:16] +cout2,sum2};
  89.             {c_out,add_sum  }   <= {9'b0+add_a_3[31:24] +add_b_3[31:24] +cout3,sum3};              
  90.         end        
  91. end 
  92. endmodule

 

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/990880
推荐阅读
相关标签
  

闽ICP备14008679号