第9回 組合せ論理回路 (2)

オンデマンド受講する場合は、必ず連絡の動画を見てから今回の内容に進んでください。

2進数の足し算

概要

動画の解説を参照

2進数の足し算は、10進数と同様に筆算で行えます。
例えば \((1011)_2 + (1001)_2\) なら、このようになります (筆算では2進数であることを明示するための \(()_2\) は省略します)。
1 0 1 1
+ 1 0 0 1
1 1 1
1 0 1 0 0
一番下の「10100」が最後の答えで、その上にある小さい「1」は繰り上がりを意味します。
結果として以下の計算ができたことになります。
\((1011)_2 + (1001)_2 = (10100)_2\)
基本的な考え方は10進数の筆算と同じです。

課題1

※ 準備 : 学籍番号を入れて「入力」をクリック (タップ) してください。


\((\)\()_2 + (\)\()_2\) の計算を筆算で行い、その結果として得られる等式を書いてください。
繰り上がりも省略せずに書いてください。
課題1解説

半加算器

概要

動画の解説を参照

2進数の足し算の最下位ビット (一番右の桁) の計算を回路で再現することを考えてみましょう。
出力として考える必要があるのは、\(S\) (計算結果の最下位ビット) と \(C\) (上の桁への繰り上がり) です。
繰り上がりを明確にするため、計算結果を2桁で書くと
\((0)_2+(0)_2=(00)_2\)
\((0)_2+(1)_2=(01)_2\)
\((1)_2+(0)_2=(01)_2\)
\((1)_2+(1)_2=(10)_2\)
のようになるので、真理値表は以下のようになります。
\(A\) \(B\) \(C\) \(S\)
0 0 0 0
0 1 0 1
1 0 0 1
1 1 1 0
この結果になる論理式はこうです。
\(S=A\oplus B\)
\(C=A\cdot B\)
その論理式に対応する回路はこうなります。これを半加算器といいます。

わざわざこのような回路を作らなくても、半加算器を収めたICチップで同様のことができます。
回路シミュレータではこのようになります (「追加 → デジタルチップ → 半加算器を追加」で追加できます)。

全加算器

動画の解説を参照

右から2桁目以上の桁の計算では、下(右)の桁からの繰り上がり (筆算でいうと小さい「1」) \(C_{in}\) があるかどうかで結果が異なります。
筆算と比較して考えてみると、やることは「\(A\) : 上の行の数字」「\(B\) : 下の行の数字」「\(C_{in}\) : 横線の下の小さい数字」の3つの足し算です。
上の桁への繰り上がりを明確にするため、計算結果を2桁で書くと

下からの繰り上がりがない場合
\((0)_2+(0)_2+(0)_2=(00)_2\)
\((0)_2+(1)_2+(0)_2=(01)_2\)
\((1)_2+(0)_2+(0)_2=(01)_2\)
\((1)_2+(1)_2+(0)_2=(10)_2\)
下からの繰り上がりがある場合
\((0)_2+(0)_2+(1)_2=(01)_2\)
\((0)_2+(1)_2+(1)_2=(10)_2\)
\((1)_2+(0)_2+(1)_2=(10)_2\)
\((1)_2+(1)_2+(1)_2=(11)_2\)
となります。

これらの入力に対する出力 \(S\) (計算結果のその桁のビット) と \(C\) (上の桁への繰り上がり) の真理値表は以下のようになります。
\(A\) \(B\) \(C_0\) \(C\) \(S\)
0 0 0 0 0
0 1 0 0 1
1 0 0 0 1
1 1 0 1 0
0 0 1 0 1
0 1 1 1 0
1 0 1 1 0
1 1 1 1 1
これに対応する論理式はこうです。
\(S=A\oplus B\oplus C_{in}\)
\(C=AB+(A\oplus B)C_{in}\)
その論理式に対応する論理回路はこうなります。これを全加算器 (または単純に加算器) と呼びます。

わざわざこのような回路を作らなくても、全加算器を収めたICチップで同様のことができます。
回路シミュレータではこのようになります (「追加 → デジタルチップ → 加算器を追加」で追加できます。さらに、「右クリック → 編集」で計算するビット数を変更できます)。
(信号の表示名は A0→\(A\), B0→\(B\), S0→\(S\) のように読み替えてください)

複数桁の2進数の計算

動画の解説を参照

0~3の範囲、2進数でいうと \((00)_2\) ~ \((11)_2\) の範囲の値をとる \(A, B\) の足し算を回路で行うことを考えてみましょう。
回路で使える入力は 0, 1 のどちらかなので、まずは2進数の桁ごとに分解します。
\(A\) → \(A_1, A_0\)
\(B\) → \(B_1, B_0\)
たとえば \(A=(2)_{10}=(10)_2\) なら \(A_1=1, A_0=0\) のようにするわけです。

一方、\(S=A+B\) とすると、その値はこのようになります。
A\B 0 1 2 3
0 0 1 2 3
1 1 2 3 4
2 2 3 4 5
3 3 4 5 6
最大値が6なので、2進数だと3桁必要になります。そこで、
\(S\) → \(S_2, S_1, S_0\)
のように分解します。
足し算を実現するには、こういう結果になる回路がほしいということです。
\(A_1\) \(A_0\) \(B_1\) \(B_0\) \(S_2\) \(S_1\) \(S_0\)
0 0 0 0 0 0 0
0 0 0 1 0 0 1
0 0 1 0 0 1 0
0 0 1 1 0 1 1
0 1 0 0 0 0 1
0 1 0 1 0 1 0
0 1 1 0 0 1 1
0 1 1 1 1 0 0
1 0 0 0 0 1 0
1 0 0 1 0 1 1
1 0 1 0 1 0 0
1 0 1 1 1 0 1
1 1 0 0 0 1 1
1 1 0 1 1 0 0
1 1 1 0 1 0 1
1 1 1 1 1 1 0
とはいえ、こんな複雑な入出力の関係を実現する回路をゼロから考える必要はありません。

半加算器と全加算器を組み合わせれば作れます。
半加算器には \(A_0, B_0\) を入力します。出力は \(S_0\) と \(C_1\) です。
全加算器には\(A_1, B_1, C_1\) を入力します。出力は \(S_1\) と \(C_2\) です。
結果的に \(C_2\) は \(S_2\) になります。
3つの出力 \(S_2S_1S_0\) を続けて読んだものが\(A+B\) の計算結果 \(S\) として得られます。

この下にさらに全加算器を追加すれば3桁の足し算を行うこともできます。
原理的にはいくらでも増やせますが、回路はかなり複雑になります。

これも1つのICで代用できます。この回路では「C」が \(S_2\) にあたります。

課題2

以下のリンク先の4桁の加算回路を開き、課題1の「足される数」を \(A\)、「足す数」を \(B\) として A3~A0, B3~B0 をそれと同じ状態に切り替え、出力 C, S3~S0 が課題1の計算結果とあっているかどうかを確認し、そのスクリーンショットを撮ってください。

課題2解説

課題

課題解答