標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第39回]

●OPコードフェッチサイクル

いよいよCPU回路の動作説明にとりかかります(大変お待たせしました)。

CPUが動作するためには、クロックが必要です。
この「つくるCPU」ボードではCPUクロックを得るために、8MHzの水晶を74HCU04で発振させ、74HC74で2分周して得た4MHzを使います。
その回路図は前回にもお見せしましたが、実は基板に実装した回路とは異なっていて、実際よりも省略しています。それについての詳細はまた後ほど説明することにいたします。
ここでは、そのような回路によって4MHzのCPUクロックが作られていることだけを覚えておいてください。

さて、RESETによってプログラムカウンタが0クリアされ、その後RESETが解除されると、CPUが真っ先にするのは、メモリの0000番地の内容を、マシン語命令として読み出して、OPコードレジスタにラッチすることです。
この動作期間をOPコードフェッチサイクルといいます。
すべてはここからはじまります。

OPコードフェッチサイクルのタイミングチャートです。


なかなかに大変なものです。
「つくるCPU」基板の回路では4MHzのCPUクロックをもとにして、さらにT、M、Wのクロックをつくって、全ての動作をそのクロックにあわせて行います。
このクロックこそが「つくるCPU」回路のキモ中のキモなので、タイミングチャートについて説明するまえに、T、M、Wクロックの発生回路について説明することにします。

●T、M、Wクロック発生回路は「つくるCPU」回路の心臓部です

これがT、M、Wクロック発生回路です。


CPUクロック(4MHz)はバイナリカウンタ74HC161で分周されてQa、Qb、Qc、Qdのクロック出力を得ます。
74HC161ではQdまでしか出力できませんが、「つくるCPU」回路ではQeまで必要なので、Qeは74HC74によって作り出しています。

QaはCPUクロックの1/2の2MHz、Qbはその1/2の1MHz、Qcはそのまた1/2の500KHzでさらにその1/2の250KHzがQdです。Qeはさらに1/2の125KHzになります。
Qa、Qb、Qc、Qd、Qeを74HC238に入力することで、T、M、Wの各タイミングパルスを得ます。

理解を助けるために、74HC238(1)からT0〜T7のタイミングパルスが出力される様子を下にタイミングチャートで示します。

このタイミングチャートはCPUリセット直後のものだと考えてください。
クロックのタイミングはT0からはじまってT1、T2、T3と進んで行きます。
74HC161の出力が74HC238(1)に入力されることによって、74HC238(1)のY0〜Y7出力からはT0〜T7の各1CPUクロック期間(250ns)のみHになるパルスが出力されます。

74HC238(1)のpin4に入力されるQdによって、T8〜の期間には74HC238(1)からパルスは出力されません。
その期間には74HC238(2)のY0〜Y7からT8〜T15のパルスが同じように出力されます。

同様にして、74HC238(3)はQb、Qc、Qdの入力によって、Tの2倍幅のパルスを出力します。
たとえば、M0はT0+T1の期間HになるパルスでM1はT2+T3の期間Hになるパルスです。

74HC238(4)はQc、Qd、Qeの入力によって、Mのさらに2倍幅のパルスを出力します。
たとえば、W0はM0+M1の期間(T0〜T3の期間)Hになるパルスで、W1はM2+M3の期間(T4〜T7)の期間Hになるパルスです。

上の回路図で出力が「歯抜け」になっているところがあるのは、出力が無いのではなくて、そのタイミングの出力はたまたま命令の実行に利用されないパルスだったため、表示を省略しただけです。

●もういちどOPコードフェッチのタイミングチャート

そこまで理解ができたところで、最初に戻って、OPコードフェッチのタイミングチャートを見てみることにしましょう(←リンクをクリックするとOPコードフェッチのタイミングチャートが表示されます。表示されたあと、「ブラウザ」の「戻る」ボタンをクリックすると、またここに戻ってくることができます)。

CLOCK(4MHz)の下のTn(Qa)、Mn(Qb)、Wn(Qc)は今説明したT、M、Wの各パルスの出力されるタイミングをQa、Qb、Qcの出力波形を使って示しています。
図のタイミングチャートはT0、T1、T2、T3の期間であることを示しています。それはまた同時にM0、M1の期間でもあり、またW0の期間でもあります。

つまりW0の期間に、CPUは何をするかというと、メモリからデータ(実はマシン語命令コード)を読んで、OPコードレジスタにラッチします。
そのためには、何をしなければならないか、というと、まずPC(プログラムカウンタ)の値を外部アドレスバスA0〜A15に出力しなければなりません。
そこで、プログラムカウンタの回路図が必要になってしまいますね。

●プログラムカウンタの回路図です



図の一番上、PCADoutをアクティブ(L)にすると、プログラムカウンタ74HC193(1)〜(4)の出力をゲートしている2個の74HC244がアクティブになって、プログラムカウンタからの出力が外部バスA0〜A15に出力されます。
したがって、W0の期間中、このPCADoutをLにします。

それだけではまだメモリからデータは出力されません。
MEMRDをアクティブにしなければなりません。
そうすると、外部データバスにメモリからデータが出力されます。

やっとこれで外部データバス(D0〜D7)にデータが出てきました。
CPUはそのデータを、データ入力回路を通して、内部データバスに読み込まなければなりません。
データ入力部とOPコードレジスタの回路図は[第25回]でお見せしましたが、もう一度、今回の説明で必要なOPコードレジスタ部分のみ取り出して下に示します。

●OPコードレジスタ部分の回路図です



[第25回]の回路図では74HC373のG入力が「T2」になっていましたが「T1」の間違いでした。今回の回路図では訂正してあります。
図の左下、DataGをLに、そしてDataDIRをHにすると74HC245のゲートが開いて外部バスD0〜D7のデータが内部バスiB0〜iB7に入ってきます。

●制御信号作成回路です

以上説明した複数の制御信号を、W0の期間に作り出さなければなりません。
下図がその制御信号作成回路です。



うーん。なんだかごちゃごちゃしていてわかりにくい、ですねえ。

OPコードフェッチのタイミングに必要な部分だけ取り出してみます。



これで分かり易くなりました。

●論理ゲートの回路図はこう描くと、もっとわかりやすくなります

本当のことをいうと、これでもまだわかりにくいところがあります。
このように描き換えると、もっとわかりやすくなります。

どこを描き換えたかといいますと、74HC04(4)pin3、4と、74HC04(4)pin5、6と、74HC00(4)pin1、2、3と、74HC00(4)pin12、13、11です。
このように描き換えると、信号のH、Lがはっきりと見えてきます。
おおもとのW0はHアクティブです。
PCADout出力のためのゲート、74HC00(4)のpin9には、W0がHの期間、同じHパルスが与えられて、そのときLパルスが出力されます。なおpin10の入力は通常はHになっています。

それとは逆に、DataDIR出力のための74HC00はゲートの描き方が違っています。
このゲートの描き方の違いについては[第21回](●ORゲートがANDになる?)で説明しました。
[第21回]では、ORをANDに描き換えましたが、今度はANDをORに描き換えています。
考え方は[第21回]で説明したことと同じです。

74HC00(4)のpin13の入力には小丸印がついています。信号がLのときに意味がありますよ(Lアクティブ、負論理)という印です。
この入力ラインをたどっていくと、W0入力に行きつきます。

W0はHのときに意味がありました(Hアクティブです)。
74HC05(3)で反転して小丸印のついた出力になります(Lアクティブになる)。
次の74HC04(4)の入力には、74HC05(3)の出力と同じように小丸印がついていて、L信号に意味があることを示しています。
出力は反転してHアクティブになります。
そしてさらにその次の74HC05(2)ではまたHからLに反転して出力されます。
そして最後に74HC00(4)pin13の入力になります。

こうやって論理をたどっていくことによって、74HC00(4)pin13の小丸印には意味があって、W0がHの期間に、pin13にはL信号が入力され、その結果HパルスがDataDIR信号として出力されることがはっきりとわかります。

しかし、もとの回路図では、正負の論理を考慮していないため、DataDIRがいったいHでアクティブになるのか、それともLでアクティブになるのかはっきりわかりません。
それじゃあ、最初から、この後の回路図のように描けばよいじゃないか、と文句を言われてしまいそうなのですが、まったく、その通りなのです。

実は今回の回路図は、当初から説明書に添付する、つまり、他人に見せることを意識して描いたものです。
コンピュータの回路は複雑で、全部の回路が、ここで説明したように、正論理、負論理ではっきりと描き分けることができればよいのですが、中にはH、Lの両方に意味があって、片方の論理だけを強調すると、もう一方のラインの辻褄が合わなくなってしまうようなことが出てきてしまいます。
自分のためだけの回路図でしたら、その辺は理解していますからいいのですけれど、他人が見ると、「何だ、これは?わからんではないか?」ということになってしまいます。
そのあたりの交通整理をうまく考えながら描いていくというのは、なかなかに面倒なことなので、今回は最初から、論理は考えないで、一般的なゲートの表記で押し通す、ことにしたのです。

しかし、あらためて、こうやって説明をしていくと、今回の回路図のように、論理にしたがった表記を考えたほうがいい、というところがまだまだ出てきそうです。
したがって、今後もケースバイケースで、そうしたほうがわかりやすいと思ったところは、できるだけ、わかりやすい回路図になるように考えていきたいと思います。

●OPコード(マシン語命令コード)をOPコードレジスタにラッチします

回路図の説明が長くなって、また本題からはずれてしまいました。
回路図からわかるように、W0の期間にPCADout、MEMRD、DataG、DataDIRがアクティブになります。

やっとデータが内部バスまで入ってきました。
そこで、OPコード(マシン語命令コード)をOPコードレジスタにラッチします。
さきほどのOPコードレジスタの回路図をもう一度、見てください。
OPコードレジスタ74HC373のG入力にはT1が入っています。
つまり、T1のタイミングでOPコードレジスタにマシン語命令コードがラッチされます。

ちょっと、待ってぇ!
どうして、今メモリから出力されたデータが、ただのデータではなくて、マシン語の命令コードだとわかるのぉ?
ああ、そうか。とりあえず、なんでもかでも、ラッチしておいて、後でゆっくり命令コードか、それともただのデータか、判別しようっていうんでしょ。

いーえ。そうじゃありません。
ちゃんと命令コードだけをラッチするのです(もっとも、プログラムを書く人が、ちゃんとルールをわきまえて、正しく書いてくれたら、という条件つきですけれど、ね)。

どうしてそのようなことが可能なのかは、回路の説明が進んでいくと、自然にわかってきます。
なので、それについては、しばらく後までのお楽しみ、にしておいてください。
ここでは、CPUの回路は、そういうところまで緻密に考えて設計していくことが必要なのだ、ということを理解しておいてください。

ということで、とにかく、先に進みましょう。

●そして最後の仕上げです

最初のタイミングチャートに戻りましょう。
W0の期間にメモリからデータが出力されて、内部バスに読み込まれたあと、T1のタイミングでOPコードレジスタにラッチされます。
OPコードフェッチはこれで完了です。必要なOPコード(マシン語命令コード)はOPコードレジスタにラッチしてしまいました。

そこで、次のステップに進むための準備として、T3のタイミングでPC(プログラムカウンタ)を+1カウントアップしておきます。
プログラムカウンタの回路図で、最下位カウンタ74HC193のUP入力(pin5)に、T3が入っています(他にもいろいろ入っていますが、気にしないでください)。

これで、マシン語命令コードがOPコードレジスタにラッチされ、その次のタイミングでプログラムカウンタが+1される回路が出来上がりました。
2008.8.17upload
2008.8.18加筆&修正

前へ
次へ
ホームページトップへ戻る