標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第41回]
●ステップ動作について
[第38回]で「ステップ動作の回路」は削除する、と書いたところ、「ステップ動作は削除しないでほしい」というメールをいただきました。
どうも私の書き方が悪かったようで、誤解されてしまったようです。
当初、回路として用意していたステップ動作は、外部からステップパルスを入れるごとに、1命令ずつ実行していく機能で、これがあるとマシン語プログラムのデバッグに役立ちます。
しかしそれは1命令ごとに停止しながら実行するので、1命令そのものは通常の速度で一瞬のうちに実行してしまいます。
たとえば前回のMOV r,r’命令のタイミングチャートで説明したT0〜T6の期間が、一瞬で実行されてしまうので、そんなステップ動作は、この「つくるCPU」ボードにはあまりうれしい機能でもない、と考えたので、削除してしまうことにしたのです。
実はこのボードにはもっとうれしい「ステップ動作」の機能があるのです。
●外部クロックを使ってマシンサイクル毎に実行できる
通常は8MHzの水晶発振回路をもとにした、4MHzのクロックで動くのですが、「つくるCPU」ボードは、その4MHzをちょいと横に外しておいて、外部からもっとゆっくりしたクロックを与えて動作させることができるのです。
究極の動作としては、1クロックパルスずつ与えていくこともできます。
その場合には、1クロックパルスを与えるごとにT0→T1→T2→T3…というように、1クロックずつ回路が動作していく様子をボード上のLEDで観察することができるのです。
いままでにお見せしたクロック回路は、この部分を省略していたために、そういう機能は無いのか、という誤解を受けてしまったようです。
ですので、あらためて、外部クロック入力の部分も含めた回路図をお見せします。
ExclkEをLにすると、水晶発振回路からの4MHzクロックが禁止されて、外部クロック入力端子、Exclkから入力されたクロックがCPUクロックとして回路に供給されます。
●MOV r,r’の動作をクロックごとに実行させてみました
[第39回]で説明したOPコードフェッチサイクルと前回、[第40回]で説明したMOV r,r’の動作を、タイミングチャート通りの、T0〜T6(T0)のクロック毎にステップ動作をさせてみました。
例としてDレジスタの値(あらかじめデータとして55を入れておきます)を、Eレジスタ(あらかじめデータとしてF0を入れておきます)にMoveさせることにします。
ニーモニックは、MOV E,D です。
マシン語命令コードは、 01011010 になります(ddd=011、sss=010)。
D、Eレジスタに初期値を入れるための命令を実行したあと、MOV E,D を実行させるため、MOV E,D はメモリの0004番地に書くことになりました。
●クロック毎の動作の様子を写真に撮りました
写真はプログラムカウンタが0004になった、OPコードフェッチサイクルのT0からスタートします。
アドレスバス下位8ビット(A7−A0)には00000100が表示され、データバスには、命令コード01011010が表示されています。
緑色のアドレスバス表示LED(A15−A8、A7−A0)の少し上にあるPCADoutが点灯しています(アクティブLで点灯))。
PCADoutは、プログラムカウンタの値を外部アドレスバス(A0〜A15)に出力するための、74HC244のpin1、pin19につながっています。
PCADoutがアクティブ(L)になると74HC244のゲートが開いて、プログラムカウンタの値が外部アドレスバスに出力されます。
右下の黄色LEDグループの左から2番目はMEMRD(アクティブで点灯)で右から3番目はExclcE(外部クロックイネーブル)です。
すこし離れた右端の赤色LEDは電源ON表示です。
MEMRDがアクティブなのでinnerBUS(内部データバス)には、外部データバスの01011010が入っていますが、OPreg(OPコードレジスタ)にはまだひとつ前の命令がラッチされたままです。
写真中央付近にレジスタDとレジスタEがあります。
レジスタDには01010101が、レジスタEには11110000が表示されています(あらかじめそのようにセットしておきました)。
写真左上の黄色LEDはregWRとregRDです。アクティブのときに点灯します。
写真右上には縦に並んだ黄色LEDがあります。
レジスタ選択信号です。上から順に、d0〜d3、s0〜s3です。通常はd3とs3はHになっています。
d0〜d3、s0〜s3もまだ前の命令の状態のままです。
その少し左下にあとから追加された4個の赤色LEDがあります。
T、M、Wクロックのもとになる、Qa、Qb、Qc、Qd信号です。
写真はT0のタイミングですから、全部消灯しています。
T1の写真です。
T1になって、OPレジスタに命令コード01011010がラッチされました。d2〜d0はもとから011(レジスタE)でしたが、s2〜s0は010(Dレジスタ)に変わりました。
T2の写真です。
ステップが進んだだけで、LEDに変化はありません。
T3の写真です。
これも変化はありません。
プログラムカウンタはT3の終了時にカウントアップされるので、この時点ではまだ変化はしません。
T4の写真です。
MOV命令が実行されている様子です。
左上のregWRとregRDがともに点灯しています。
また写真中央部のDレジスタ回路の、DregRDが点灯しています。
regRDとs0〜s2によって、レジスタ選択回路の74HC238の出力のうち、DregRDがHアクティブになったことを示しています。
DregRDがアクティブになると、Dレジスタの値が、74HC244を通して、内部データバスに出てきます。
レジスタDのデータ01010101が内部データバスに出力されるとともに、Eレジスタも(regWRとd0〜d2によって選択され、74HC373のpin11がHになっていて)データが筒抜け状態なので、内部データバスと同じ01010101が表示されています。
OPコードフェッチ期間は終わっているので、MEMRDは消灯しています。
外部アドレスバスとデータバスが全点灯していますが、これは、T4、T5のタイミングは内部だけで行われる処理サイクルなので、メモリから何かを読む必要が無いため、PCADoutもMEMRDも非アクティブにしているからです。
外部アドレスバスもデータバスも非アクティブ(ハイインピーダンス)になってしまうため、プルアップ抵抗によってA0〜A15とD0〜D7の全LEDが点灯します。
確かにこの期間では、OPコードもフェッチしてしまって、メモリからデータ(命令コード)を読む必要がないため、アドレスバスもデータバスも開放してしまって構わないのですけれど(事実、Z80ではOPコードフェッチ後に、アドレスバスをダイナミックRAMのリフレッシュサイクルとして利用しており、一時的にアドレスバスをプログラムカウンタの出力から切り離しています)、こうやってマシンサイクルごとにステップ動作をさせていると、一時的にせよ、アドレスバスとデータバスの表示が全部Hになってしまうのは、なんだかなぁ、という感じがします。
ことにT3からT4へのタイミングでプログラムカウンタが+1される様子が確認できないのは残念です。
アドレスバスとデータバスについているLED表示回路は、本来は、CPU回路の外の基板に置くべきものです。
でも、どうせプログラムカウンタの表示も行うのだから、ここで兼用してしまおう、と考えたため、外部アドレスバスの表示回路を「つくるCPU」基板に含め、その代わりに、プログラムカウンタの表示をサボッてしまったのです。
しかし、こうやって実際に、マシンサイクルごとに動作させてみると、やっぱり外部アドレスバスの表示とは別に、プログラムカウンタの表示も、あった方がいい、ようです。
うーん。なんとか、考えてみます(なんとか、できるかなぁ…)。
T5の写真です。
regRDとDregRDはまだ点灯していますが、regWRは消灯しました。
T6(T0)の写真です。
アドレスが”0005”になって、次のOPコードフェッチサイクルT0になっています。
OPコードレジスタには、まださきほどのMOV命令(01011010)がラッチされたままですが、内部データバスには外部データバスと同じデータ(01110110)が表示されています。
2008.8.19upload
2008.8.20追記
前へ
次へ
ホームページトップへ戻る