デジタル回路の設計を学んでいると、必ずといっていいほど出会うのが加算回路です。
特に全加算回路、いわゆるフルアダーは、2進数の演算処理を理解するうえで避けて通れない存在といえます。
とはいえ、半加算回路との違いや、キャリーがどのように処理されるのかがよくわからない、という方も多いのではないでしょうか。
この記事では、全加算回路の真理値表を中心に、桁上げの仕組みや論理設計の考え方まで丁寧に解説していきます。
Sum出力とキャリー出力の関係を理解できれば、組合せ回路全体の見通しがぐっと良くなるはずです。
回路図やブール代数の式が苦手だという方にも伝わるよう、できるだけかみ砕いてご紹介します。
それでは、全加算回路の基本から順番に見ていきましょう。
全加算回路とは3つの入力から2進数の桁上げを含めて計算する組合せ回路である
それではまず全加算回路の結論的な位置づけについて解説していきます。
全加算回路とは、2つの被加数と1つの下位桁からのキャリー入力という3つの信号を受け取り、その合計をSum出力とキャリー出力として返す組合せ回路のことです。
半加算回路が2つの入力しか扱えないのに対し、全加算回路は下位からの繰り上がりまで考慮できる点が最大の特徴といえます。
この違いこそが、多桁の2進演算を実現するうえで欠かせないポイントです。
なぜなら、実際のコンピュータでの足し算は1桁だけで完結することはほとんどなく、複数桁を連続して処理する必要があるからでしょう。
たとえば4ビットの2進数同士を加算する場合、最下位ビットだけは半加算回路でも対応できます。
しかし2桁目以降は、下位桁からのキャリーを取り込まなければ正しい結果になりません。
ここに全加算回路が必要とされる理由があります。
全加算回路の入力はA、B、Cinの3つです。
出力はSum(S)とキャリー出力(Cout)の2つになります。
この構造を理解しておくと、後述する真理値表がすんなり読み解けるようになるでしょう。
また、全加算回路は単体で使われることは少なく、複数個を連結してリプルキャリー加算器などの多ビット加算器を構成するのが一般的です。
つまり全加算回路は、加算器全体を組み立てるための基本パーツと考えるとイメージしやすいでしょう。
この位置づけを押さえたうえで、次の章から具体的な真理値表を確認していきます。
全加算回路の真理値表は入力3つと出力2つの組み合わせで整理できる
続いては全加算回路の真理値表そのものを確認していきます。
入力がA、B、Cinの3つあるため、組み合わせは全部で8通りになります。
それぞれの組み合わせに対して、SumとCoutがどのような値になるのかを表にまとめると次のようになります。
| A | B | Cin | Sum | Cout |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 1 | 0 |
| 0 | 1 | 0 | 1 | 0 |
| 0 | 1 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 | 0 |
| 1 | 0 | 1 | 0 | 1 |
| 1 | 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 1 | 1 |
この表を眺めると、ある規則性に気づく方も多いはずです。
Sumの列は、1の数が奇数のときに1になっています。
一方でCoutの列は、1の数が2つ以上のときに1になるという特徴があります。
この規則性こそが、全加算回路をブール代数で表現する際の出発点になるでしょう。
Sum出力は入力の1の個数が奇数のときに1となる
Sum出力の値は、AとBとCinの中に1がいくつ含まれているかによって決まります。
1が0個または2個のときはSumが0です。
1が1個または3個のときはSumが1になります。
これは奇数パリティの考え方そのものであり、排他的論理和(XOR)の性質と一致しているのです。
キャリー出力は多数決の原理で決まる
Cout、つまりキャリー出力は、3つの入力のうち少なくとも2つが1であれば1になります。
逆にいえば、1の数が0個または1個であればCoutは0のままです。
この動きは、いわゆる多数決回路(マジョリティ関数)と同じ構造だといわれています。
デジタル回路の分野では、この多数決的な性質を利用してキャリー出力を効率よく実現しているのです。
真理値表から読み取れる対称性
表をよく見ると、AとBを入れ替えても結果が変わらないことに気づきます。
これは加算という演算そのものが可換であることの表れでしょう。
つまり2進数の足し算でも、10進数と同じようにA足すBとB足すAは同じ結果になるということです。
この対称性は、回路設計を簡略化するうえでも役立つ性質といえます。
全加算回路の論理式はSumとCoutをそれぞれブール代数で表現できる
続いては真理値表から導かれる論理式について確認していきます。
真理値表さえ手元にあれば、加法標準形(主加法標準形)を使ってそのまま論理式を導出することが可能です。
Sum出力の式は次のように表されます。
Sum = A′B′Cin + A′BCin′ + AB′Cin′ + ABCin
この式をXORを使って整理すると、次のようにシンプルに書き換えられます。
Sum = A XOR B XOR Cin
この式が意味しているのは、3つの入力の排他的論理和を取ればSumが求まるということです。
非常にシンプルな形になっているのが特徴でしょう。
続いてキャリー出力の式も見ていきます。
Cout = A′BCin + AB′Cin + ABCin′ + ABCin
これを整理すると、次のように表現できます。
Cout = AB + BCin + ACin
この式は、AとBのAND、BとCinのAND、AとCinのANDを、それぞれOR演算で結びつけた形になっています。
つまり2つ以上の入力が1であればCoutが1になる、という多数決的な動きが数式にもきちんと現れているわけです。
この2つの論理式を覚えておけば、回路図を見なくても全加算回路の動作を頭の中で再現できるようになるでしょう。
試験問題などでも頻出のポイントなので、丸暗記ではなく仕組みごと理解しておくことをおすすめします。
全加算回路は半加算回路2つとOR回路1つで構成できる
続いては全加算回路の具体的な内部構成について確認していきます。
全加算回路は、実はゼロから設計しなくても、半加算回路(ハーフアダー)を2つ組み合わせることで作れることをご存じでしょうか。
手順としては次のようになります。
| ステップ | 使用する回路 | 入力 | 出力 |
|---|---|---|---|
| 1 | 半加算回路(1つ目) | A、B | 中間Sum、中間Carry1 |
| 2 | 半加算回路(2つ目) | 中間Sum、Cin | 最終Sum、中間Carry2 |
| 3 | OR回路 | 中間Carry1、中間Carry2 | 最終Cout |
この構成を見ると、半加算回路をブロックのように積み重ねることで全加算回路が完成することがわかります。
1つ目の半加算回路でAとBを足し、その結果に対して2つ目の半加算回路でCinをさらに足す、という2段階の処理になっているのです。
そして、それぞれの半加算回路で発生したキャリーをORで結合すれば、最終的なキャリー出力が得られます。
半加算回路単体では対応できない理由
半加算回路は入力が2つしかないため、下位桁からのキャリーを受け取る仕組みを持っていません。
そのため単独では多桁の加算に対応できないのです。
この弱点を補うために、半加算回路を2段構成にして全加算回路を実現しているというわけでしょう。
OR回路が担う役割とは
2つの半加算回路それぞれからキャリーが発生する可能性があります。
この2つのキャリーのうち、どちらか一方でも1であれば、最終的なCoutは1にならなければなりません。
まさにこの判定を行っているのがOR回路の役割です。
ゲート数で見る効率性
半加算回路2つとOR回路1つという構成は、ゲート数の観点からも比較的シンプルだといえます。
XORゲート2つ、ANDゲート2つ、ORゲート1つの合計5ゲートで実現できるのが一般的な構成です。
回路の小型化やスピードを追求する場合には、この基本構成をベースにさらに最適化が図られることもあります。
全加算回路の桁上げは複数桁の2進演算をつなげる要となる
続いては桁上げ、いわゆるキャリーの役割について、より詳しく確認していきます。
2進数の加算において、桁上げの概念は10進数の繰り上がりとまったく同じ考え方です。
たとえば10進数で9足す1を計算すると、答えは10になり1桁繰り上がりますよね。
2進数でも同様に、1足す1を計算すると10(10進数でいう2)になり、繰り上がりが発生します。
この繰り上がった1を次の桁に渡す仕組みこそが、キャリー入力とキャリー出力の関係なのです。
複数桁の2進数を加算する場合、最下位桁の全加算回路が出したキャリー出力は、次の桁の全加算回路のキャリー入力になります。
この連結を繰り返すことで、何桁の2進数でも加算できるようになるのです。
このような構成を一般にリプルキャリー加算器と呼びます。
4ビット加算器での桁上げの流れ
4ビットの2進数同士を加算する場合を考えてみましょう。
最下位ビット(0桁目)は、下位からのキャリーがないため、Cinには0を入力するか、あるいは半加算回路を使うのが一般的です。
1桁目以降は、直前の桁のCoutを次の桁のCinとして接続していきます。
このように桁を順番につなげていくことで、4ビット同士の加算が正しく実行されるわけです。
桁上げ伝播にかかる遅延の問題
リプルキャリー加算器には、実は弱点も存在します。
キャリーが最下位桁から最上位桁まで順番に伝わっていく必要があるため、桁数が増えるほど計算に時間がかかってしまうのです。
この遅延のことを、専門的には桁上げ伝播遅延と呼びます。
大規模な演算装置では、この遅延を減らすために、桁上げ先見加算器(キャリールックアヘッド加算器)などの高速化手法が使われることもあるでしょう。
オーバーフローとの関係性
最上位桁から出てきたキャリーは、演算結果がその桁数で表現できる範囲を超えたことを示すサインでもあります。
これがいわゆるオーバーフローです。
コンピュータの演算処理では、このキャリーの有無をフラグとして保持し、後続の処理判断に利用しているケースが多いといわれています。
つまり桁上げは、単に数値を合わせるだけでなく、演算の正しさを検証する情報源としても機能しているのです。
全加算回路の論理設計はカルノー図を使うと効率よく進められる
続いては全加算回路を実際に論理設計する際の手順について確認していきます。
先ほど真理値表から直接論理式を導きましたが、より体系的に設計を進めたい場合には、カルノー図を用いる方法が有効です。
カルノー図とは、真理値表の情報を格子状に配置し、隣接するマス同士をグルーピングすることで論理式を簡略化する手法のことをいいます。
| 設計ステップ | 内容 |
|---|---|
| 1 | 真理値表を作成する |
| 2 | Sum用とCout用、それぞれのカルノー図を用意する |
| 3 | 出力が1になるマスをグルーピングする |
| 4 | グループから最簡形の論理式を導出する |
| 5 | 導出した論理式をもとに回路図(ゲート図)に落とし込む |
この手順を踏むことで、感覚に頼らず論理的に最適な回路を導き出せるようになります。
特にCout側は、カルノー図を使うことで、AB、BCin、ACinという3つのAND項に整理できることが視覚的に確認できるでしょう。
Sum出力側のカルノー図の特徴
Sum出力のカルノー図では、1が立つマスがチェッカーボードのように分散して並びます。
この配置は、隣接するマス同士をうまくグルーピングできないことを意味しており、結果として簡略化が難しい形になるのです。
そのため、Sumについては積和形よりもXORを使った表現のほうが、実用上シンプルになりやすいといわれています。
Cout出力側のカルノー図の特徴
一方でCout出力のカルノー図では、1が立つマスが隣接しやすく、きれいに3つのグループへとまとめられます。
この結果、AB、BCin、ACinという直感的にも理解しやすい形の論理式が得られるのです。
設計の教材などでは、このCout側の簡略化プロセスがよく例題として取り上げられています。
設計時に注意したいハザードの存在
論理設計を進めるうえでもう一つ意識しておきたいのが、ハザードと呼ばれる一時的な誤動作の可能性です。
信号が複数の経路を通って出力に到達する場合、経路ごとの遅延差によって、一瞬だけ誤った値が出力されてしまうことがあります。
全加算回路のように複数のゲートを組み合わせる回路では、こうしたタイミングの問題にも配慮した設計が求められる場面があるでしょう。
実際の集積回路設計では、このあたりの検証もシミュレーションを通じて丁寧に行われています。
まとめ
ここまで、全加算回路の真理値表を軸に、桁上げの仕組みや論理設計の流れについて解説してきました。
全加算回路とは、AとBとCinという3つの入力から、SumとCoutという2つの出力を導く組合せ回路のことです。
真理値表を見れば、Sumは入力中の1の個数が奇数のときに1となり、Coutは1の個数が2つ以上のときに1となることがわかります。
この規則性は、それぞれXORとAND・ORの組み合わせという論理式にきれいに対応しているのです。
また、全加算回路は半加算回路2つとOR回路1つという比較的シンプルな構成で実現できることも押さえておきたいポイントでしょう。
桁上げについては、下位桁のキャリー出力を上位桁のキャリー入力へと連結することで、何桁でも2進数の加算が可能になります。
その反面、桁数が増えるほど桁上げ伝播による遅延が課題になる点にも注意が必要です。
論理設計の場面では、カルノー図を使うことでSumとCoutそれぞれの最簡形を効率よく導き出せます。
全加算回路の仕組みは、コンピュータの演算装置を理解するための基礎中の基礎といえる内容です。
ぜひこの記事を参考に、真理値表から論理式、そして実際の回路構成までを一連の流れとして理解していただければ幸いです。