如何使用纹波加法器进行移位加法和加二进制乘法器?

问题描述 投票:0回答:1
module bin_mult(
    output reg [7:0]mult,
    output reg [1:0]count,
    output carry,
    input [3:0]a,b,
    input clk,load);

    reg enable;
    reg [7:0]sum;
    reg [3:0]m[3:0];
    //reg [1:0]count;
    integer i,j;

    always@(*) begin
        for(i=0;i<=3;i=i+1) begin
            for(j=0;j<=3;j=j+1) begin
                m[i][j]=b[i]&a[j];
            end
        end
    end

    ripple_add ADD(sum,carry,({4'd0,m[count+1]}<<(count+1)),mult,enable);

    always@(posedge clk) begin
        if(load) begin
            mult<={4'd0,m[0]};
            count<=0;
        end
        else if(count==3) count<=0;
        else begin
            count<=count+1;
            if(b[count+1]) begin
                //mult<=({4'd0,m[count+1]}<<(count+1))+mult;
                enable<=1'b1;
                mult<=sum;
            end
            else mult<=mult;
        end
    end
endmodule

module ripple_add(
    output [7:0]sum,
    output co,
    input [7:0]a,b,
    input en);

    parameter cin=1'b0;
    genvar i;
    wire [7:0]w;
    reg [7:0]A,B;

    always@(*) begin
        if(en) begin
            A=a;
            B=b;
        end
        else {A,B}=0;
    end

    full_add FA0(sum[0],w[0],A[0],B[0],cin);
    generate for(i=1;i<=7;i=i+1)
    begin
        full_add FA(sum[i],w[i],A[i],B[i],w[i-1]);
    end
    endgenerate
    assign co=w[7];
endmodule

module full_add(
    output s,co,
    input af,bf,cin);
    assign s=af^bf^cin;
    assign co=(af&bf)|(bf&cin)|(af&cin);
endmodule

我已经编写了用于移位和添加二进制乘法器的 Verilog 代码。在上面的代码中,我尝试使用纹波进位加法器来执行加法(mult<=({4'd0,m[count+1]}<<(count+1))+mult) but getting following errors.

test.v:22:错误:reg sum;不能由原语或连续赋值驱动。

test.v:22:错误:输出端口表达式必须支持连续赋值。

test.v:22: :ripple_add 的端口 1(sum)连接到 sum。

有其他解决方案吗?

verilog
1个回答
0
投票

当我使用

iverilog
编译代码时,出现这些错误。当我使用
g2012
选项时,代码编译没有错误:

iverilog -g2012 test.v

要获取有关

iverilog
命令的帮助,请使用 -h` 选项:

iverilog -h
© www.soinside.com 2019 - 2024. All rights reserved.