Menu
Coddy logo textTech

負の数

CoddyのVerilogジャーニー「基礎」セクションの一部 — レッスン 16/90。

Verilogでは、負の数はtwo's complement(2の補数)形式を使って表現されます。2の補数は、バイナリで正と負の両方の数を表現する方法です。最上位ビット(MSB)が符号を示します:

  • 0 = positive number(正の数)
  • 1 = negative number(負の数)

2の補数の計算方法

数値の2の補数を求める手順は以下の通りです:

  1. 正の数を2進数で表記します
  2. すべてのビットを反転させます(0は1に、1は0にします)
  3. 1を加算します

例: 4ビットで -5 を表現する

ステップ操作結果
12進数の正の 50101
2すべてのビットを反転1010
31を加算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 complement

Signed 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
challenge icon

チャレンジ

正しい 2 の補数の値を記述してコードを完成させてください。

作業内容:

  1. 4 ビットの 2 の補数バイナリを使用して a に -3 を設定します
  2. 4 ビットの 2 の補数バイナリを使用して b に -8 を設定します
  3. 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
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン