Verilog 中的乘法问题
Multiplication Issues in Verilog
我正在尝试取两个 7 位数字并将它们与 Verilog 相乘。不过,我好像运行 惹上了麻烦。当结果在小数点 0-9 之间时,乘法似乎有效(产生 1 的输出)。然而,似乎任何大于 9 的结果似乎都不会产生 1 的输出。即使 "Operand1" 和 "Operand2" 在技术上只是 4 位(十进制 0-9),我已经尝试切换将它们转换为 7 位数字以确定是否可以解决我遇到的问题。
此特定模块通过物理开关检查用户以二进制形式提供的答案,returns如果所述答案不正确则为 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
问题是由运算符优先级引起的。由于 %
和 *
具有相同的优先级,因此您的代码执行时就像这样使用括号一样:
((Operand1%10) * Operand2)%10
如果您使用 12 和 7,您会得到 4 而不是 14。要修复它,请添加更多括号:
if (((Operand1%10) * (Operand2%10)) == usrAnswer)
参考 IEEE 1800-2012,11.3.2 运算符优先级
我正在尝试取两个 7 位数字并将它们与 Verilog 相乘。不过,我好像运行 惹上了麻烦。当结果在小数点 0-9 之间时,乘法似乎有效(产生 1 的输出)。然而,似乎任何大于 9 的结果似乎都不会产生 1 的输出。即使 "Operand1" 和 "Operand2" 在技术上只是 4 位(十进制 0-9),我已经尝试切换将它们转换为 7 位数字以确定是否可以解决我遇到的问题。
此特定模块通过物理开关检查用户以二进制形式提供的答案,returns如果所述答案不正确则为 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
问题是由运算符优先级引起的。由于 %
和 *
具有相同的优先级,因此您的代码执行时就像这样使用括号一样:
((Operand1%10) * Operand2)%10
如果您使用 12 和 7,您会得到 4 而不是 14。要修复它,请添加更多括号:
if (((Operand1%10) * (Operand2%10)) == usrAnswer)
参考 IEEE 1800-2012,11.3.2 运算符优先级