負の数
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 16/90。
Verilogでは、負の数はtwo's complement(2の補数)形式を使って表現されます。2の補数は、バイナリで正と負の両方の数を表現する方法です。最上位ビット(MSB)が符号を示します:
- 0 = positive number(正の数)
- 1 = negative number(負の数)
2の補数の計算方法
数値の2の補数を求める手順は以下の通りです:
- 正の数を2進数で表記します
- すべてのビットを反転させます(0は1に、1は0にします)
- 1を加算します
例: 4ビットで -5 を表現する
| ステップ | 操作 | 結果 |
|---|---|---|
| 1 | 2進数の正の 5 | 0101 |
| 2 | すべてのビットを反転 | 1010 |
| 3 | 1を加算 | 1011 |
4ビットの 2 の補数における -5 は <strong>4'b1011</strong> です
Verilogで負の数を記述する
10進数フォーマットを使用して負の数を直接記述できます:
reg signed [3:0] a;
a = -5; // Verilogは自動的に2の補数を使用しますサイズ指定された2進数の場合、2の補数の値を記述する必要があります:
a = 4'b1011; // This is -5 in 4-bit two's complementSigned vs Unsigned
デフォルトでは、Verilog は数値を unsigned(符号なし)として扱います。負の数を扱うには、信号を signed として宣言します:
reg signed [3:0] negative; // -8から7まで格納できる
reg [3:0] positive; // 0から15まで格納できるRange of Signed Numbers
N bitの場合、signedの数は以下を表現できます:
- 最小値: -2^(N-1)
- 最大値: 2^(N-1) - 1
| ビット数 | 範囲 |
|---|---|
| 4ビット | -8 ~ 7 |
| 8ビット | -128 ~ 127 |
| 16ビット | -32768 ~ 32767 |
重要な注意点
- 負の数の取り扱いを有効にするには
signedキーワードを使用します signedがない場合、Verilog はすべての値を正の値として扱います
signedを使用すると、2の補数演算(Two's complement)がautomatically実行されます- MSBが符号を決定します: 1 =
negative、0 =positive
チャレンジ
正しい 2 の補数の値を記述してコードを完成させてください。
作業内容:
- 4 ビットの 2 の補数バイナリを使用して
aに -3 を設定します - 4 ビットの 2 の補数バイナリを使用して
bに -8 を設定します - 4 ビットの 2 の補数バイナリを使用して
cに -1 を設定します
自分で試してみよう
module negative_challenge;
reg signed [3:0] a, b, c;
initial begin
a = 4'b______; // -3 in 4-bit two's complement
b = 4'b______; // -8 in 4-bit two's complement
c = 4'b______; // -1 in 4-bit two's complement
$display("a = %d", a);
$display("b = %d", b);
$display("c = %d", c);
$finish;
end
endmoduleこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。