【问题标题】:Multiplication Issues in VerilogVerilog 中的乘法问题
【发布时间】:2017-12-11 18:53:19
【问题描述】:

我正在尝试将两个 7 位数字与 Verilog 相乘。然而,我似乎遇到了麻烦。当结果在小数点 0-9 之间时,乘法似乎起作用(产生 1 的输出)。然而,似乎任何大于 9 的结果似乎都不会产生 1 的输出。即使“操作数 1”和“操作数 2”在技术上只有 4 位(十进制 0-9),我尝试将它们切换为 7-位数来确定这是否能解决我遇到的问题。

此特定模块通过物理开关检查用户以二进制形式提供的答案,如果所述答案不正确则返回 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

【问题讨论】:

    标签: verilog multiplication


    【解决方案1】:

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

    ((Operand1%10) * Operand2)%10
    

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

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

    参考 IEEE 1800-2012,11.3.2 运算符优先级

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多