赞
踩
软件版本:无
操作系统:WIN10 64bit
硬件平台:适用所有系列FPGA
板卡获取平台:https://milianke.tmall.com/
登录“米联客”FPGA社区 http://www.uisrc.com 视频课程、答疑解惑!
本小节讲解Verilog语法的流水线设计,需要掌握流水线的设计方法。
流水线的基本思想是:把一个重复的过程分解为若干个子过程,每个子过程由专门的功能元件来实现。将多个处理过程在时间上错开,依次通过各功能段,这样每个子过程就可以与其他子过程并行进行。
例:小张在快递站工作,日常任务就是打包快递,打包快递分为四个步骤,称重、打包、贴单和入库,每个步骤耗时5分钟。临近双十一,快递寄送任务变多,小张一个人忙不过来,临时添加三个人一起打包快递,每人负责一个步骤,原先打包4个快递需要80分钟,现在需要35分钟。如图所示:
设计一个32位的全加器,使用四级流水线。例:
- 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
流水线设计就是将路径系统的分割成一个个数字处理单元,并在各个处理单元之间插入寄存器来暂存中间阶段的数据。被分割的单元能够按阶段并行的执行,相互间没有影响。所以最后流水线设计能够提高数据的吞吐率,即提高数据的处理速度。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。