dポイントプレゼントキャンペーン実施中!

a,bともに正の数(15bit目が0のとき)のみしか計算が合いません。いろいろ試した結果「~」か「()」に問題があるのではないかと思っています。(優先順位はちゃんと考慮してプログラムを組んだつもりなのですが…)なにかこれらについて知らずに見落としていることがあるのではないかと思っています。もしくはほかに問題があるのでしょうか?おしえてgoo!!教えてください!内容は以下です
********************************
//module mul.v
//`timescale 1ns/10p

module mul(a,b,q);

input [15:0] a,b;
output [32:0] q;

wire [15:0] _a,_b;
wire [32:0] q;

assign _a= a;
assign _b= b;
assign q =((a == 16'h8000) || (b == 16'h8000))?33'h1ffffffff:
((a[15] == 0) && (b[15] == 0))?_a * _b:
((a[15] == 0) && (b[15] == 1))?~(_a * (~_b+1))+1:
((a[15] == 1) && (b[15] == 0))?~((~_a+1) * _b)+1:
((a[15] == 1) && (b[15] == 1))?(~_a + 1) * (~_b + 1):
_a * _b;
endmodule

****************************************************************
以下演算結果、NOTが使われたときのみqの上位16bitの結果が計算と合わない(関数電卓で確認)
****************************************************************
  300 c = 010 a = 0000000000000000 b = 0010011001100101 q = 000000000000000000000000000000000
310 c = 010 a = 0001000100010001 b = 0110001001100011 q = 000000110100011110001101110010011
320 c = 010 a = 0010001000100010 b = 1000011100001010 q = 000010010000000010100001101010100
330 c = 010 a = 0011001100110011 b = 0010001010000000 q = 000000110111001100101111110000000
340 c = 010 a = 0100010001000100 b = 0010000100100000 q = 000001000110101010100110010000000
350 c = 010 a = 0101010101010101 b = 0100010110101010 q = 000010111001110001001001101110010
360 c = 010 a = 0110011001100110 b = 1100110010011101 q = 001010001110110000001010010001110
370 c = 010 a = 0111011101110111 b = 0011111010010110 q = 000011101001101001101000110111010
380 c = 010 a = 1000100010001000 b = 1011100000010011 q = 001100010001010111110001000011000
390 c = 010 a = 1001100110011001 b = 0011100000001101 q = 000100001101000010100010011000101
400 c = 010 a = 1010101010101010 b = 1101011001010011 q = 010001110111000010111000100011110
410 c = 010 a = 1011101110111011 b = 1101110101101011 q = 010100010010111101110011000101001
420 c = 010 a = 1100110011001100 b = 0010101011010101 q = 000100010010000111101110110111100
430 c = 010 a = 1101110111011101 b = 0100101000000010 q = 001000000001000111001110110111010
440 c = 010 a = 1110111011101110 b = 0011111010101110 q = 000111010100000000000100111000100

A 回答 (1件)

これまでの質問を全部ほったらかして新たに次々と質問をするのはいかがなもんでしょうか?


先ず自分で考える、或いは検討するという段階を省いて、ただ安易に解を求めすぎるのも考え物です。
数分、あるいは数十分考えて(試行錯誤して)はどうでしょうね?
そもそも何の為にシミュレータがあるのでしょうか。
どこで思い通りにいかなかったを確認する為にほかなりません。
その確認を行えるようにするスキルを身につけることが求められているはずです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!