gpt4 book ai didi

verilog - 如何在 Verilog 中设计一个 64 x 64 位数组乘法器?

转载 作者:行者123 更新时间:2023-12-04 07:24:17 25 4
gpt4 key购买 nike

我知道如何设计一个 4x4 数组乘法器,但如果我遵循相同的逻辑,编码就会变得乏味。

  • 4 x 4 - 16 部分产品
  • 64 x 64 - 4096 部分产品。

  • 除了 8 个全加器和 4 个半加器,对于 64 x 64 位,我需要多少个全加器和半加器。如何减少部分产品的数量?有什么简单的方法可以解决这个问题吗?

    最佳答案

    每当对重复模式进行繁琐的编码时,您都应该使用 generate 语句:

    module array_multiplier(a, b, y);

    parameter width = 8;
    input [width-1:0] a, b;
    output [width-1:0] y;

    wire [width*width-1:0] partials;

    genvar i;
    assign partials[width-1 : 0] = a[0] ? b : 0;
    generate for (i = 1; i < width; i = i+1) begin:gen
    assign partials[width*(i+1)-1 : width*i] = (a[i] ? b << i : 0) +
    partials[width*i-1 : width*(i-1)];
    end endgenerate

    assign y = partials[width*width-1 : width*(width-1)];

    endmodule

    我已经使用以下测试台验证了这个模块:
    http://svn.clifford.at/handicraft/2013/array_multiplier/array_multiplier_tb.v

    编辑:

    正如@Debian 要求的流水线版本 - 就是这样。这次在数组部分的始终区域中使用 for 循环。
    module array_multiplier_pipeline(clk, a, b, y);

    parameter width = 8;

    input clk;
    input [width-1:0] a, b;
    output [width-1:0] y;

    reg [width-1:0] a_pipeline [0:width-2];
    reg [width-1:0] b_pipeline [0:width-2];
    reg [width-1:0] partials [0:width-1];
    integer i;

    always @(posedge clk) begin
    a_pipeline[0] <= a;
    b_pipeline[0] <= b;
    for (i = 1; i < width-1; i = i+1) begin
    a_pipeline[i] <= a_pipeline[i-1];
    b_pipeline[i] <= b_pipeline[i-1];
    end

    partials[0] <= a[0] ? b : 0;
    for (i = 1; i < width; i = i+1)
    partials[i] <= (a_pipeline[i-1][i] ? b_pipeline[i-1] << i : 0) +
    partials[i-1];
    end

    assign y = partials[width-1];

    endmodule

    请注意,对于许多综合工具,也可以在非流水线加法器之后添加(宽度)寄存器阶段,并让工具寄存器平衡通过进行流水线操作。

    关于verilog - 如何在 Verilog 中设计一个 64 x 64 位数组乘法器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16708338/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com