繁体   English   中英

带符号乘数Verilog

[英]Signed multiplier Verilog

我正在用Verilog设计处理器。 我正在研究ALU,特别是ALU的乘数。 用小正数进行乘法运算时,我可以得到正确的结果,但是如果我尝试将带符号数相乘,则会遇到问题。 当一个正数乘以一个负数时,结果将不会一直扩展到64位,如果两个负数相乘,则该数完全不正确(正负号)。 谁能看到问题所在? 我以为我没有进行算术转换,但我对此进行了调整,但仍然得到错误的结果。

module multiplier(
        input[31:0] operand1,
        input[31:0] operand2,
        output reg [63:0] product
    );

reg [64:0] prod;
reg [31:0] mcand;
reg [31:0] sum;
integer i = 0;


always @* begin


   prod = {32'b0,operand1}; 
   mcand = operand2;

    for(i=0;i<32;i=i+1) begin

        //test 0 bit of product
        case(prod[0])
            1'b0:begin        //if prod[0] == 0, arithmetic shift right
                    prod = prod>>>1;
            end

            1'b1:begin    //if prod[0] == 1, add multiplicand to upper 32
                             //bits and arithmetic shift right
                    prod = {(prod[63:32]+mcand[31:0]),prod[31:0]};
                    prod = prod>>>1;
                end
        endcase
    end

product = prod[63:0];

end


endmodule

为了使>>>执行有符号移位,必须将变量声明为有符号。

reg signed [64:0] prod;

埃达操场上的简短例子。

还要注意prod = {32'b0,operand1}; 不是符号扩展名。 您可能应该使用:

prod = { {32{operand[31]}}, operand1 }; 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM