
コンピュータが小切手帳のバランスをとったり、チェスをしたり、ドキュメントのスペルチェックをしたりする方法を考えたことはありますか?これらは、ほんの数十年前、人間だけができることでした。今では、コンピューターは明らかに簡単にそれらを実行します。シリコンとワイヤーでできた「チップ」は、人間の思考が必要と思われることをどのように行うことができるでしょうか。
この質問への答えを根本的に理解したい場合、最初に理解する必要があるのはブール論理と呼ばれるものです。もともと1800年代半ばにGeorgeBooleによって開発されたブール論理により、かなりの数の予期しないものをビットとバイトにマッピングすることができます。ブール論理の優れている点は、一度コツをつかめば、ブール論理(または少なくともコンピューターの操作を理解するために必要な部分)がとてつもなく単純になることです。この記事では、最初に単純なロジック「ゲート」について説明し、次にそれらを組み合わせて便利なものにする方法を説明します。
- シンプルゲート
- 単純な加算器
- 全加算器
- ビーチサンダル
- JKフリップフロップ
- ゲートの実装
シンプルゲート




カウント方法に応じて、3つ、5つ、または7つの単純なゲートについて学習する必要があります(理由はすぐにわかります)。これらのシンプルなゲートを使用すると、想像できるあらゆるデジタルコンポーネントを実装する組み合わせを構築できます。これらのゲートはここでは少し乾燥しているように見え、信じられないほどシンプルですが、次のセクションでいくつかの興味深い組み合わせを見て、それらをより刺激的にします。まだ読んでいない場合は、先に進む前に「ビットとバイトのしくみ」を読んでおくと役に立ちます。
ゲートではありません
最も単純なゲートは、「インバータ」またはNOTゲートと呼ばれます。入力として1ビットを取り、その反対を出力として生成します。真理値表は次のとおりです。
Q
0 1
1 0
NOTゲートには、Aと呼ばれる1つの入力とQと呼ばれる1つの出力があります(「O」を使用すると、ゼロと簡単に混同されるため、出力には「Q」が使用されます)。この表は、ゲートの動作を示しています。Aに0を適用すると、Qは1を生成します。Aに1を適用すると、Qは0を生成します。単純です。
ANDゲート
ANDゲートは、AとBの2つの入力に対して論理「and」演算を実行します。
BQ
0 0 0
0 1 0
1 0 0
1 1 1
ANDゲートの背後にある考え方は、「A AND Bが両方とも1の場合、Qは1でなければならない」というものです。その動作は、ゲートの論理テーブルで確認できます。次のように、このテーブルを1行ずつ読みます。
BQ
0 0 0 Aが0でBが0の場合、Qは0です。
0 1 0 Aが0でBが1の場合、Qは0です。
1 0 0 Aが1で、Bが0の場合、Qは0です。
1 1 1 Aが1で、Bが1の場合、Qは1です。
またはゲート
次のゲートはORゲートです。その基本的な考え方は、「Aが1またはBが1(または両方が1)の場合、Qは1です」です。
BQ
0 0 0
0 1 1
1 0 1
1 1 1

これらは3つの基本的なゲートです(それはそれらを数える1つの方法です)。NANDとNORゲートの2つを認識することは非常に一般的です。これらの2つのゲートは、ANDまたはORゲートとNOTゲートの単純な組み合わせです。これらの2つのゲートを含めると、カウントは5に増えます。NANDゲートとNORゲートの基本的な操作は次のとおりです。これらはANDゲートとORゲートの単純な反転であることがわかります。
NORゲート
BQ
0 0 1
0 1 0
1 0 0
1 1 0
NANDゲート
BQ
0 0 1
0 1 1
1 0 1
1 1 0
リストに追加されることがある最後の2つのゲートは、XORゲートとXNORゲートであり、それぞれ「排他的論理和」ゲートと「排他的論理和」ゲートとも呼ばれます。それらのテーブルは次のとおりです。
XORゲート
BQ
0 0 0
0 1 1
1 0 1
1 1 0
XNORゲート
BQ
0 0 1
0 1 0
1 0 0
1 1 1


XORゲートの背後にある考え方は、「AまたはBのいずれかが1で、両方ではない場合、Qは1です」です。XORがゲートのリストに含まれない理由は、リストされている元の3つのゲートを使用してXORを簡単に実装できるためです。
AとBの4つの異なるパターンすべてを試し、それらを回路でトレースすると、QがXORゲートのように動作することがわかります。XORゲートにはよく理解されている記号があるため、一般にXORを「標準ゲート」と見なし、回路図のANDおよびORと同じように使用する方が簡単です。
単純な加算器
ビットとバイトに関する記事では、バイナリ加算について学びました。このセクションでは、前のセクションで説明したゲートを使用して、2進加算が可能な回路を作成する方法を学習します。
シングルビット加算器から始めましょう。単一のビットを足し合わせて答えを得る必要があるプロジェクトがあるとしましょう。そのための回路の設計を開始する方法は、最初にすべての論理的な組み合わせを調べることです。次の4つの合計を調べることでそれを行うことができます。
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10
1 + 1になるまでは問題ないように見えます。その場合は、厄介なキャリービットが気になります。持ち運びを気にしない場合(これは結局のところ1ビットの加算の問題であるため)、XORゲートを使用してこの問題を解決できることがわかります。ただし、気にする場合は、次のように、常に2ビットの出力を含むように方程式を書き直すことができます。
0 + 0 = 00
0 + 1 = 01
1 + 0 = 01
1 + 1 = 10
これらの方程式から、真理値表を作成できます。
キャリーアウト付き1ビット加算器
BQ CO
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1
この表を見ると、XORゲートを使用してQを実装し、ANDゲートを使用してCO(キャリーアウト)を実装できることがわかります。単純。
2つの8ビットバイトを一緒に追加したい場合はどうなりますか?これは少し難しくなります。最も簡単な解決策は、問題を再利用可能なコンポーネントにモジュール化してから、コンポーネントを複製することです。この場合、1つのコンポーネント(完全なバイナリ加算器)のみを作成する必要があります。
全加算器と前の加算器の違いは、全加算器はA入力とB入力に加えて、キャリーイン(CI)入力を受け入れることです。完全な加算器ができたら、そのうちの8つをつなぎ合わせてバイト幅の加算器を作成し、キャリービットを1つの加算器から次の加算器にカスケードできます。
次のセクションでは、全加算器が回路にどのように実装されるかを見ていきます。
全加算器
全加算器の論理テーブルは、3つの入力ビットがあるため、以前に使用したテーブルよりも少し複雑です。これは次のようになります。
キャリーインおよびキャリーアウトを備えた1ビット全加算器
CI A BQ CO
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

このテーブルを実装する方法はたくさんあります。ここでは、わかりやすいというメリットのある方法を紹介します。Qビットを見ると、上位4ビットがAとBに関してXORゲートのように動作し、下位4ビットがAとBに関してXNORゲートのように動作していることがわかります。 COの上位4ビットはAとBに関してANDゲートのように動作し、下位4ビットはORゲートのように動作します。これらの事実を考慮して、次の回路は全加算器を実装します。
これは間違いなく全加算器を実装するための最も効率的な方法ではありませんが、この方法を使用してロジックを理解し、追跡することは非常に簡単です。気になる場合は、より少ないゲートでこのロジックを実装するために何ができるかを確認してください。
これで、「全加算器」と呼ばれる機能ができました。コンピュータエンジニアが行うことは、コンポーネントの詳細について心配するのをやめることができるように、それを「ブラックボックス化」することです。ブラックボックス全加算器については、次のようになります。


そのブラックボックスを使用すると、4ビット全加算器を簡単に描画できるようになります。
この図では、各ビットからのキャリーアウトは、次のビットオーバーのキャリーインに直接フィードされます。0は最初のキャリーインビットに配線されています。AラインとBラインに2つの4ビット番号を入力すると、Qラインに4ビットの合計が追加され、最後のキャリーアウト用に1ビットが追加されます。このチェーンは、必要に応じて8、16、または32ビットまで拡張できることがわかります。
作成した4ビット加算器はリップルキャリー加算器と呼ばれます。キャリービットが1つの加算器から次の加算器に「リップル」するため、この名前が付けられます。この実装には、単純さという利点がありますが、速度の問題という欠点があります。実際の回路では、ゲートは状態を切り替えるのに時間がかかります(時間はナノ秒のオーダーですが、高速コンピューターではナノ秒が重要です)。したがって、32ビットまたは64ビットのリップルキャリー加算器は、キャリーリップルのために、最終的な合計に落ち着くまでに100〜200ナノ秒かかる場合があります。このため、エンジニアはキャリールックアヘッド加算器と呼ばれるより高度な加算器を作成しました。キャリールックアヘッドを実装するために必要なゲートの数は多いですが、加算器の整定時間ははるかに優れています。
ビーチサンダル

ブールゲートで実行できるより興味深いことの1つは、ブールゲートを使用してメモリを作成することです。ゲートを正しく配置すると、入力値が記憶されます。この単純な概念は、コンピュータのRAM(ランダムアクセスメモリ)の基礎であり、他のさまざまな有用な回路を作成することも可能にします。
メモリはフィードバックと呼ばれる概念に依存しています。つまり、ゲートの出力は入力にフィードバックされます。2つのインバーターを使用する最も単純なフィードバック回路を上に示します。
フィードバックパスをたどると、Qがたまたま1の場合、常に1になることがわかります。たまたま0の場合、常に0になります。作成した回路を制御できるのは素晴らしいことです。これはあまり役に立ちませんが、フィードバックがどのように機能するかを確認できます。
「実際の」回路では、この種の単純なインバータフィードバックアプローチを実際に使用できることがわかります。2つのNANDゲートを使用するより有用なフィードバック回路を以下に示します。
この回路には、2つの入力(RとS)と2つの出力(QとQ ')があります。フィードバックがあるため、その論理テーブルは、以前に見たものと比較して少し変わっています。
R S Q Q '
00違法
0 1 1 0
1 0 0 1
11覚えている

論理表が示すのは、次のとおりです。
- RとSが互いに反対である場合、QはSの後に続き、Q 'はQの逆数です。
- RとSの両方が同時に1に切り替えられた場合、回路はRとSで以前に提示されたものを記憶します。
おかしな違法状態もあります。この状態では、RとSは両方とも0になり、メモリの意味では値がありません。不正な状態のため、通常、入力側にそれを防ぐための小さな調整ロジックを追加します。これを次に示します。

この回路には、2つの入力(DとE)があります。Dは「データ」、Eは「有効」と考えることができます。Eが1の場合、QはDの後に続きます。ただし、Eが0に変わると、QはDで最後に見られたものをすべて記憶します。このように動作する回路は、一般にフリップフロップと呼ばれます。
次のセクションでは、JKフリップフロップについて説明します。
JKフリップフロップ
フリップフロップの非常に一般的な形式は、JKフリップフロップです。「JK」という名前の由来は歴史的には不明ですが、通常は次のようなブラックボックスで表されます。
この図では、Pは「プリセット」、Cは「クリア」、Clkは「クロック」を表します。

P C Clk J K Q Q '
1 11対01 0 1 0
1 11対00 0 1 0 1
1 11対011トグル
1 0 x x x 0 1
0 1 x x x 1 0
表の内容は次のとおりです。まず、プリセットとクリアがJ、K、Clkを完全にオーバーライドします。したがって、Presetが0になると、Qは1になります。 Clearが0になると、J、K、Clkが何をしているかに関係なく、Qは0になります。ただし、プリセットとクリアの両方が1の場合、J、K、およびClkは動作できます。1対0クロックが1から0に変化した場合、JおよびKの値が記憶されていることを表記手段は、それらが反対である場合。で低立ち上がりエッジクロック(1から0への遷移)の、J及びKが格納されています。ただし、JとKの両方がローゴーイングエッジでたまたま1である場合、Qは単にトグルします。つまり、Qは現在の状態から反対の状態に変化します。
あなたは今、「いったい何がそんなに良いのか」と自問しているかもしれません。 「エッジトリガー」の概念は非常に便利であることがわかりました。 JKフリップフロップが1から0への遷移時にJK入力のみを「ラッチ」するという事実により、JKフリップフロップはメモリデバイスとしてはるかに便利になります。 JKフリップフロップは、カウンター(デジタル時計を作成するときに広く使用されます)でも非常に役立ちます。JKフリップフロップを使用した4ビットカウンタの例を次に示します。

この回路の出力はA、B、C、およびDであり、4ビットの2進数を表します。左端のフリップフロップのクロック入力には、1から0に変化し、繰り返し1に戻る信号(発振信号)が入ります。カウンターは、この信号で検出されたローゴーイングエッジをカウントします。つまり、着信信号が1から0に変わるたびに、A、B、C、およびDで表される4ビットの数値が1ずつ増加します。したがって、カウントは0から15になり、その後0に戻ります。このカウンターに好きなだけビットを追加して、好きなものを数えることができます。たとえば、ドアに磁気スイッチを設置すると、カウンターはドアの開閉回数をカウントします。道路に光学センサーを設置すると、カウンターが通り過ぎる車の数を数えることができます。

JKフリップフロップの別の使用法は、ここに示すように、エッジトリガーラッチを作成することです。
この配置では、クロックエッジがローからハイになると、Dの値が「ラッチ」されます。ラッチは、中央処理装置(CPU)やコンピューターの周辺機器などの設計において非常に重要です。
ゲートの実装

前のセクションでは、非常に単純なブールゲートを使用することで、加算器、カウンター、ラッチなどを実装できることを確認しました。少し前までは、2つの数字を足し合わせるなどのことができるのは人間だけだったので、これは大きな成果です。少しの作業で、減算、乗算、除算を実装するブール回路を設計することは難しくありません...あなたは私たちがポケット電卓からそれほど遠くないことがわかります。そこから、コンピューターで使用される本格的なCPUへのジャンプはそれほど遠くありません。
では、これらのゲートを実際にどのように実装できるでしょうか。ブール氏は紙の上でそれらを思いついた、そして紙の上でそれらは素晴らしく見える。ただし、それらを使用するには、ゲートがロジックをアクティブに実行できるように、物理的な現実でそれらを実装する必要があります。その飛躍を遂げたら、実際の計算デバイスの作成に向けた道を歩み始めました。
ブール論理の物理的な実装を理解する最も簡単な方法は、リレーを使用することです。実際、これが最初のコンピューターの実装方法です。リレーを備えたコンピューターを実装する人はもういません。今日、人々はシリコンチップにエッチングされた超微細トランジスタを使用しています。これらのトランジスタは非常に小型で高速であり、リレーと比較して消費電力はごくわずかです。ただし、リレーは非常に理解しやすく、ブール論理を非常に簡単に実装できます。その単純さのために、「紙の上のゲート」から「物理的な現実に実装されたアクティブなゲート」へのマッピングが可能で簡単であることがわかります。トランジスタで同じマッピングを実行するのも同じくらい簡単です。
インバーターから始めましょう。リレーを使用したNOTゲートの実装は簡単です。これから行うことは、電圧を使用してビット状態を表すことです。バイナリ1を6ボルト、バイナリ0をゼロボルト(グランド)と定義します。次に、6ボルトのバッテリーを使用して回路に電力を供給します。したがって、NOTゲートは次のようになります。
[この図が意味をなさない場合は、リレーのしくみを読んで説明してください。]
この回路では、Aにゼロボルトを印加すると、Qで6ボルトが出力されることがわかります。また、Aに6ボルトを印加すると、Qでゼロボルトが出力されます。リレー付きのインバーターを実装するのは非常に簡単です。
同様に、2つのリレーを備えたANDゲートを実装するのは簡単です。

ここで、AとBに6ボルトを適用すると、Qは6ボルトになることがわかります。それ以外の場合、Qのボルトはゼロになります。それはまさに私たちがANDゲートに望む振る舞いです。ORゲートはさらに単純です。AとBの2本のワイヤーをつなぎ合わせてORを作成するだけです。必要に応じて、2つのリレーを並行して使用すると、それよりもさらに洗練されたものになります。
この説明から、リレーから3つの基本ゲート(NOT、AND、OR)を作成できることがわかります。次に、上記の論理図を使用してこれらの物理ゲートをフックし、物理8ビットリップルキャリー加算器を作成できます。単純なスイッチを使用してAおよびB入力を加算器に適用し、8本のQラインすべてを電球に接続すると、任意の2つの数値を加算して、ライトで結果を読み取ることができます( "light on" = 1、 "消灯」= 0)。
単純なゲートの形式のブール論理は非常に単純です。単純なゲートから、加算などのより複雑な関数を作成できます。ゲートを物理的に実装することは可能で簡単です。これらの3つの事実から、あなたはデジタル革命の核心を持っており、基本的に、コンピューターがどのように機能するかを理解しています。