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

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


[第386回]



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

前回書き落としてしまったことがあります。
下は前回お見せしたA0出力波形を説明する図です。
ここで説明しておかなければならない肝心なことがありました。

前回は仮にMCLK=2のときにPCに対してJMP先アドレスが書き込まれたと仮定して説明をしました。
ここで注目したいのはMCLK=2で新しい値が書き込まれたあとのA0出力の変化です。
Case1からCase4のいずれもMCLK=3のときに新しく書き込まれたA0出力の値をラッチして、その次のMCLK=4でその値を反転出力しています。
ここが肝心なところでした。
つまりA0出力ではPCへのデータ書き込みによって出力値が変更されてもその後の流れはシームレスに続いていきます。
ところがそのところがA0以外の出力では異なっているのです。
下の図はPCのA0出力〜A3出力が通常はどのタイミングで変化するかということを示した図です。

既に説明しましたようにA0はMCLKの立ち上がりのときにラッチした出力値を立ち下りのときに反転出力します。
しかしA1〜A3ではMCLKではなくて、ひとつ下位の出力の立ち上がりのときにラッチした出力値を立ち下りのときに反転出力します。
この違いのためにA0とA1〜A3では異なった処理が必要になってきます。
そこがなかなかの難問でした。

それがどういうことなのかを明らかにするために、A1〜A3ではPCに新しい値が書き込まれるとその後に出力値がどうなるかを考えてみます。
A1〜A3についてはいずれも同じ動作をしますから、A1について考えてみることにします。
下は前回もお見せしたA0出力の図にA1出力を加えたものです。
わかり易くするためにデータ書き込み前にはA1は0を出力していたところに1が書き込まれたものとします。

Case2とCase3はMCLK=4のときにA0が立ち上がりますからそのときに新しいA1の値がラッチされて、その次にA0が立ち下がるときにその値が反転出力されます。
これはA0と同じ動作で出力はシームレスに変化します。
ですからこの2つのケースについては特に問題はありません。
問題はCase1とCase4です。
Case1はちょっと微妙です。
Case4は明らかに誤出力となります。
MCLK=4のときにラッチされていた値が反転出力されるのですが、このときラッチされていた値は何か?ということが問題です。
MCLK=2のときにA1に1が書き込まれますが、その1はラッチされません。
書き込み前にA0が立ち上がったときにラッチされていた値がそのまま反転出力されてしまいます。
Case1はMCLK=2のタイミングでA0が立ち上がりますが同時にA1に1が書き込まれます。
このタイミングで正しくその1がラッチされるかどうかは微妙なところです。

この問題を解決するために下の図のような対策を考えました。

PCへのデータ書込時にはPCWR_信号がアクティブになります。
実際にはメモリからJMP命令コード(およびJNC、JNZコード)が出力されている間PCWR_がアクティブになります。
PCにJMP先アドレスが書き込まれるとメモリアドレスが変化しそれによってメモリから出力される値も変化します。
しかしメモリからの出力には遅れ時間があるのでPCに新しいアドレス値が書き込まれてもすぐにPCWR_は非アクティブにならずにそれからしばらくの間はアクティブになっています。
そのことを利用してPCWR_がアクティブでかつひとつ下位の信号(上の例ではA0)の値が1ならばそのときの値(上の例ではA1の値)をラッチするようにします。
それは上の図でWR_で示したタイミングになります。
図では破線で示した一瞬のように見えますがそのラッチ動作は上記の条件が成立している限り継続して行なわれ、PCWR_が非アクティブになったときにラッチ動作が完結します。

下は前回もお見せしたPC制御回路です。

図の下側半分がA1出力〜A3出力に対する制御回路です。
[8]と[9]の2つのNAND回路が上で説明した対策回路です。

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

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