2017-12-11 9 views
0

2つの7ビットの数値を乗算してVerilogで乗算しようとしていますが、何らかの理由で問題が発生しているようです。結果が0〜9の10進数であるときに乗算が機能する(1の出力を生成する)ように見えますが、9より大きい結果は1の出力を生成しないように見えます。 "Operand1"および "Operand2 "技術的には4ビット(小数点以下9桁)のみですが、問題を解決するかどうかを判断するために7ビットの数値に切り替えることを試みました。Verilogにおける乗算の問題

この特定のモジュールは、物理スイッチを使用してバイナリで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 

はお時間をいただき、ありがとうございます!

答えて

2

問題は、演算子の優先順位によって発生します。あなたは12と7を使用する場合

((Operand1%10) * Operand2)%10 

は、あなたがより多くの括弧を追加し、それを修正するには代わりに14の4を取得します:%*が同じ優先順位を持っているので、括弧は次のように使用されたかのように、あなたのコードが実行さ

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

IEEE 1800から2012を参照してください 、11.3.2演算子の優先順位

+1

私はそのことを考えていなかったなんて信じられません!どうもありがとうございます! – Lorenzi

関連する問題