演習A
★★☆ 中級
所要:20–30分
8ビット加算器
8ビット整数同士の足し算を行う回路を Verilog で設計し、EDA Playground でシミュレーションしよう。
📚 概念説明
8ビット加算器は、2つの8ビット数 A(0〜255)と B(0〜255)を足し合わせ、 8ビットの和 Sum と 1ビットのキャリーアウト 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 アカウントが必要です。 使い方ガイドを見る
🤔 考えてみよう
- a=200, b=100 のとき sum と cout はどうなりますか?計算で確認してからシミュレーションと照合しよう。
- なぜ
wire [8:0] resultは9ビットなのでしょうか?8ビットにするとどうなりますか? - 4ビット加算器(演習ページ)との違いは何ですか?リップルキャリー構造との関係を説明してみましょう。
- cin をすべて 1 にしたとき、何ビット加算器でも使えるテクニックは何でしょうか?