デジタル回路
コンピュータはスイッチが数十億個、数百億個集まった装置です。スイッチをいくつか集めると、計算したり、記憶したりすることができます。
2進数の章で、2の補数計算をすると足し算だけで、掛け算も、引き算も、割り算もできるという話をしました。足し算の基本は次の通りです。
0 |
+ |
0 |
= |
00 |
1 |
+ |
0 |
= |
01 |
0 |
+ |
1 |
= |
01 |
1 |
+ |
1 |
= |
11 |
この加算の回路が実現できれば、1桁の足し算が実現できます。これをいっぺんに作るのは大変ですので、少しずつ説明します。
コンピュータの回路は実際は半導体を使って作成しますが、半導体については、後の章で説明しますので、ここでは同じことをする電気回路を使って説明します。電気回路ではスイッチを手で押して、ON、OFFすると思っても構いませんが、自動化することもできます。コンピュータは現在は半導体を使って作られていますが、それ以前はリレーと呼ばれるスイッチを使って作られていました。リレーはスイッチを手で押す代わりに、電磁石の力を使って開閉を行うものです。リレーの構造は次のようになっています。電磁石に電気を流すと、磁石の力で、スイッチがONとなります。
次に示すのは、コンピュータで非常によく利用されている回路です。
上の回路でスイッチAとスイッチBを開くと、電球は消灯します。これを式にすると次のようになります。
A+B=Xとし、スイッチを開くこと(OFF)を「0」で表し、スイッチを閉じること(ON)を「1」で、電球が点灯することを「1」、消灯することを「0」で表わすと、次のようになります。このような計算を真理値計算といいます。
次はスイッチAを閉じて、スイッチBを開いた場合です。
スイッチは並列に並んでいますので、スイッチA、スイッチBのいずれかが閉じていれば、電球は点灯します。式は次の通りです。
真理値は次のようになります。
次はスイッチAが開いて、スイッチBが閉じた場合です。
式は次のようになります。
真理値は次の通りです。
次は、スイッチA、スイッチBがともに閉じた場合です。
式は次の通りです。
これを真理値に直すと次のようになります。
以上の真理値計算を4つ集めると、次の真理値表が出来上がります。
A |
B |
X |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
この式と、2進数の加算の表を比べてみましょう。
A |
+ |
B |
= |
X |
0 |
+ |
0 |
= |
00 |
1 |
+ |
0 |
= |
01 |
0 |
+ |
1 |
= |
01 |
1 |
+ |
1 |
= |
10 |
2つの表を比較すると桁上りがない場合の計算は、上の回路でできることが分かります。この回路はOR回路と呼ばれるもので、次のような記号であらわされます。
この記号に入力と出力を加えると次のようになります。
OR回路では桁上りの計算ができません。これを実現するのがAND回路と呼ばれる回路です。AND回路は次の記号であらわされます。
AND回路の真理値表は次の通りです。
A |
B |
X |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
AND回路についても電気回路で表すことができます。電気回路と、真理値計算を一緒に示します。
回路の式は次の通りです。
真理値は次の通りです。
これを論理回路で示すと次の通りです。
次は直列に並んだスイッチのうちAを閉じて、Bを開いたものです。
回路の式は次の通りです。
真理値は次の通りです。
これを論理回路で示すと次の通りです。
次はスイッチAを開いて、Bを閉じました。
回路の式は次の通りです。
真理値は次の通りです。
これを論理回路で示すと次の通りです。
次はスイッチAとスイッチBをともに閉じたものです。直列に並んだスイッチですので、AとBを同時に閉じることで初めて電球が点灯することが分かります。
回路の式は次の通りです。
真理値は次の通りです。
これを論理回路で示すと次の通りです。
OR回路とAND回路を使って1桁の数の足し算の回路を作ることができるのですが、そのためにはもう1つ必要です。これは入力と反対の値を出力する回路で、通常インバータ回路とか、NOT回路などと呼ばれています。
NOT回路は、半導体を使うと簡単に作ることができるのですが、電気回路だと次のようになります。入力が0Vだと電磁石が働かずにスイッチは開いたままで、出力は5Vとなります。
これに対して、入力が5Vだと電磁石が働いで、スイッチを閉じて、出力は0Vとなります。
記号は次の通りです。
入力をA、出力をBとすると次の真理値表が出来上がります。
1桁の2進数の計算を、桁上りを含めて行うと、次のようになります。Cは桁上りを示します。
A |
B |
C |
S |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
この真理値表を論理回路で実現すると次のようになります。
本当にこれで1桁の足し算ができるのでしょうか。ちょっと疑問と思う人もいるでしょうから、確認してみましょう。
A |
0 |
1 |
0 |
1 |
|
0 |
1 |
0 |
1 |
|
0 |
1 |
0 |
1 |
B |
0 |
0 |
1 |
1 |
|
0 |
0 |
1 |
1 |
|
0 |
0 |
1 |
1 |
a |
0 |
1 |
0 |
1 |
g |
0 |
1 |
0 |
0 |
S |
0 |
1 |
1 |
0 |
b |
1 |
1 |
0 |
0 |
c |
1 |
0 |
1 |
0 |
h |
0 |
0 |
1 |
0 |
d |
0 |
0 |
1 |
1 |
e |
0 |
1 |
0 |
1 |
i |
0 |
0 |
0 |
1 |
C |
0 |
0 |
0 |
1 |
f |
0 |
0 |
1 |
1 |
表は入力AとBが、それぞれ00、10、01、11の場合のa、b、c、d、e、f、g、h、iの値と、出力SとCの値を表しています。うまくいっているようです。
この回路をどうやって設計するかですが、教科書にはカルノー図を使った設計方法が細かく説明されています。論理設計を頭で理解するにはとてもいい方法だと思いますが、複雑な設計になるとお手上げです。最近では、LSI(Large-Scale
Integration)の設計・開発にはハードウェア記述言語(HDL、Hardware Description Language)と呼ばれる手法が広く利用されています。
上と同じ動きをする回路はいくつかありますが、例としては次のようなものがあります。
AND回路の出力に白い丸が付いていますが、これは値を反転するという意味です。ANDの出力を反転しますので、0の時は1、1の時は0となります。このような回路をNAND回路といいます。真理値表は次のようになります。
A |
B |
X |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
0 |
次の表はA、Bが00、10、01、11の場合のd、e、fの各値と出力S、Cの値です。S、Cを確認すると、1桁の加算ができていることが分かります。
A |
0 |
1 |
0 |
1 |
|
0 |
1 |
0 |
1 |
|
0 |
1 |
0 |
1 |
B |
0 |
0 |
1 |
1 |
|
0 |
0 |
1 |
1 |
|
0 |
0 |
1 |
1 |
a |
0 |
1 |
0 |
1 |
e |
1 |
0 |
1 |
1 |
S |
0 |
1 |
1 |
0 |
d |
1 |
1 |
1 |
0 |
f |
1 |
1 |
0 |
1 |
b |
0 |
0 |
1 |
1 |
C = ¬ d |
C |
0 |
0 |
0 |
1 |
※dの前についている「¬」は否定を表します。否定は文字の上に「¯」を付けるのが、一般的ですが、この表記はパソコンでは打ち出すのが難しいので、文字の前に「¬」を付けています。「~」を使って否定を表すこともあります。
2つの回路を紹介しましたが、後で説明した回路はNANDだけで構築してありますので、効果的に回路を構築することができます。LSIのように何十億個もの回路を、狭い面積にギュッと押し込めるためには同じ回路の方が効率的です。
これらの回路は桁上りの計算はできますが、下位の桁からの桁上りを処理することはできません。従って、これらの回路は半加算器と呼ばれます。次の記号を半加算器の記号とします。
半加算器を2つ組み合わせると、下位の桁からの桁上りを処理することができます。このような回路を全加算器と言います。それでは下位からの桁上げを考慮した真理値表を作ってみます。下位桁からの桁上りをCn-1、和をSn、桁上りをCnで表すことにします。
入力 |
出力 |
A |
B |
Cn-1 |
Cn |
Sn |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
これを実現するための回路は次のようになります。
この全加算器を記号にすると次のようになります。
この全加算器を必要なだけ並べると加算器が出来上がります。次に示すのは4ビットの加算器です。
加算器があると、2の補数の計算をすることで引き算ができます。掛け算はどうでしょうか。掛け算は足し算で行うことができるのですが、2進数ではもっと簡単です。例えば、ある数を2倍するには、掛けられれる数(被乗数)を1ビットシフトするだけです。4(=22)倍の場合は、2ビットシフトするだけです。8(=23)を掛ける場合は3ビットシフトするだけです。でもこれでは、2のべき乗を掛ける場合だけです。では、例えば18倍する場合はどうでしょうか。18を2のべき乗で表現すると、18=24+21となって、これは4ビットシフトした数と、1ビットシフトした数を足せばいいということになります。ただし、これだといったんシフトした数をレジスタに保存しておく必要がありますので、演算時間が余計にかかってしまいますので、組み合わせ回路でいっぺんに計算してしまおうという考え方も出てきます。こうすると、高速に計算できますが、回路が複雑になってしまいます。
割り算はどうでしょうか。これも掛け算と同様で、ビットシフトと引き算でできます。
半加算回路の辺りから少しずつ分からくなって、全加算回路については全く分からないという人もいるかもしれませんね。どうして、このような回路になるのかの説明が全くなかったわけですので、無理もないと思います。しかし、ここの辺りを分かり易く説明するには、数学的な基本が必要です。特にブール代数と呼ばれる、代数を学ぶ必要があります。その後、このブール代数とカルノー図を使って、回路を設計すると、分かってくると思います。
また、コンピュータは計算を行うためには、データを記憶しておくことも必要となります。これらについてはブール代数とカルノー図を説明した後に、説明することにします。
※比較的新しいCPUでは高速計算をするために、加算だけでなく、乗算、減算、除算も行うものもありますが、基本は加算回路です。
参考文献
●清水賢資 『デジタル情報回路』 森北出版
●雨宮好文 『デジタル回路の考え方』 照晃堂
●室賀三郎 『論理設計とスイッチング理論』 共立出版
更新履歴
2016/11/28 作成 |