トランジスタでCPUをつくろう!
トランジスタで8080をつくってしまおうというまさにびっくり仰天、狂気のプロジェクトです!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
見事にできましたら、もちろんTK−80モニタを乗せて、それからBASIC、CP/Mを走らせましょう!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
[第260回]
●動作テスト(4)LD A,d、LD B,d、ADD A,B、OUT A、HLT(前回の続き)
前回からの続きです。
前回はCLK=Lの状態でRESETをかけたところまでで終りました。
下の画像です。
下はZB3BASICのマシン語モニタコマンドでその続きの操作をしている画像です。
ot 83,07
ot 83,06
ot 83,07
と続けて操作しながら写真を撮りました。
ot 83,07は82C55のPC3の出力を1にするマシン語コマンドです。
ot 83,06は82C55のPC3の出力を0にします。
82C55のPC3を1にするとCLK=Hになります。
PC3を0にするとCLK=Lになります。
CLKがL、H、L、Hと変化すると1マシンクロックになって、MYCPU4のマシン語命令が1つ実行されます。
さきほどの写真は最初のCLK=Lのときの写真です。
MYCPU4のテストプログラムの最初の命令、LD A,0011の最初のCLKです。
CLKがL、H、L、Hと変化するとき、それをCLK1、CLK2、CLK3、CLK4とするとさきほどの写真はCLK1のときの写真ということになります。
上の操作ではそれに続けてCLK2、CLK3、CLK4とCLKを進めて1マシンクロックを実行したことになります。
実はLD命令は次のCLK2もCLK1の状態から変化しません。
CLK2の写真は先ほどの写真と同じですから省略します。
CLK3の写真です。
左上のDECODE回路基板のAwr(赤LED)が点灯しています。
LEDのレイアウトについては前回([第259回])のシルク図を参照してください。
Awr_は内部バスの値をAレジスタに書き込むための信号です。
Awr_がLのときLEDが点灯します。
Awr_がLからHになったときにAレジスタに値が書き込まれます。
CLK3でAwr_はLになりますが、まだAレジスタに書き込みは行なわれません。
CLK3からCLK4になったときにAwr_がHになって、そのときAレジスタに書き込みが行なわれます。
回路図は[第250回]および[第251回]を参照してください。
CLK4の写真です。
Awr(赤LED)が消灯し右上のREGISTER回路基板のAレジスタ(青LED)が0011になって内部バスの値が書き込まれたことを示しています。
その右側のALUの赤LEDは0110になっています。
Aレジスタの0011とB/dの0011が加算された結果がALUから出力されています。
次の4ステップ(1マシンクロック)を実行しました。
LD B,0101(マシン語コード00010101)の実行です。
CLK1の写真です。
左下のRAM/CLOCK基板のアドレスA7〜A0(青色LED)が01(00000001)、データD7〜D0(赤色LED)は15(00010101)になりました。
さきほどはLD A,0011でしたが今度はLD B,0101です。
書き込むレジスタは異なりますが同じLD命令なので動作はほとんど同じです。
データバスの下位4ビット(0101)が写真右上のREGISTER回路基板のBレジスタ/定数セレクト出力(B/d)LEDにも表示されています。
同じ値をBレジスタに書き込むため内部バスにも出力されています。
LD A,0011と同じで写真左上のDECODE回路基板のBdsel(青色LED)とBdout(青色LED)が点灯しています。
REGISTER回路基板のALUの出力(赤色LED)が1000になっています。
Aレジスタの0011と定数データの値0101が加算された結果がただちにALUの出力になっています。
0011+0101=1000です。
次に実行される命令ADD A,Bの結果がもう計算されてしまっていますが、たまたまそのような結果になっただけで、ADD A,Bを実行したわけではありません。
LD B,0101もCLK1とCLK2の状態は同じなのでCLK2の写真は省略します。
CLK3の写真です。
DECODE回路基板の右下にあるBwr(赤LED)が点灯しています。
CLK4の写真です。
Bwr(赤LED)が消灯し右上のREGISTER回路基板のBレジスタ(青LED)が0101になって内部バスの値が書き込まれたことを示しています。
次の4ステップ(1マシンクロック)を実行しました。
ADD A,B(マシン語コード01000000)の実行です。
CLK1の写真です。
左下のRAM/CLOCK基板のアドレスA7〜A0(青色LED)が02(00000010)になり、データD7〜D0(赤色LED)は40(01000000)になりました。
右上のREGISTER回路基板の内部バス(青色LED)は消灯しました。
ADD命令のCLK1では内部バスに出力する信号は出されていないため内部バスはハイインピーダンスになってLEDが消灯したと考えられます。
あれ?
いま気が付きました。
これはまずいですね。
バスがハイインピーダンスになってはまずいです。
バスにつながっているHCMOSICの入力がハイインピーダンスになってしまいます。
ここは抵抗でプルダウンが必要です。
うむむ。
もう何回も試作基板を作ってきたのですが…。
やれやれ、また作り直しです。
そのことには注意したうえで、とりあえずテスト作業を続けます。
次のステップです。
ADD命令はCLK1とCLK2で状態が変わります。
CLK2の写真です。
DECODE回路基板の左上にあるALUwr(赤LED)が点灯しています。
ALUwrはALUからの出力を74HC173と74HC74にラッチする信号です。
このことについては[第254回]に書きました。
ALuwr_の立ち上がり(CLK2の終わり)でALUからの出力がラッチされます。
CLK3の写真です。
左上のDECODE基板上部のAwr(赤LED)が点灯しました。
ALUout(青LED)も点灯しています。
ALUout信号でALUラッチ回路から内部バスにデータが出力されます。
内部バス(青LED)に1000が出力されました。
CLK4の写真です。
Aレジスタに1000が書き込まれました。
ここでALUの出力はAレジスタ(1000)+B/d(0101)の加算値1101になりましたがまだALUoutが点灯しているためALUラッチ回路の値1000が内部バスに出力されています。
説明の途中ですが、説明が長くなりましたのでこの続きは次回にすることにいたします。
トランジスタでCPUをつくろう![第260回]
2020.11.8upload
前へ
次へ
ホームページトップへ戻る