Menu
CoddyTech

負の数

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

Verilogでは、負の数は2の補数形式で表されます。2の補数は、正の数と負の数の両方を2進数で表す方法です。最上位ビット(MSB)は符号を示します:

  • 0 = 正の数
  • 1 = 負の数

2の補数の計算方法

数値の2の補数を求めるには、次の手順に従います。

  1. 正の数を2進数で書く
  2. すべてのビットを反転する(0は1に、1は0にする)
  3. 1を足す

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

手順演算結果
12進数で表した正の50101
2すべてのビットを反転する1010
31を加える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 = 正
challenge icon

チャレンジ

正しい2の補数の値を書いて、コードを完成させましょう。

やること:

  1. a に、4ビットの2の補数の2進数で -3 を設定します
  2. b に、4ビットの2の補数の2進数で -8 を設定します
  3. 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
quiz icon腕試し

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

基礎のすべてのレッスン

自分で練習してみよう: Verilogオンラインコンパイラ