FPGA乘法器实现与资源消耗

一、学习实现

(注,本文中的截图参考夏宇闻的《verilog 数字系统设计教程》第三版)

两个数相乘

X:X_{n-1}\cdot \cdot \cdot X_1X_0

Y:Y_{n-1}\cdot \cdot \cdot Y_1Y_0

1、计算方式如下:

转变为硬件实现:

定义一个乘法单元(MU,multiple unit)

则乘法计算方式转变为如下结构:

2、verilog 实现

`timescale 1ns / 1ps


module add(
    input A,
    input B,
    input Cin,
    output S,
    output Cout
);
    assign S = (A ^ B) ^ Cin;
    assign Cout = (A & Cin) | (A & B) | (B & Cin);
endmodule

module mu(
    input Y,
    input X,
    input Sin,
    input Cin,
    output Cout,
    output Sout
);
    wire Pij;
    assign Pij = X & Y;
    add add1(
        .A(Pij),
        .B(Sin),
        .Cin(Cin),
        .S(Sout),
        .Cout(Cout)
    );
endmodule

module mul_self(
    input [3:0] X,
    input [3:0] Y,
    output [7:0] Z
);
    /*
    *------------->0-6
    |
    |
    |
    |
    V
    0-3
    */
    wire 
                            C03,    C04,    C05,  //C06 = 0,
                    C12,    C13,    C14,  //C15 = 0,
            C21,    C22,    C23,  //C24 = 0,
    C30,    C31,    C32;  //C33 = 0;
    wire 
                          //S03=0,  s04=0,  S05=0,    S06=0,
                    S12,    S13,    S14,    S15,
            S21,    S22,    S23,    S24,
    S30,    S31,    S32,    S33;
    mu mu06(.Y(Y[0]),   .X(X[0]),   .Sin(1'b0),     .Cin(1'b0),     .Cout(C05),          .Sout(Z[0])  );
    mu mu05(.Y(Y[0]),   .X(X[1]),   .Sin(1'b0),     .Cin(C05),      .Cout(C04),          .Sout(S15)   );
    mu mu04(.Y(Y[0]),   .X(X[2]),   .Sin(1'b0),     .Cin(C04),      .Cout(C03),          .Sout(S14)   );
    mu mu03(.Y(Y[0]),   .X(X[3]),   .Sin(1'b0),     .Cin(C03),      .Cout(S12),          .Sout(S13)   );

    mu mu15(.Y(Y[1]),   .X(X[0]),   .Sin(S15),      .Cin(1'b0),     .Cout(C14),          .Sout(Z[1])  );
    mu mu14(.Y(Y[1]),   .X(X[1]),   .Sin(S14),      .Cin(C14),      .Cout(C13),          .Sout(S24)   );
    mu mu13(.Y(Y[1]),   .X(X[2]),   .Sin(S13),      .Cin(C13),      .Cout(C12),          .Sout(S23)   );
    mu mu12(.Y(Y[1]),   .X(X[3]),   .Sin(S12),      .Cin(C12),      .Cout(S21),          .Sout(S22)   );

    mu mu24(.Y(Y[2]),   .X(X[0]),   .Sin(S24),      .Cin(1'b0),     .Cout(C23),          .Sout(Z[2])  );
    mu mu23(.Y(Y[2]),   .X(X[1]),   .Sin(S23),      .Cin(C23),      .Cout(C22),          .Sout(S33)   );
    mu mu22(.Y(Y[2]),   .X(X[2]),   .Sin(S22),      .Cin(C22),      .Cout(C21),          .Sout(S32)   );
    mu mu21(.Y(Y[2]),   .X(X[3]),   .Sin(S21),      .Cin(C22),      .Cout(S30),          .Sout(S31)   );

    mu mu33(.Y(Y[3]),   .X(X[0]),   .Sin(S33),      .Cin(1'b0),     .Cout(C32),          .Sout(Z[3])  );
    mu mu32(.Y(Y[3]),   .X(X[1]),   .Sin(S32),      .Cin(C32),      .Cout(C31),          .Sout(Z[4])  );
    mu mu31(.Y(Y[3]),   .X(X[2]),   .Sin(S31),      .Cin(C31),      .Cout(C30),          .Sout(Z[5])  );
    mu mu30(.Y(Y[3]),   .X(X[3]),   .Sin(S30),      .Cin(C30),      .Cout(Z[7]),         .Sout(Z[6])  );
endmodule

完全按照图示结构进行实现

3、testbench

`timescale 1ns / 1ps

module mul_self_tb(
    );
    reg [3:0] X;
    reg [3:0] Y;
    wire [7:0] Z;
    mul_self mul_self1(
        .X(X),
        .Y(Y),
        .Z(Z)
    );
    initial begin
        X = 15;
        Y = 2;
        # 10;
        $display("X = %d, Y = %d, Z = %d",X,Y,Z);
        X = 0;
        Y = 2;
        # 10;
        $display("X = %d, Y = %d, Z = %d",X,Y,Z);
    end
endmodule

测试结果

可以看到结果正确

4、RTL

MU单元

整体

5、综合

17个LUT实现的

6、实现

17个LUT实现的

二vivado编译实现

1、verilog代码

`timescale 1ns / 1ps 
module mul(
     input [3:0] X,
     input [3:0] Y,
     output [7:0] Z
     );
     assign Z = X * Y;
 endmodule

2、RTL 

3、综合 

上面综合结果最终消耗了19个LUT和2个CARRY4,与进位节省乘法器相似,如下图

4、实现

最终实现由16个LUT组成,这是由于部分LUT被实现到同一个LUT中,如下:

其中INST_0_i_5和INST_0_i_2都被实现到同一个LUT中,所有最终消耗16个LUT。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: FPGA(现场可编程门阵列)是一种可重构的半导体器件,可以根据需要进行现场编程和重新配置的芯片。它具有灵活性高、性能强和功耗低的特点,广泛应用于数字电路设计和嵌入式系统等领域。 乘法是在数字电路设计中常见的运算操作,而在FPGA实现乘法运算可以利用流水线技术来提高计算速度和系统性能。 流水线是一种将复杂操作分解为多个子操作,并将这些子操作按顺序依次处理的技术。在乘法运算中,可以将乘法操作分解为多个阶段,每个阶段只处理乘法的一部分。这样,整个乘法操作可以同时进行不同阶段的处理,从而提高计算效率。 以一个简单的4位乘法为例,可以将乘法操作分解为四个阶段:部分乘法、部分积累加、全加运算和结果输出。 在部分乘法阶段,将被乘数和乘数按位相乘,得到局部部分积。在部分积累加阶段,将不同位的部分乘积累加起来。在全加运算阶段,将累加的部分积进行全加运算,得到最终乘积的各位。在结果输出阶段,将最终乘积输出。 通过流水线技术,每个阶段可以并行进行,不同阶段的操作可以同时执行。这样,即使整个乘法操作需要多个周期才能完成,但每个周期可以处理不同的部分,大大提高了计算速度和系统性能。 总而言之,FPGA乘法流水线利用了流水线技术来将复杂的乘法操作分解为多个阶段并同时进行,以提高计算速度和系统性能。它是在FPGA实现乘法的一种有效方法。 ### 回答2: FPGA是一种可编程逻辑器件,可以通过编程来实现特定的功能。在FPGA中进行乘法运算时,可以采用流水线的方式来提高运算速度和效率。 流水线是一种将复杂运算任务分解为多个简单子任务并按顺序执行的方法。在FPGA乘法运算中,可以将乘法操作分解为若干个阶段,并将每个阶段的计算结果依次传递给下一个阶段,从而实现乘法运算的流水线。 乘法运算的流水线通常包括以下几个阶段:输入寄存器、乘法器、累加器和输出寄存器。在输入寄存器阶段,将待乘的数值存储在寄存器中。然后,在乘法器阶段,对输入的数值进行乘法运算,得到乘积的部分结果。接下来,在累加器阶段,将乘积的部分结果进行累加,得到最终的乘积结果。最后,在输出寄存器阶段,将乘积结果存储在寄存器中,以供后续的操作使用。 通过流水线的方式进行乘法运算,可以将一个乘法操作分解为多个较为简单的任务,每个任务只需完成一部分计算,从而大大提高了乘法运算的速度和效率。在FPGA中,由于可以对硬件进行自定义编程,可以根据具体需求来设计和优化乘法运算的流水线,以获得更好的性能和功耗。 总结来说,FPGA乘法运算可以通过流水线的方式来实现,将乘法操作分解为多个阶段,并依次执行,从而提高了运算速度和效率。通过优化流水线的设计,可以进一步提升性能和功耗。 ### 回答3: FPGA代表现场可编程门阵列(Field-Programmable Gate Array),乘法是其在数字电路设计中的一种基本运算。而流水线则是一种常用的技术,在各种计算系统中可以提高计算效率。 FPGA中的乘法运算是基于所谓的乘法器单元实现的。乘法器单元是FPGA芯片中的一部分硬件,用于执行乘法操作。使用FPGA进行乘法运算相比于使用通用处理器的软件实现,可以提供更高的性能和更低的功耗。此外,FPGA芯片中可以包含多个乘法器单元,从而可以并行执行多个乘法操作,进一步提高计算速度。 为了进一步提高计算效率,可以使用流水线技术。流水线是一种将计算任务分为多个阶段的方法,每个阶段依次执行任务的一部分。在乘法运算中,可以将乘法操作划分为多个阶段,例如乘法器准备、乘法器执行和结果输出的阶段。每个阶段可以并行执行,并在下一个阶段开始之前完成其任务。通过使用流水线,可以使乘法操作的整体延迟减少,并提高整体性能。 总的来说,FPGA乘法运算可以通过乘法器单元硬件实现,并通过使用流水线技术进一步优化。这种方法可以提供高性能和低功耗的乘法运算,适用于在许多数字电路设计中需要进行大量乘法运算的应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值