負の数
CoddyのVerilogジャーニー「基礎」セクションの一部。レッスン 16/90。
Verilogでは、負の数は2の補数形式で表されます。2の補数は、正の数と負の数の両方を2進数で表す方法です。最上位ビット(MSB)は符号を示します:
- 0 = 正の数
- 1 = 負の数
2の補数の計算方法
数値の2の補数を求めるには、次の手順に従います。
- 正の数を2進数で書く
- すべてのビットを反転する(0は1に、1は0にする)
- 1を足す
例:4ビットで-5を表す
| 手順 | 演算 | 結果 |
|---|---|---|
| 1 | 2進数で表した正の5 | 0101 |
| 2 | すべてのビットを反転する | 1010 |
| 3 | 1を加える | 1011 |
4ビットの2の補数表現での-5は 4'b1011
Verilogで負の数を書く
十進数形式を使って、負の数を直接書くことができます。
reg signed [3:0] a;
a = -5; // Verilog は自動的に 2 の補数を使用しますビット幅が指定された2進数では、2の補数表現の値を記述する必要があります:
a = 4'b1011; // This is -5 in 4-bit two's complement符号付きと符号なし
デフォルトでは、reg信号とwire信号は符号なしです。負の数を扱うには、信号を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を指定しない場合、regまたはwireはすべての値を正の数として扱います
signedを使用すると、2の補数による演算が自動的に行われます- MSBが符号を決定します:1 = 負、0 = 正
チャレンジ
正しい2の補数の値を書いて、コードを完成させましょう。
やること:
aに、4ビットの2の補数の2進数で -3 を設定しますbに、4ビットの2の補数の2進数で -8 を設定しますcに、4ビットの2の補数の2進数で -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このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Verilogオンラインコンパイラ