4级流水线64位加法器

现在开始学习使用FPGA实现数字信号处理算法。这是第一个算法实现:使用四级流水线,提高64位加法器的速度。

使用流水线提高运算速度是以面积换取速度的做发。算法的思想是:如果使用一个64位的加法器实现,延时肯定比16位的加法器延时要大。也就是说16位的加法器的时钟频率可以更高。(具体高多少,呵呵我也不知道。因为我现在也不知道如何去分析程序的最高频率。这是我以后要解决的问题

接下来说说具体的实现:

总的思想是,先将64位分为4段,[63:48],[47:32],[31:16],[15:0]。一段一段的计算,这样就将64位分为16位。

速度已经说明,16位的时钟肯定比64位的加法器要高。但是在一个16位的加法运算完成后还有其他段的数据需要保存,这就是要增加面积的原因。

看程序:


module addr(
input clk, rst_n,
input [63 : 0] x, y,
output [64 : 0] sum
);

parameter ADD_WIDTH = 5'd16;

//16bit add and 4 stages
//first stage registers
reg [ADD_WIDTH : 0] r1_r, r2_r;
reg [ADD_WIDTH - 1 : 0] r3_r, r4_r, r5_r, r6_r; //
//second stage registers
reg [ADD_WIDTH : 0] r3_r2, r2_r2;
reg [ADD_WIDTH - 1 : 0] r1_r2, r4_r2, r5_r2; //
//third stage registers
reg [ADD_WIDTH : 0] r3_r3, r4_r3;
reg [ADD_WIDTH - 1 : 0] r1_r3, r2_r3; //
//forth stage registers
reg [ADD_WIDTH : 0] r4_r4;
reg [ADD_WIDTH - 1 : 0] r1_r4, r2_r4, r3_r4; //


always @(posedge clk or negedge rst_n) begin
if(!rst_n) begin
r1_r <= 1'b0;
r2_r <= 1'b0;  r3_r <= 1'b0;   r4_r <= 1'b0;  r5_r <= 1'b0;  r6_r <= 1'b0;

end
  else begin
  //use 4 stages pipline
  //first stage:
  r1_r <= x[15 : 0] + y[15 : 0];
  r2_r <= x[31 : 16] + y[31: 16];
  r3_r <= x[47 : 32]; //16b
  r4_r <= y[47 : 32]; //16b
  r5_r <= x[63 : 48]; //16b
  r6_r <= y[63 : 48]; //16b
  //second stage
  r1_r2 <= r1_r[15 : 0];
  r2_r2 <= r2_r + r1_r[16];
  r3_r2 <= r3_r + r4_r;
  r4_r2 <= r5_r;
  r5_r2 <= r6_r;
  //thrid stage
  r1_r3 <= r1_r2;
  r2_r3 <= r2_r2[15 : 0];
  r3_r3 <= r3_r2 + r2_r2[16];
  r4_r3 <= r4_r2 + r5_r2;
  //forth stage
  r1_r4 <= r1_r3;
  r2_r4 <= r2_r3;
  r3_r4 <= r3_r3;
  r4_r4 <= r4_r3 + r3_r3[16];


end //rst_n else


end //always
//

assign sum = {r4_r4, r3_r4[15:0], r2_r4[15:0], r1_r4[15:0]};

endmodule

第一层流水线:计算[15:0]的和,计算[31:16]的和但是没有计算进位(进位的计算放在了二级流水线上)。保存高位[47:32],[63:48]。

第二层流水线:计算[31:16]的进位,[47:32]的和(没有计算进位)。保存[15:0],[63:48].

第三层流水线:计算[47:32]的进位,[63:48]的和(没有计算进位)。保存[15:0],[32:16].

第四层流水线:计算[63:48]的进位,保存[15:0],[32:16],[47:32].

至此流水线的加法器分析完成。从中可知每一层的流水线寄存器都要保存当前数据的全部信息。如果由上一层来看数据流。就可以实现,每个时钟周期都可以输入两个64位的数据(但是要4个时钟周期后才有当前输入数据的结果)。但是这里的每个时钟周期可以是16位的最高时钟周期。

这是RTL图:

最后在来一张仿真图来结束:

原文地址:https://www.cnblogs.com/cornhill/p/4009351.html