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

トランジスタでCPUをつくろう!
トランジスタで8080をつくってしまおうというまさにびっくり仰天、狂気のプロジェクトです!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
見事にできましたら、もちろんTK−80モニタを乗せて、それからBASIC、CP/Mを走らせましょう!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆


[第385回]



●PC(プログラムカウンタ)のデータWRITEのタイミング(1)

PC(プログラムカウンタ)は普通の動作ではマシンクロックが立ち下るごとにカウントアップをします。
その動作については[第370回]で説明をしました。
一番下位のPC0(アドレスA0出力)はマシンクロックが立ち下るごとに出力が反転します。
その上位のPC1(A1)はA0出力が立ち下るごとに出力が反転します。
その上位のPC2(A2)はA1出力が立ち下るごとに出力が反転します。
その上位のPC3(A3)はA2出力が立ち下るごとに出力が反転します。
PCの普通の動作はそういうことなのですが、PCはそのほかにデータWRITEの動作が加わります。
JMP命令の実行によってPCから出力するアドレスを変更する機能です。
これがなかなかに難しくて今までさんざ苦労してきました。

下の図は[第370回]でお見せしたPCの出力波形の図からA0出力だけを取り出したものです。

PCのA0出力回路はMCLK(マシンクロック)の立ち上がりのときにA0出力の値をラッチし、MCLKが立ち下がるときにそれを反転出力します。
図で1、3のときに出力の値をラッチして2、4のときにその値を反転して出力します。
この動作によってPCのA0出力はMCLKが立ち下がるごとに0、1、0、1のように出力することになります。
上の図ではA0の出力波形の変化を説明するためにMCLKに1〜4の数字をつけましたがひょっとすると誤解されてしまうかもしれませんので念のため注記します。

MYCPU4TRは1マシンクロック(MCLK)で1命令を実行します(MYCPU4も同じ)。
1マシンクロックは2CPUクロックから成ります。
つまりMYCPU4TRは2CPUクロックで1命令を実行することになります。
そのことと上の図の1〜4の数字は関係ありません。
上の図ではMCLKの1〜4の間にA0は0、1と2つの出力値をとります。
実際には1の前に0がありますので正確には0〜4(0)の間です。
この間のCPUクロックは4クロックであり、その間に2命令が実行されます。

そのように規則的に出力をくりかえすPCのA0出力ですが、JMP命令が実行されるとその出力がどうなるかということについて考えてみます。
ここで考えるのは最下位のA0出力だけです。
A1から上位の出力についてはさらに別の考察が必要です。
そこがさらに考えを複雑にする要因です。
それはともかく、まずはA0についての話です。
PCへデータを書き込むタイミングは上の図でMCLKの立下りのとき(2、4のとき)です。
このタイミングは命令の終わりのタイミングです。
そしてPCのA0出力が変化するタイミングです(つまりメモリアドレスが変わります)。
そのようにPCへのデータの書き込みはMCLKの立下りのタイミングで行なわれますが、そのことによってA0の出力は通常とは異なった出力波形になることが考えられます。
A0出力の状態は次の4通りが考えられます。
上の図のMCLK番号の1と2を使って説明します。
Case1:MCLK=1のときにA0=0である場合に、MCLK=2でA0=1を書き込む
Case2:MCLK=1のときにA0=0である場合に、MCLK=2でA0=0を書き込む
Case3:MCLK=1のときにA0=1である場合に、MCLK=2でA0=0を書き込む
Case4:MCLK=1のときにA0=1である場合に、MCLK=2でA0=1を書き込む
これを図で示すと下図のようになります。

図を見るとわかりますようにCase1とCase3はA0出力については見かけ上はPCに対してデータの書き込みがなかったのと同じように見えます。
しかしCase2とCase4ではA0出力は通常の出力の流れとは異なる波形に見えます。
問題はそのCase2とCase4です。
通常のPCの動作ではMCLK=1のときにそのときのA0の状態をラッチしていてMCLK=2のときにそのラッチした値を反転出力するようにPC本体の回路は作られています。
そのままではCase2とCase4では反転出力する値と書き込まれた値がぶつかってしまうことになります。
それを避けるためにJMP命令ではMCLK=2のときにPCにデータを書き込む回路をアクティブすると同時にMCLK=1でラッチしていた値を反転出力する回路を非アクティブにします。
そのための回路が前回お見せしたPC制御回路です。

図の上側半分がA0出力に対する制御回路です。
PCWR_はJMP命令のときにアクティブになります。
そのときPC本体回路のデータ書込回路(前回のPC本体の回路図の[2])へのPCWRH信号とPCWRL信号がアクティブになります。
同時にPCWR_によって反転出力回路(前回のPC本体の回路図の[4])へのCKdnH信号とCKdnL信号が非アクティブになります。
Case1とCase3では両方の回路の出力は一致していますが出力ショート状態であることに変わりはないのでCaseに関係なく上記の回路が働くようになっています。

次回に続きます。

トランジスタでCPUをつくろう![第385回]
2021.8.17upload

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