演習A ★★☆ 中級 所要:20–30分

8ビット加算器

8ビット整数同士の足し算を行う回路を Verilog で設計し、EDA Playground でシミュレーションしよう。

📚 概念説明

8ビット加算器は、2つの8ビット数 A(0〜255)と B(0〜255)を足し合わせ、 8ビットの和 Sum1ビットのキャリーアウト Cout を出力する回路です。

入力 A 入力 B Cin Sum (8bit) Cout 10進数結果
0000_0001 (1) 0000_0010 (2) 0 0000_0011 (3) 0 3
1111_1111 (255) 0000_0001 (1) 0 0000_0000 (0) 1 256(オーバーフロー)
1010_1010 (170) 0101_0101 (85) 0 1111_1111 (255) 0 255
ポイント: 結果が255を超えると Cout = 1 になります。これを「キャリーオーバー(桁上がり)」といいます。 {Cout, Sum} の9ビットで完全な結果を表現できます。

📝 課題

以下の仕様を満たす Verilog モジュールを完成させてください。

モジュール名:adder8

入力ポート:

  • a [7:0] — 被加数
  • b [7:0] — 加数
  • cin — 初期キャリー入力

出力ポート:

  • sum [7:0] — 和(下位8ビット)
  • cout — キャリーアウト(最上位の桁上がり)

💻 Verilog テンプレート

EDA Playground の 右パネル(Design) に貼り付けてください。// ここを実装 の部分を完成させましょう。

Design(右パネル)
// ================================
// 8ビット加算器モジュール
// ================================
module adder8 (
    input  [7:0] a,
    input  [7:0] b,
    input        cin,
    output [7:0] sum,
    output       cout
);

    // ここを実装してください
    // ヒント:{cout, sum} = a + b + cin を使うと1行で書けます
    wire [8:0] result;
    assign result = {1'b0, a} + {1'b0, b} + cin;
    assign {cout, sum} = result; // ← 別の書き方も考えてみよう

endmodule
Testbench(左パネル)
// ================================
// テストベンチ
// ================================
module tb_adder8;
    reg  [7:0] a, b;
    reg        cin;
    wire [7:0] sum;
    wire       cout;

    adder8 uut (.a(a), .b(b), .cin(cin), .sum(sum), .cout(cout));

    initial begin
        $dumpfile("dump.vcd");
        $dumpvars(0, tb_adder8);
        $monitor("a=%0d b=%0d cin=%0d | sum=%0d cout=%0d",
                  a, b, cin, sum, cout);

        // テストケース 1:基本加算
        a = 8'd1;   b = 8'd2;   cin = 0; #10;
        // テストケース 2:ゼロ加算
        a = 8'd0;   b = 8'd0;   cin = 0; #10;
        // テストケース 3:オーバーフロー確認
        a = 8'd255;  b = 8'd1;   cin = 0; #10;
        // テストケース 4:cin=1
        a = 8'd100;  b = 8'd100; cin = 1; #10;
        // テストケース 5:最大値同士
        a = 8'd255;  b = 8'd255; cin = 1; #10;

        $display("--- テスト完了 ---");
        $finish;
    end
endmodule

▶ EDA Playground で開く

上のテンプレートをコピーして、EDA Playground でシミュレーションしてみましょう。

🚀 EDA Playground を開く →

※ ログインに Gmail アカウントが必要です。 使い方ガイドを見る

🤔 考えてみよう

  1. a=200, b=100 のとき sum と cout はどうなりますか?計算で確認してからシミュレーションと照合しよう。
  2. なぜ wire [8:0] result は9ビットなのでしょうか?8ビットにするとどうなりますか?
  3. 4ビット加算器(演習ページ)との違いは何ですか?リップルキャリー構造との関係を説明してみましょう。
  4. cin をすべて 1 にしたとき、何ビット加算器でも使えるテクニックは何でしょうか?
← 演習2トップへ 次:演習B 8ビット減算器 →