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

verilog初心者です。4ビットALUを作っているのですが、いくつかの点で躓いています。最初に2点だけ質問させて下さい。
このALUでは、4ビットの入力AとB、1ビットの入力x、y、z、
そして4ビット出力のResultと1ビット出力のOverflowを使います。
x、y、z、はオペレーションコントロールで、例えばx=0, y=1, z=0 の時A+Bを行うのですが、
もしこの時A=8、B=8だとResult=16(5ビット)になるのでOverflow=1とセットします。
しかしResultは4ビットなのでどのようにしたらOverflow=1にセットできますでしょうか。
例えば、予め5ビットの変数(temp)を用意しA+Bの結果を5ビットに拡張して計算。
もしtempが16以上ならオーバーフローということでOverflow=1としたのですが、うまくいきません。

if(x==0&&y==1&&z==0)begin  //加算の処理
Result <= A + B;   //普通に加算
temp <= {A[3], A} + {B[3], B}; //拡張して加算
if(temp >= 5'b10000)begin //16以上か比較
Overflow <= 1;
end
else begin
Overflow <= 0;
end
end

それと、2の補数も考慮しないといけないのですが、正の計算と負の計算では、どのように区別して計算すればいいのでしょうか。
最上位ビットが0か1かで正か負を分けるのはわかるのですが、例えば
1111は、正で言えば15ですが2の補数でいえば-1になります。Aが15、Bが-1で引き算をする場合、15-(-1)で16となってしまいます。
これはどのように考えたらいいのでしょうか。
もちろん答えが-16以下となってもOverflow=1とセットします。

宜しくお願いいたします。

A 回答 (1件)

(1)verilogであれば連接演算子を使って5bitとして扱う.


{ Overflow, Result } <= {1'b0,A} + {1'b0,B};

(2)符号ありの4bitで表現できる数値は -8~7 と考えます.
4'b1111に 2つの意味を持たせてはいけません.
減算を加算回路として扱えるのが2の補数の特徴です.
4'b0111(7) + 4'b1111(-1) ---> 4'b0110(6), bollow<---1(overflow)
2の補数として考えることで加算回路と減算回路が等価になります.
演算結果をsignedとして扱うか, unsignedとして扱うかは呼び出し元が考えれば良いことです.

加算回路における carry と bollow について確認すると良いと思います.(論理が逆)
    • good
    • 0
この回答へのお礼

遅くなりましたすみません。
2の補数がいまいち理解不足でした。ありがとうございました!

お礼日時:2009/09/05 15:43

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