我试图取两个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
感谢您的时间!
答案 0 :(得分:2)
问题是由运营商优先级引起的。由于%
和*
具有相同的优先级,因此您的代码就像使用括号一样执行:
((Operand1%10) * Operand2)%10
如果使用12和7,则得到4而不是14.要修复它,请添加更多括号:
if (((Operand1%10) * (Operand2%10)) == usrAnswer)
请参阅IEEE 1800-2012, 11.3.2运营商优先级