原理说明:
64位8级流水线加法器,即是将64位拆成8个8位进行运算,最后将8个8位运算的结果相加得出最后的和和进位位。采用8级流水线进行加法运算,则从第一次输入两个加数的第一个时钟起,需要第8个时钟周期对应的和才输出来,之后源源不断的输入加数,则和也不断的输出。
8级流水线需要将加法运算拆分成8个时钟周期来完成,每个时钟周期需要将前面计算得到的和、还未进行计算的加数进行缓存,由此,比如第1个8位计算得到的和就需要缓存7次,第2个8位计算得到的和就需要缓存6次,以此类推。同时,还要将未进行计算的加数进行缓存,比如[63:56]这个8位就需要缓存7次,[55:48] 这个8位就需要缓存6次。
第1个时钟周期:计算第1个8位的和,并加上前一个的进位位。缓存前面得到的和、未进行计算的加数
第2个时钟周期:计算第2个8位的和,并加上前一个的进位位。缓存前面得到的和、未进行计算的加数
第3个时钟周期:计算第3个8位的和,并加上前一个的进位位。缓存前面得到的和、未进行计算的加数
第4个时钟周期:计算第4个8位的和,并加上前一个的进位位。缓存前面得到的和、未进行计算的加数
第5个时钟周期:计算第5个8位的和,并加上前一个的进位位。缓存前面得到的和、未进行计算的加数
第6个时钟周期:计算第6个8位的和,并加上前一个的进位位。缓存前面得到的和、未进行计算的加数
第7个时钟周期:计算第7个8位的和,并加上前一个的进位位。缓存前面得到的和、未进行计算的加数
第8个时钟周期:计算第8个8位的和,并加上前一个的进位位。缓存前面得到的和、未进行计算的加数
并计算出最后的结果。
8级流水线对应8个时钟周期,对应代码的8个always模块。
/**************************************版权申明************************************
** 文件名称: adder_64bit.v
** 最新版本: v1.0
** 功能描述: 64位8级流水线加法器顶层模块
***********************************************************************************/
module adder_64bit(
clk,
reset_n,
data_in_a,
data_in_b,
sum,
c
);
input clk; //时钟信号
input reset_n; //复位信号
input [63:0] data_in_a; //输入数1
input [63:0] data_in_b; //输入数2
output [63:0] sum; //和输出
output c; //进位位输出
// ***********************************************************************************/
// ****************和寄存器**************************
reg [8:0] sum1_reg1; //第1个8位的和寄存器1
reg [8:0] sum1_reg2; //第1个8位的和寄存器2
reg [8:0] sum1_reg3; //第1个8位的和寄存器3
reg [8:0] sum1_reg4; //第1个8位的和寄存器4
reg [8:0] sum1_reg5; //第1个8位的和寄存器5
reg [8:0] sum1_reg6; //第1个8位的和寄存器6
reg [8:0] sum1_reg7; //第1个8位的和寄存器7
reg [8:0] sum1_reg8; //第1个8位的和寄存器8
reg [8:0] sum2_reg1; //第2个8位的和寄存器1
reg [8:0] sum2_reg2; //第2个8位的和寄存器2
reg [8:0] sum2_reg3; //第2个8位的和寄存器3
reg [8:0] sum2_reg4; //第2个8位的和寄存器4
reg [8:0] sum2_reg5; //第2个8位的和寄存器5
reg [8:0] sum2_reg6; //第2个8位