コンピュータ・アーキテクチャ [補足資料]

[論理回路]の復習  −簡単な電卓を設計するには−

井澤 裕司 


1. はじめに

CPU(中央処理装置)の動作を理解し、オリジナルのCPUを設計するためには、
基本的な論理回路から、コンピュータ・アーキテクチャまで幅広い知識が必要です。
 
ここでは、その手始めとして「最も単純な電卓」を設計し、その動作について理解を深めます。
これらの学習は、1年や2年で学んだ「論理回路」や「コンピュータ工学」の復習にもなります。
 
さらに、「電卓」と「コンピュータ」の類似点・相違点について、整理してみましょう。
CPUの基本的な原理や構造が、やがて見えてくることと思います。

2. 簡単な電卓を作ってみよう

2.1 電卓の機能
 
コンピュータを用いて、1桁の10進数の和を計算する機能について学習するため、
電卓で検討してみましょう。
 
電卓の入力装置は、数字やプラス(+)、イコール(=)等の記号を入力するテンキーです。
 
10進数のキーボードやテンキーを押すと、それぞれのキーに対応する電気信号が
発生します。
 
この電気信号を、10進数のキーに相当する2進数に変換します。これをエンコーダ
(符号器)といいます。1桁の10進数は4ビットの2進数で表すことができます。
 
例えば、テンキーの”7”を押すと”0111”という2進数が生成され、この2進数をレジスタ
に記憶します。
 
次に、テンキーの”+”(プラス)押すと、上の”0111”という2進数が加算器の一方の
入力レジスタにセットされます。
 
次に、テンキーの”3”を押すと、”0011”という2進数が生成され、この2進数をレジスタ
に記憶します。
 
テンキーの”=”(イコール)を押すと、2進数の”0011”が加算器のもう一方の入力レジ
スタにセットされます。
 
加算器の出力は5ビットの2進数”01010”になります。この演算結果を10進数に変換
します。この変換を行うのがデコーダ(復号器)です。
デコーダの結果を人間の目に見える形で表示するのがディスプレイです。電卓の場合、
液晶表示装置になります。

以上の電卓の機能を、最も簡単な回路で実現してみましょう。

キーになるのは、エンコーダ、加算器、デコーダです。


2.2 エンコーダの構成

ここではエンコーダを設計します。このエンコーダは、0から9までのキーのいずれか1つを押すと、
これに相当する4ビットの2進数を出力する回路です。
 
下に設計したエンコーダの回路を示します。テンキーを押すと、出力が変化しますので、いろいろ
試してみて下さい。
 

 
このエンコーダは簡単な組み合わせ回路です。10進数の”10”、”11”、”12”、”13”、”14”、”15”が
使用されていないことを利用して、論理を簡略化しています。具体的な簡略化手法に「カルノー図」が
あります。この手法の具体的な内容については、 「論理回路」の第5章 を復習して下さい。
 
なお、この回路は1桁の入力を想定しています。実際には、10桁以上の入力を想定しなければなりま
せん。この場合は、2進化10進符号を、2進数に変換する回路が必要になります。

2.3 加算器の構成
 
ここでは、正の4ビットの加算器を設計します。
この具体的な回路構成を以下に示します。
なお、FAは全加算器、HAは半加算器です。これらの具体的な回路については、 「論理回路」の第9章
参照して下さい。
 
入力の値をクリックすると、0と1の値を変えることができます。
いろいろ操作して、正しい結果が得られるか確認して下さい。
 
 
 
加算器の桁数を増やすには、全加算器をMSB側に増設します。
また、減算の機能を追加するためには、マイナスの数を 補数表現 する必要があります。
1の補数を用いた例を、 「論理回路」第9章 の最後に紹介してありますので、参考にして下さい。

2.4 デコーダの構成
 
次に、加算器出力の2進数を10進数に変換して、液晶等の 7セグメント表示装置 で表示するデコーダ回路に
ついて検討してみましょう。
 
一般の電卓では、2進数の計算結果を10進数に変換し、各桁ごとに数字の形状を7つのセグメントで表して
表示します。すなわち、10進数への変換と、表示用の変換操作が必要になるわけです。
 
1桁の10進数の加算の場合、表示すべき10進数は多くても2桁です。
ここでは、回路の簡単化を図るため、5ビットの2進数を直接2つの7セグメント表示装置で表示することを考え
てみましょう。なお、表示すべき10進数が1桁のときは、上位の桁には何も表示しないようにします。
 
通常の組み合せ回路の設計手法にならい、真理値表を作成して、論理式を簡略化し、MIL記号で回路図を
作成します。ここで、「加算器の出力が、10進数で18を越えることはない」ということを用いて、論理を簡略化
します。
 
このようにして得られた回路図を下に示します。なお、途中の過程については、各自トレースして下さい。
 
 
 

2.5 電卓の構成
 
これまで説明したエンコーダと加算器、デコーダに、 DFF を用いた レジスタ 、2組の信号の一方を選択して出力
するマルチプレクサ( セレクタ )、そしてこれらを制御する制御回路を追加すると、下の電卓が完成します。

なお、エンコーダには、いずれかのキーが押された状態を識別するため、10個の入力の論理和をとる機能を
追加してあります。
また、デコーダには入力ミス等のエラーが生じた場合、誤りを示す”E”という文字を表示する機能を加えました。
これは、内部に2組の入力(8入力)を切り替えるマルチプレクサ(セレクタ)を組み込むことにより実現します。
 
制御回路は、各キー入力に基づいて、状態遷移の図を描き、遷移表からDFF等で構成します。
クリアキー”C”で、これらのFFをリセットすると、初期状態に戻ります。
 

3. CPUによる加算

これまで電卓の構成について、整理してきましたが、次はCPUを用いて、簡単な数値の和を計算する場合に
ついて考えてみましょう。
 
下の図は、アセンブラ言語を用いて整数の4と3の和を計算し、その結果をI/Oポートの50番地に出力するプロ
グラムを表しています。CPUの種類には、最も簡単なx86系を想定しています。
I/Oポートの50は、2進数を10進数に変換して、コンソールに出力するポートの番号と考えて下さい。
 
ここで使用するCPUのレジスタは、axbx 2種類と、プログラムカウンタ (pc)です。
はじめに、プログラムカウンタが 0 にリセットされ、0番地の命令[mov ax, 4] から実行を開始します。
以下、各行の内容について簡単に説明します。
 
・0番地 [mov ax, 4] ;  axレジスタに値4を代入する。
・1番地 [mov bx, 3] ;  bxレジスタに値3を代入する。
・2番地 [add ax,bx] ;  axレジスタとbxレジスタの和を計算し、結果を axレジスタに代入する。
・3番地 [mov dx, 50];  dxレジスタに50を代入する。
・4番地 [out dx, ax];   dxレジスタで表されるアドレス(50)に、axレジスタの内容を出力する。
・5番地 [stop]    ;  プログラムカウンタを止める。
実際のCPUでは、 [mov] [add] のような記号(文字列)が使用されているわけではなく、これらに対応する
0と1で構成されるビット列 (これを 「マシン語」 「機械語」 と言います) をメモリから読み込んでいます。
ALU(Arithmetic and Logic Unit)は算術演算ユニットであり、加算だけでなく減算や、論理和・論理積等の
ビット演算、シフト命令等の演算を行うことができます。
乗算、除算については、かつてはビットシフトと加減算で実行したり、高速化のためコプロセッサという外部
プロセッサで実行していましたが、最近のCPUには、この乗除算をハードウェアで実現する機能が含まれて
います。
 
またこの例では、加算する数値は固定されていますが、実際にはキーボードから入力した内容を読み取る
ため、
 
 ・[mov dx,60]
 ・[ in  ax, dx]
 
のような命令が必要です。
また、7セグメントの表示装置を直接制御する場合には、デコードの機能をソフトウェアで実現しなければなり
ません。
 
これらの処理をハードウェアで行うのか、ソフトウェアで処理するのかは、CPUの性能やシステムに要求され
るアプリケーションによって変わります。
一般に、それらの仕様が変更される可能性がある場合はソフトウェア、変更の余地がなく、CPUの負荷を軽
くしたい場合はハードウェア化します。

4. まとめ

ここでは、「最も単純な電卓」を論理回路で構成する手法について、整理しました。
また、比較のため、簡単なCPUを用いて2つの10進数の和を計算する例を示しました。
 
この両者を比較・検討することにより、CPUと論理回路の間が若干でも埋まることを期待しています。
 
もともと、CPU(正確にはMPU:マイクロプロセッサ)は、電卓の開発を効率化するために、考え出され
たものです。このアイデアが実現されるにあたり、日本人の嶋正利氏が活躍されたことは有名な事実
です。MPU開発のエピソードについて、インターネット等を用いて調べてみられてはいかがでしょうか?