 
3.順序回路
(じゅんじょ かいろ)
記憶回路のところで出てきたアドレス回路と似た回路を、
図3-1に示します。

図3-1 CPU内命令実行順序の制御
図3-1の上の方には、2ビットのカウンタと、スイッチSがついています。
右側には、処理をするための回路(単純化するために4処理だけにしてある)
があります。
これらの処理の内容については、CPU内で行われる処理ですが、
今は気にしなくても構いません。
これらの回路に、左側からC0〜C3の4本の線が入っていることだけを
気にして下さい。
これは、記憶回路で出てきたタイミングスイッチと同じものです。
それぞれの回路は、この線がオン(1)になったときに作動します。
下の左側の一番下には、カウント処理があります。
カウンタの右にはパルス発生器があります。
パルス発生器は、次のようなオン(1)、オフ(0)を繰り返す信号を
発生する回路です。

図3-2
パルス発生器
最初、スイッチがQ側に倒れていたとします。
このときOut側には、電流は流れませんので、
Out信号としてはオフ(0)になります。
A側に電流が流れますので、スイッチはP側に倒れます。
スイッチがP側に倒れた瞬間、Out側に電流が流れますので、
Out信号としてはオン(1)となります。
P側には電流が流れなくなり、Q側に電流が流れますので、
次にスイッチはQ側に倒れ、元に戻ります。
すなわち、Out信号は、オン、オフを繰り返します。

図3-2 パルス発生器の信号
カウンタの信号が、そのままカウント処理の入力線として入っています。
カウント処理の出力線は、
カウンタの2本の書込みデータ線に入っています。
カウント処理のタイミングスイッチは、
0と1が繰り返されるパルス信号です。
パルスが1になる度に、カウント処理が実行されることになります。
最初、カウンタには2ビットの2進数00(10進数0)が入っています。
Sスイッチはオフ(0)となっています。
SスイッチとAND演算された線が,C0〜C3すべてに入っていますから、
左側の処理はすべて動いていません。
Sスイッチをオン(1)にすると,
C0〜C3の入力線のSスイッチにつながっている線はオン(1)になります。
一方、カウンタは00ですから、
カウンタ読込み線両方にNOTが入っている箇所の
AND回路だけがONになります。
従って、C0だけがオン(1)、C1〜C3はオフ(0)になります。
従って、命令取出しが処理されます。
パルスがオンになったとき、カウンタが動きます。
(カウンタは、加える値が1に固定された加算回路です)
カウント処理の出力線にプラス1した値、01がセットされています。
次に、パルスがオフになるとカウンタの書込み線は、
パルスのNOTが乗っていますので
カウンタに出力線の値、01が書き込まれます。
カウンタの値が01になりました。
下位ビットにNOTがなく、上位ビットにNOTがある
AND回路の部分がオン(1)になります。
Sはあいかわらずオン(1)ですのでC1がオンになります。
そこで次命令アドレス計算の処理が動きます。
前の処理と同じようにカウンタが動きます。
カウンタは10になります。
同様にして、命令解読、命令実行が行われていきます。
さて、命令実行の処理のあと、カウンタの値は11ですが、
カウント処理によって100となりそうです。
しかし、カウンタの値は2ビットしかありません。
したがって、最上位の1は格納するビット記憶を
持っていませんので無視され、結果的に00になってしまいます。
そして、先頭に戻って処理が繰り返されるわけです。
ここで注意しておきましょう。
それぞれの処理よりも、パルス信号は遅くなければなりません。
したがって、各命令での処理よりも、
のんびりとフリップフロップが動くようにしておく必要があります。
このパルス信号をどれだけ早くできるか。
これがコンピュータの処理速度を決めることになります。
パソコンで使われるCPU速度の目安として、
何メガヘルツ等と書かれているものです。
1秒間にオン・オフされる回数を、何メガヘルツで示しているわけです。
今まで、スイッチを使って回路を考えていましたが、
電磁石によるスイッチは機械的に動いていますので、
スピードアップできません。
それぞれの回路の大きさも大きくなります。
そこで、スイッチの動きを、半導体素子を使って実現することになります。
ちょっと、むずかしい言葉を遣いますが、これがMOS型半導体です。
しかし、原理的には、MOS型半導体によるスイッチング回路も、
これまでに述べたスイッチによる回路と同じ動き方をしますので、
半導体の作り方を知りたい人以外は、
スイッチによる回路で理解してもかまいません。

(1) 命令取出し
メインメモリからハードウェア命令を取出し、
命令レジスタと呼ばれるメモリに移します。
メインメモリからの命令取り出しは、
図5-12に示した「記憶の移動その1」を
命令語長のビット数分を組み合わせたものです。
例えば命令語長が32ビットであれば、
32個分がつながった形になります。
図5-11をひとつの箱として表現し、このことを図にすると、
図3-2のようになります。
図3-2
命令取出し
(2) 次命令アドレス計算
命令語長分だけアドレスをカウントします。
ADD演算回路と同じようなものです。
例えば、バイト(8ビット)単位でアドレスがなされている場合、
32ビット命令長であれば、32/8=4を加算することになります。
(3) 命令解読
命令語解読とは、命令語のフィールドを分けて、
何の命令かを判別(命令判別)します。
例えば、次のような命令形式であったとします。
(例)マシン命令語の例
0 |
8 |
12 |
16 31 |
命令コード |
レジスタ部 |
アドレス修飾 |
アドレス部 |
まず、8ビット(命令コード部)、4ビット(レジスタ部)、
4ビット(アドレス修飾部)、16ビット(アドレス部)に分割します。
命令判別とは、どの命令かを判別することで、
原理的には、アドレスによる信号発生と同じような回路となります。
すなわち、命令コードが8ビットであれば、
それぞれの命令実行部に対して256通りの信号を
生成する回路となります。
命令コードを入力として、1つだけオン(1)、
それ以外はオフ(0)となるような信号を生成。
どこかで聞いたことがある回路ですね。
そうです。アドレス値から対応するビット番号を生成したときの信号です。
ですから、全く同じ回路になります。
ただし、上の例で言えば入力信号は命令コードの長さと同じ8ビットです。
(4) アドレス解決
回路の話からちょっとずれますが、
命令解読時にアドレス修飾によるオペランド部の
アドレス値計算処理が行われます。
ちょっと難しくなりますが、これを「アドレス解決」と呼びます。
通常のコンピュータでは、間接指定、インデックスレジスタ指定などが
代表的です。
間接指定とは、指定されたアドレスが命令の対象とする
アドレスではなく、指定されたアドレスのメモリに入っている値を
命令の対象にするアドレスとみなすことです。
ですから、オペランドに指定されているアドレスの
メモリ内容を読み込むだけで、回路の特別なしくみは必要ありません。
インデックスレジスタ指定とは、「インデックスレジスタ」と呼ばれる
CPU内のメモリ(これを「レジスタ」と呼びます)と
アドレス部を加算した結果が、命令の対象となるアドレスになります。
従って、回路としては加算回路となります。
ちょっと小難しくなりましたが、ここのところはサラっと流してください。
(5) 命令実行
命令実行は、コンピュータで前もって用意した色々な命令です。
汎用レジスタとメモリの内容を加算したり、
減算したり等の演算回路につなぎます。
これらは、命令解読の回路でオンにされたコードに対応する命令が
実行されることになります。
「次命令アドレス加算」のところでは、次に実行する命令は、
すぐ後だと仮定していますが、これを変えることができます。
次に実行する命令アドレスを変えてしまうのですから、
論理的には処理の流れを「ジャンプする」ということになります。

|