Verilog中的乘法问题

时间:2017-12-11 18:53:20

标签: verilog multiplication

我试图取两个7位数字并将它们乘以verilog,但无论出于何种原因,我似乎遇到了麻烦。当结果在0-9的十进制之间时,乘法似乎有效(产生1的输出),但是看起来任何大于9的结果似乎都不会产生1的输出。即使" Operand1&# 34;和"操作数2"在技​​术上只有4位(0-9十进制),我已经尝试将它们切换到7位数字,以确定是否能解决问题,我遇到了。

此特定模块通过物理开关检查usr以二进制形式提供的答案,如果所述答案不正确则返回0,如果正确,则返回1。所有其他操作(加法,减法和除法)都能很好地工作。

这是我的代码:

module checkAnswer(OpSel, negFlag, Operand1, Operand2, usrAnswer, Correct);

input [1:0]OpSel;
input [6:0]Operand1, Operand2;
input negFlag;
input [6:0]usrAnswer;
output reg Correct;

always @ (*)
   case (OpSel)
   2'b00: 
        if ((Operand1%10 + Operand2%10) == usrAnswer)
        Correct = 1'b1;
    else
        Correct = 1'b0;
2'b01:
    if ((negFlag && (Operand2 > Operand1) && ((Operand1%10 - Operand2%10) == -1*usrAnswer)) || ((Operand1 >= Operand2) && ((Operand1%10 - Operand2%10) == usrAnswer)))
        Correct = 1'b1;
    else
        Correct = 1'b0;
2'b10:
    if ((Operand1%10 * Operand2%10) == usrAnswer)
        Correct = 1'b1;
    else
        Correct = 1'b0;
2'b11:
    if ((Operand1%10 / Operand2%10) == (usrAnswer))
        Correct = 1'b1;
    else
        Correct = 1'b0;

     default: Correct = 1'b0;
endcase

endmodule

感谢您的时间!

1 个答案:

答案 0 :(得分:2)

问题是由运营商优先级引起的。由于%*具有相同的优先级,因此您的代码就像使用括号一样执行:

((Operand1%10) * Operand2)%10

如果使用12和7,则得到4而不是14.要修复它,请添加更多括号:

if (((Operand1%10) * (Operand2%10)) == usrAnswer)

请参阅IEEE 1800-2012, 11.3.2运营商优先级