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

●MOV r,Mの動作をクロックごとに実行させてみました

前回説明したMOV r,Mの動作を、T0〜T8(T0)のクロック毎にステップ動作をさせてみました。
Mは、HLレジスタの値によって間接的にアドレス指定されるメモリアドレスです。

MOV r,Mの動作をテストするために、次のプログラムを実行させました。

0000 2600 MVI H,00
0002 2E02 MVI L,02
0004 56  MOV D,M

プログラムのうち、0004番地のMOV D,Mが今回テストする命令です。
テストとして、HLレジスタには0002を入れるので、Mのメモリアドレスは0002番地になります。
0002番地にはMVI命令(マシン語命令コード”2E”)がありますから、0004番地のMOV D,Mの実行によって、0002番地にあるコードの”2E”が、データの”2E”として、Dレジスタに書き込まれます。

このように同じメモリアドレスであっても、命令の実行の流れとして、命令コードとして実行されたり、ただのデータとして扱われたりします。

●クロック毎の動作の様子です

今回もMOV r,r’と同じように、クロック毎の動作を写真に撮りました。
最初の写真はプログラムカウンタ0004から始まります。
MOV D,M命令の、OPコードフェッチサイクルのT0です。



アドレスバス下位8ビット(A7−A0)には00000100が表示され、データバスには、命令コード01010110が表示されています。
プログラムカウンタの下位8ビットの出力がわかるようにLEDを追加しました。PC(L)です。
プログラムカウンタの値は00000100です。
PCADoutが点灯していて、プログラムカウンタの値が外部アドレスバス(A0〜A15)に出力されていることを示しています。

MEMRDがアクティブなので、メモリから0004番地の値56(01010110)が外部データバスに出力されていて、同時にinnerBUS(内部データバス)にも、外部データバスから01010110が入っていますが、OPreg(OPコードレジスタ)にはまだひとつ前の命令がラッチされたままです。

PC(L)の右側にレジスタHとレジスタLがあります。0000〜0003のプログラムの実行によって、Hレジスタには00が入り、Lレジスタには02が入っています。
HLをあわせて16ビットの値0002として、Mを指定するメモリアドレスとして使われます。

写真中央右上寄りにあるA〜Dは、T、M、Wパルスの元になる74HC161からの出力信号Qa〜Qdです。今はT0ですから全部消灯しています(Qa〜Qd=0)。

T1の写真です。



Aのみ点灯して、T1サイクルであることを示しています。
T1になって、OPコードレジスタに命令コード01010110がラッチされました。
d2〜d0は010(レジスタD)に変わりました。
s2〜s0は110(M)ですが、今回の回路としてはs2〜s0は使われません。
d3、s3は通常はHです。

T2の写真です。



ステップが進んだだけで、Bのみ点灯して、T2であることを示しているほかは、LEDに変化はありません。

T3の写真です。



A、Bが点灯して、T3サイクルであることを示しているほかは、変化はありません。
プログラムカウンタはT3の終了時にカウントアップされるので、この時点ではまだ変化はしません。

T4の写真です。



Cのみ点灯して、T4サイクルであることを示しています。
プログラムカウンタが+1されて、PC(L)に05(00000101)が表示されています。
しかし外部アドレスバスは、0005ではなくて、HLレジスタの値である0002が表示されています。

PCADoutが消灯しています。
PCADoutが非アクティブなので、PC(プログラムカウンタ)の値は外部データバスには出力されません。

代わってHLselが点灯していて、HLsel信号がアクティブ(L)であることを示しています。
HLselがアクティブになると、HLレジスタの値が外部アドレスバスに出力されます。
外部アドレスバスにHLレジスタの値0002が出力されていて、MEMRDもアクティブなので、データバスにはアドレス0002のメモリの値、00101110(2E)が出力されていて、同時に内部データバスにも同じ値00101110が入っています。

しかしOPコードレジスタにはまだMOV D,M命令の01010110がラッチされており、d2〜d0も010でDレジスタを示しています。

T5の写真です。




AとCが点灯して、T5サイクルであることを示しているほかは、変化はありません。

T6の写真です。



BとCが点灯して、T6サイクルであることを示しています。
regWRが点灯しています。
regWRとd2〜d0によってDレジスタの74HC373のpin11がHになるので、データが筒抜けになり、内部データバスのデータ、00101110がDレジスタの出力からも出ています。
このデータはT6の終わりのタイミングでDレジスタの74HC373にラッチされます。

T7の写真です。



A〜Cが点灯し、T7サイクルであることを示しています。
regWRが消灯し、レジスタへの書き込みが完了したことを示しています。

T8(T0)の写真です。



T8サイクルは一瞬で完了し、またT0サイクルに戻るため、A〜Dは全部消灯しています。
HLselが消灯し、代わりにPCADoutが点灯しています。
今までHLレジスタの値が外部アドレスバスに出力されていたのに代わって、またプログラムカウンタの値(0005)が出力されています。
2008.8.21upload

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