組み合わせ回路を理解する
組み合わせ回路の種類と特徴を一通り理解しておきましょう。このページ以降のユニットでは、ここの内容は既知のものとして扱います。
「組み合わせ回路」って難しそうな名前だけど、要するに『入力が決まれば出力がパッと決まる回路』のことだよ🐾
足し算する回路(加算器)や、信号を選ぶ回路(セレクタ)が代表例!
1. 全加算回路(1ビット加算)
最も基本的な組み合わせ回路のひとつが、1ビット全加算回路(Full Adder)です。
- 入力: A(1ビット)、B(1ビット)、CIN(下位ビットからの桁上がり)
- 出力: Q(和)、COUT(上位ビットへの桁上がり)
全加算回路の真理値表
| A | B | CIN | COUT | Q | 計算 |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0+0+0 = 0 → 00 |
| 0 | 0 | 1 | 0 | 1 | 0+0+1 = 1 → 01 |
| 0 | 1 | 0 | 0 | 1 | 0+1+0 = 1 → 01 |
| 0 | 1 | 1 | 1 | 0 | 0+1+1 = 2 → 10 |
| 1 | 0 | 0 | 0 | 1 | 1+0+0 = 1 → 01 |
| 1 | 0 | 1 | 1 | 0 | 1+0+1 = 2 → 10 |
| 1 | 1 | 0 | 1 | 0 | 1+1+0 = 2 → 10 |
| 1 | 1 | 1 | 1 | 1 | 1+1+1 = 3 → 11 |
論理式の導出
COUTが1になる条件(4行)をORでつなぐ:
COUT = Ā・B・CIN + A・B̄・CIN + A・B・C̄IN + A・B・CIN
Qが1になる条件(4行)をORでつなぐ:
Q = Ā・B̄・CIN + Ā・B・C̄IN + A・B̄・C̄IN + A・B・CIN
2. 論理圧縮
論理圧縮とは、ブール代数の法則を使って論理式をできるだけ簡単な形に書き換え、回路規模を小さくすることです。
COUTの論理圧縮手順
| ステップ | 式 | 使用した法則 |
|---|---|---|
| 元の式 | Ā・B・CIN + A・B̄・CIN + A・B・C̄IN + A・B・CIN | — |
| ① | Ā・B・CIN + A・B̄・CIN + A・B・(C̄IN + CIN) | 分配則 |
| ② | Ā・B・CIN + A・B̄・CIN + A・B | 補元則(X+X̄=1) |
| ③ | CIN・(Ā・B + A・B̄) + A・B | 分配則 |
| ④(完成) | COUT = A・B + CIN・(A⊕B) | XOR定義 |
「え、何がどう変わったの?」って思ったよね🐾
ポイントは③→④のところ! Ā・B + A・B̄ は実は A⊕B(XOR)の定義そのもの なんだ。
この「圧縮テクニック」は自分でやる必要はなくて、論理合成ツールが全自動でやってくれるから安心してね!今は『こうやって式が減るんだな〜』くらいでOKだよ!
3. 4ビット加算回路(リップルキャリー型)
1ビット全加算回路を4つ並べ、隣の回路のCOUT→CINを接続したものがリップルキャリー型4ビット加算回路です。
- FA0が最下位ビット(LSB)、FA3が最上位ビット(MSB)
- 下位ビットの演算が終わらないと上位ビットの演算を開始できない
計算例:2 + 3 = 5
| 加算器 | A(2進数) | B(2進数) | CIN | COUT | Q |
|---|---|---|---|---|---|
| FA0(LSB) | 0 | 1 | 0 | 0 | 1 |
| FA1 | 1 | 1 | 0 | 1 | 0 |
| FA2 | 0 | 0 | 1 | 0 | 1 |
| FA3(MSB) | 0 | 0 | 0 | 0 | 0 |
結果:COUT=0, Q=0101(2進数)= 5(10進数)✓
リップルキャリー型の遅延
| ビット数 | 1ビット加算器遅延 | 合計遅延 |
|---|---|---|
| 4ビット | 2ns / 段 | 8ns |
| 8ビット | 2ns / 段 | 16ns |
| 16ビット | 2ns / 段 | 32ns |
桁数が増えると遅延しちゃうリップルキャリー型の弱点を克服したのが、次の『ルックアヘッド型』だよ🐾
これは面接や試験でもよく聞かれるから、なんとなく違いを知っておくとカッコいいよ!
4. キャリールックアヘッド型加算回路
遅延の原因であるCOUT生成部分を分離し、下位ビットの入力信号A・Bから直接CINを生成する回路がキャリールックアヘッド型です。
- 各ビットのCINはキャリー生成回路が並列に計算
- 上位ビットほどキャリー生成回路の入力が増え、回路規模は大きくなる
4ビット:遅延の比較
| 加算器 | キャリー生成遅延 | 加算器遅延 | 合計 |
|---|---|---|---|
| FA0 | 0ns(CIN=0固定) | 2.0ns | 2.0ns |
| FA1 | 0.5ns(3入力) | 2.0ns | 2.5ns |
| FA2 | 0.6ns(5入力) | 2.0ns | 2.6ns |
| FA3(MSB) | 0.7ns(7入力) | 2.0ns | 2.7ns |
🔵 リップルキャリー型
- 4ビット最大遅延:8ns
- 構造がシンプル
- ビット数増加で遅延が線形増大
🟢 キャリールックアヘッド型
- 4ビット最大遅延:2.7ns
- 5.3ns 高速化(4ビットの場合)
- ビット数が増えても遅延の増加が緩やか
5. セレクタ(マルチプレクサ)
セレクタとは、N本の入力から1本を選択して出力する回路です。マルチプレクサ(MUX)とも呼びます。
2to1セレクタの動作
入力2本(D0・D1)から選択信号SELで1本を選んで出力Qに出す回路です。
| SEL | 出力Q | 動作 |
|---|---|---|
| 0 | D0 | SEL=0のとき、D0がQに出力される |
| 1 | D1 | SEL=1のとき、D1がQに出力される |
論理式
Q = S̄EL・D0 + SEL・D1
SEL=0のとき S̄EL=1 なので D0 が有効。SEL=1のとき SEL=1 なので D1 が有効。
セレクタは、いわば「信号の切り替えスイッチ」だよ🐾
CPUの中では「計算結果Aと計算結果B、どっちをレジスタに書き込む?」みたいに、データの通り道を選ぶ場面で必ず登場する超・常連回路なんだ!
4to1セレクタへの拡張
入力が4本(D0〜D3)になると、どれを選ぶかを伝えるために選択信号は2ビット(SEL[1:0])必要になります。
| SEL[1:0] | 出力Q |
|---|---|
| 00 | D0 |
| 01 | D1 |
| 10 | D2 |
| 11 | D3 |
一般に、入力がN本のセレクタには log2N ビット(切り上げ)の選択信号が必要です(8to1なら3ビット、16to1なら4ビット)。
データバスの切り替え、演算結果の選択、ステートマシンの出力選択など、実際の設計ではセレクタが至るところに登場します。Verilogではif文・case文・条件演算子(?:)のどれでも記述でき、書き方は回路実験1「ゲート回路とセレクタを書く」で実際に手を動かして学びます。
6. エンコーダとデコーダ
🔵 エンコーダ(符号化回路)
- 入力データを規則に基づいて変換
- 出力ビット数 < 入力ビット数
- 例:キーボード・電卓のキー入力
🟢 デコーダ(復号化回路)
- 符号化データを元の形式に変換
- 出力ビット数 > 入力ビット数
- 例:7セグメントLED表示回路
実例:数字ボタン → 7セグメントLED 表示「5」
① エンコーダ(ボタン入力→4ビット2進数)
「5」のボタンが押される → 内部で4ビット2進数に符号化
| 押したボタン | 4ビット2進数出力(上位→下位) | 10進数 |
|---|---|---|
| 0 | 0000 | 0 |
| 1 | 0001 | 1 |
| 2 | 0010 | 2 |
| 3 | 0011 | 3 |
| 4 | 0100 | 4 |
| 5 | 0101 | 5 |
| 6 | 0110 | 6 |
| 7 | 0111 | 7 |
| 8 | 1000 | 8 |
| 9 | 1001 | 9 |
② デコーダ(4ビット2進数→7セグメント出力)
入力 0101(5)を受け取り、7セグメントの各セグメントをON/OFF制御します。
| 入力 | a | b | c | d | e | f | g | 表示 |
|---|---|---|---|---|---|---|---|---|
| 0101(5) | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 「5」 |
セグメントb・eが消灯(0)、それ以外が点灯(1)→ 「5」 が表示されます。
加算器、セレクタ、デコーダ…これらはこれからVerilogを書くときの「レゴブロック」みたいなものだよ🐾
次はいよいよ『順序回路(時間を記憶する回路)』に進もう!
📌 まとめ
- 全加算回路は A・B・CINの3入力から Q(和)とCOUT(桁上がり)を出力する
- 論理圧縮とはブール代数の法則を使って論理式を簡略化し、回路規模を小さくすること
- リップルキャリー型加算回路の遅延は「1ビット加算器遅延 × ビット数」で線形に増大する
- キャリールックアヘッド型はCINを並列生成することで遅延を大幅に削減できる
- セレクタ(マルチプレクサ)はN本の入力から1本を選択する回路。別名MUX
- エンコーダは符号化回路(入力ビット数 > 出力ビット数)
- デコーダは復号化回路(入力ビット数 < 出力ビット数)
- 演算回路の実現方法は複数あり、方式によって速度や回路規模が異なる
🐾 もふねこの実話つまずきコラム
このページで学んだ組み合わせ回路は、if文やcase文の書き忘れで「意図しないラッチ」を生んでしまう事故と直結しているよ。実際にどんなトラブルが起きるのか、もふねこの実験ログや外部noteで詳しく解説しているから、ぜひあわせて読んでみてね!
🐾 もふねこの現場FAQ
Q. 組み合わせ回路を書いていたら「意図しないラッチが出た」と言われました。シミュレーションは通っているのに…
A. 「状態を保持する記述」をしてしまっている可能性が高いよ🐾
就職した卒業生からも、よく同じ相談が来るんだ。「シミュレーションは完璧なのに、論理合成したら意図しないラッチが出ていて…実機だとたまにフリーズする…」って。実はこれ、組み合わせ回路のルールを破ってしまった典型的な事故パターンなんだ。
組み合わせ回路は「入力が来たらすぐに出力が決まる(状態を持たない)」回路だけど、if文やcase文で全ての条件(elseやdefault)を書き忘れると、論理合成ツールが勝手に「状態を維持するための記憶素子(ラッチ)」を作ってしまうんだよ。
詳しくは、実験ログ2: Latch地獄から脱出した3日間 で解説しているから、実機を壊す前に必ず読んでみてね!
