負の数
CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 16/90。
Verilogでは、負の数は2の補数形式を使用して表現されます。2の補数は、正の数と負の数の両方をバイナリで表現する方法です。最上位ビット(MSB)が符号を示します。
- 0 = 正の数
- 1 = 負の数
2の補数の計算方法
ある数値の2の補数を求めるには:
- 正の数を2進数で書く
- すべてのビットを反転させる(0は1に、1は0にする)
- 1を加える
例:-5を4ビットで表現する
| ステップ | 操作 | 結果 |
|---|---|---|
| 1 | 正の5の2進数表記 | 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の補数値を記述する必要があります:
a = 4'b1011; // これは4ビットの2の補数における-5です符号付き vs 符号なし
デフォルトでは、Verilogは数値を符号なしとして扱います。負の数を扱うには、信号をsignedとして宣言します:
reg signed [3:0] negative; // -8から7まで格納可能
reg [3:0] positive; // 0から15まで格納可能符号付き数値の範囲
N ビットの場合、符号付き数値は以下を表現できます:
- 最小値: -2^(N-1)
- 最大値: 2^(N-1) - 1
| ビット | 範囲 |
|---|---|
| 4ビット | -8 ~ 7 |
| 8ビット | -128 ~ 127 |
| 16ビット | -32768 ~ 32767 |
重要な注意事項
- 負の数の処理を有効にするには、
signedキーワードを使用してください signedがない場合、Verilogはすべての値を正として扱います
signedを使用すると、2の補数演算が自動的に機能します- MSB(最上位ビット)が符号を決定します:1 = 負、0 = 正
チャレンジ
正しい2の補数値を記述して、コードを完成させてください。
やること:
- 4ビットの2の補数バイナリを使用して、
aに -3 を設定します - 4ビットの2の補数バイナリを使用して、
bに -8 を設定します - 4ビットの2の補数バイナリを使用して、
cに -1 を設定します
チートシート
Verilogにおいて、負の数は2の補数形式を使用します。MSB(最上位ビット)が符号を示します:0 = 正、1 = 負。
2の補数の計算方法:
- 正の数をバイナリ(2進数)で書く
- すべてのビットを反転させる
- 1を加える
例:4ビットの -5 → 0101 → 1010 → 1011 = 4'b1011
負の数を扱うには、信号を signed として宣言します:
reg signed [3:0] negative; // -8 から 7 まで格納可能
reg [3:0] positive; // 0 から 15 まで格納可能負の値は、直接代入するか、2の補数のバイナリ経由で代入します:
reg signed [3:0] a;
a = -5; // Verilogは自動的に2の補数を使用します
a = 4'b1011; // 同等:4ビットの2の補数形式での -5Nビットの符号付き(signed)の範囲:-2^(N-1) から 2^(N-1) - 1(例:4ビットの場合、-8 から 7)。
自分で試してみよう
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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。