zoukankan      html  css  js  c++  java
  • 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图:

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

  • 相关阅读:
    每日站立会议(八)
    第八周学习进度
    每日站立会议(七)
    Failed to get convolution algorithm. This is probably because cuDNN failed to initialize
    Ubuntu系统tensorflow-gpu版本配置
    二值图片批量阈值处理
    提取文件中的每一个mask,并将mask命名为文件名字
    python对图片批量命名
    Win10系统下安装labelme,json文件批量转化
    Win10,Anaconda,tensorflow-gpu安装教程
  • 原文地址:https://www.cnblogs.com/cornhill/p/4009351.html
Copyright © 2011-2022 走看看