工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Verilog

Verilogフルアダー設計ガイド:真理値表、RTL、テストベンチ

フルアダーの概要

フルアダーは、2つの入力ビット(A, B)とキャリー入力(Cin)を加算し、和(Sum)とキャリー出力(Cout)を生成する組み合わせ回路です。プロセッサのALU、アドレス計算、ポインタ演算などの核となる基本ブロックです。

真理値表(1ビットフルアダー)

ABCinCoutSum
00000
00101
01001
01110
10001
10110
11010
11111

設計:4ビットフルアダー(リップルキャリーアダー)

4ビット入力a, bと1ビットc_inを受け、5ビット結果(c_out + sum[3:0])を出力します。Verilogの+演算子を使うと自動的にリップルキャリーアダーとして合成されます。

方法1:assign文(継続代入)

module fulladd (
  input  [3:0] a,
  input  [3:0] b,
  input        c_in,
  output       c_out,
  output [3:0] sum
);
  assign {c_out, sum} = a + b + c_in;
endmodule

方法2:alwaysブロック(手続き的代入)

module fulladd (
  input  [3:0] a,
  input  [3:0] b,
  input        c_in,
  output reg   c_out,
  output reg [3:0] sum
);
  always @(a or b or c_in) begin
    {c_out, sum} = a + b + c_in;
  end
endmodule

コード解説

ハードウェア回路図

テストベンチ

module tb_fulladd;
  reg [3:0] a, b;
  reg c_in;
  wire c_out;
  wire [3:0] sum;
  integer i;

  fulladd fa0 (
    .a(a), .b(b), .c_in(c_in),
    .c_out(c_out), .sum(sum)
  );

  initial begin
    a <= 0; b <= 0; c_in <= 0;
    $monitor("a=0x%0h b=0x%0h c_in=0x%0h c_out=0x%0h sum=0x%0h", a, b, c_in, c_out, sum);
    for (i = 0; i < 5; i = i + 1) begin
      #10 a <= $random; b <= $random; c_in <= $random;
    end
  end
endmodule

シミュレーション結果

ncsim> run
a=0x0 b=0x0 c_in=0x0 c_out=0x0 sum=0x0
a=0x4 b=0x1 c_in=0x1 c_out=0x0 sum=0x6   // 4+1+1=6
a=0x3 b=0xd c_in=0x1 c_out=0x1 sum=0x1   // 3+13+1=17(0x11) → sum=0x1, c_out=1
a=0x5 b=0x2 c_in=0x1 c_out=0x0 sum=0x8   // 5+2+1=8
a=0xd b=0x6 c_in=0x1 c_out=0x1 sum=0x4   // 13+6+1=20(0x14) → sum=0x4, c_out=1
a=0xd b=0xc c_in=0x1 c_out=0x1 sum=0xa   // 13+12+1=26(0x1A) → sum=0xA, c_out=1
ncsim: *W,RNQUIE: Simulation is complete.

オーバーフロー(キャリーアウト)の確認

黄色ハイライト行(3+13+1=17=0x11)では、下位4ビット0x1がsum、ビット4(0x10の位)がc_out=1になります。これにより4ビット幅を超える加算結果も正しく捕捉できます。

拡張:キャリールックアヘッドアダー(CLA)

リップルキャリーアダーはキャリー伝播遅延がビット幅に比例します(O(N))。高速化にはキャリールックアヘッドアダー(生成/伝播信号で並列計算、O(log N))や、FPGAの専用キャリーチェーン(DSPブロック内蔵アダー)活用が一般的です。Verilogでは単にa + bと書けば、合成ツールがターゲットデバイスに最適なアダー構造を自動選択します。

Verilog

  1. Verilogマスター:デジタル回路設計のための完全チュートリアル
  2. Verilog連結マスター:実践ガイド
  3. Verilog代入文の理解:種類、構文、ベストプラクティス
  4. Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
  5. Verilog関数のマスター:効率的なRTL設計のために
  6. Verilogタスクの理解:関数との違い、構文、使用法
  7. Verilogクロックジェネレータ:設計と実装ガイド
  8. Verilog数学関数のマスター:効率的なハードウェア設計のために
  9. Verilog $timeformatのマスター:精度と表示制御
  10. 任意のスコープでのVerilog timescale理解と表示
  11. VerilogファイルI/Oの完全ガイド:オープン、読み取り、書き込み、クローズ