標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第46回]
●改造後の回路で、MOV M,rの動作をクロックごとに実行させてみました
前回説明した改造後のMOV回路を検証するために、MOV M,rの動作を、T0〜T6(T0)のクロック毎にステップ動作をさせてみました。
[第37回]でMOV命令の動作テストに使ったプログラムを利用します。
0000 2600 MVI H,00
0002 2E07 MVI L,07
0004 3E76 MVI A,76
0006 77 MOV M,A
0007 AA ”AA”
プログラムのうち、0006番地のMOV M,Aが今回テストする命令です。
テストとして、HLレジスタには0007を入れるので、Mのメモリアドレスは0007番地になります。
Aレジスタには”76”が入れられます。
0007番地には初期値として適当なデータ(”AA”)がはいっています。
0006番地のMOV M,Aの実行によって、Aレジスタにはいっている”76”が、メモリの0007番地に書き込まれます。
●クロック毎の動作の様子です
最初の写真はプログラムカウンタ0006から始まります。
MOV M,A命令の、OPコードフェッチサイクルのT0です。
アドレスバス下位8ビット(A7−A0)には00000110が表示され、データバスには、命令コード01110111が表示されています。
回路の動作がより理解しやすくなるように、またLEDをいくつか追加しました。
外部データバスと内部データバスの間にある74HC245の向きをコントロールしているDataDIR(外部→内部のとき点灯)と、同74HC245がアクティブで外部データバスと内部データバスがつながっていることを示すDataEnable(アクティブのとき点灯)、それからOPコードをOPコードレジスタにフェッチするときに点灯するOPcodefetch、および少し位置が離れてしまいましたが画面中下に、PC(プログラムカウンタ)が+1されるタイミングで点灯するPCincを追加しました。
プログラムカウンタの値は00000110です。
PCADoutが点灯していて、プログラムカウンタの値が外部アドレスバス(A0〜A15)に出力されていることを示しています。
MEMRDがアクティブなので、メモリから0006番地の値77(01110111)が外部データバスに出力されています。
DataEnableもDataDIRも点灯していて、innerBUS(内部データバス)に、外部データバスから01110111が入っていることがわかります。
OPreg(OPコードレジスタ)には、まだひとつ前の命令(”3E”)がラッチされたままです。
PC(L)の右側のHレジスタとLレジスタには、0000〜0003のプログラムの実行によって、Hレジスタに00が入り、Lレジスタに07が入っています。
HLをあわせて16ビットの値0007として、Mを指定するメモリアドレスとして使われます。
写真中央右上寄りにあるA〜Dは、T、M、Wパルスの元になる74HC161からの出力信号Qa〜Qdです。今はT0ですから全部消灯しています(Qa〜Qd=0)。
T1の写真です。
Aのみ点灯して、T1サイクルであることを示しています。
T1になって、OPコードレジスタに命令コード01110111が表示されました。
ラッチパルスが入力されていることを示す、OPcodeFetchが点灯しています。
OPコードレジスタに使っている74HC373はラッチパルス(G入力、pin11)の終わりのタイミングでデータをラッチするので、このタイミングでは命令コードは「筒抜け」になっているだけで、まだラッチはされていません。
OPcadeFetchの点灯→消灯のタイミングで、命令コードがOPコードレジスタにラッチされます。
d2〜d0は110(メモリM)に変わりました。
s2〜s0は111(レジスタA)に変わりました。
d3、s3は通常はHです。
T2の写真です。
ステップが進み、Bのみ点灯して、T2であることを示しています。
OPcodeFetchが消灯しました。
T3の写真です。
A、Bが点灯して、T3サイクルであることを示しています。
PCincが点灯しました。
プログラムカウンタはT3の終了時にカウントアップされるので、この時点ではまだ変化はしません(PCincが点灯→消灯のタイミングでカウントアップされます)。
T4の写真です。
Cのみ点灯して、T4サイクルであることを示しています。
PCincが消灯しました。
プログラムカウンタが+1されて、PC(L)は07(00000111)になりました。
外部アドレスバスも”0007”ですが、よくみるとPCADoutは消灯していてプログラムカウンタの値が出力されているのではないことがわかります。
PCADoutの代わりにHLselが点灯しています。
HLレジスタの値の”0007”がアドレスバスに出力されていることがわかります。
AregRDが点灯していて、内部バスにはAレジスタの値が出力されています。
DataEnableは点灯していますが、DataDIRは消灯しているので、内部データバス→外部データバスの向きになっていて、内部データバスのデータが外部データバスに出力されていることがわかります。
画面左上、regRDとともにregWRも点灯しています。
regWRが点灯していてd2〜d0=110なので、MEMWRが点灯しています(MEMRDは消灯しました)。
OPコードレジスタにはまだMOV M,A命令の01110111がラッチされています。
T5の写真です。
AとCが点灯して、T5サイクルであることを示しています。
MEMWRは消灯しましたが、DataEnableはまだ点灯していて、内部データバスのデータが外部データバスにまだ出力されていることを示しています。regRD、AregRDもまだ点灯しています。
HLselも点灯していますから、アドレスバスもHLレジスタの値がまだ出力されていることを示しています。
T6の写真です。
T6サイクルは一瞬で完了し、またT0サイクルに戻るため、A〜Dは全部消灯しています。
HLselが消灯し、代わりにPCADoutが点灯しています。
今までHLレジスタの値が外部アドレスバスに出力されていたのに代わって、同じ値なのですが、プログラムカウンタの値(0007)が出力されています。
2008.8.24upload
前へ
次へ
ホームページトップへ戻る