Verilogフルアダー設計ガイド:真理値表、RTL、テストベンチ
フルアダーの概要
フルアダーは、2つの入力ビット(A, B)とキャリー入力(Cin)を加算し、和(Sum)とキャリー出力(Cout)を生成する組み合わせ回路です。プロセッサのALU、アドレス計算、ポインタ演算などの核となる基本ブロックです。
真理値表(1ビットフルアダー)
| A | B | Cin | Cout | Sum |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 | 1 |
| 0 | 1 | 0 | 0 | 1 |
| 0 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 0 | 1 |
| 1 | 0 | 1 | 1 | 0 |
| 1 | 1 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 | 1 |
設計: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
コード解説
{c_out, sum}:連結演算子で5ビットベクトルを作り、加算結果を上位1ビット(キャリー)と下位4ビット(和)に分割assign版:outはwire型暗黙、組み合わせ回路として最適always版:outはreg型必須、感度リスト@(a or b or c_in)または@(*)- どちらも合成結果は同一のリップルキャリーアダー
ハードウェア回路図
テストベンチ
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
- Verilogマスター:デジタル回路設計のための完全チュートリアル
- Verilog連結マスター:実践ガイド
- Verilog代入文の理解:種類、構文、ベストプラクティス
- Verilogブロッキング代入とノンブロッキング代入:違いを徹底解説
- Verilog関数のマスター:効率的なRTL設計のために
- Verilogタスクの理解:関数との違い、構文、使用法
- Verilogクロックジェネレータ:設計と実装ガイド
- Verilog数学関数のマスター:効率的なハードウェア設計のために
- Verilog $timeformatのマスター:精度と表示制御
- 任意のスコープでのVerilog timescale理解と表示
- VerilogファイルI/Oの完全ガイド:オープン、読み取り、書き込み、クローズ