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

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


[第404回]



●またしても、4MHzでALUが誤動作?

前回は新しく作ったSW/CLOCK/MEM基板でまさかのエラーが発生して大いに慌てたのですが幸い原因がわかって270pFのセラミックコンデンサを追加することで事なきを得ました。
これでもう大丈夫。
何回も動作テストをしてきましたからいくらなんでももう何もないだろう。
そう思って、でも念のためにまた以前MYCPU4で行なったBASICプログラムを使って最初から動作テストをやっていましたら。
最後の最後MC4T11B.TXT([第279回][第282回]参照)でまさかのまさかの信じられないエラーが発生してしまいました。
まさかうそだろう、と思って繰り返しテストしてみても結果は同じです。
プログラムを実行すると本来ならばAレジスタに”8”、Bレジスタに”7”を表示して停止するはずなのですが、Bレジスタが”A”かときには”B”になってしまいます。
例によってCPUクロックが4MHzのときに発生します。
2MHzや1MHzでは正常に終ります。
なんてことだ。

もう悪魔に魅入られたとしか思われません。
おお神よ悪魔よ。
この私がいったい何をしたというのだ。
これは超常現象に違いない。
さてはぼちぼちお迎えか。

こういう場合は金麦を飲んで寝てしまうにかぎります。
そのようにしたのでありますが。

翌朝あらためてテストしてみたところ。
やっぱり結果は同じでありました。
でも、一晩寝ると多少は冷静さが戻ってきます。

BレジスタはAレジスタがカウントアップして繰り上がりが発生したときにのみカウントアップします。
Aレジスタの結果の値が”8”で終っているということは少なくともAレジスタについては問題は発生していないと考えられます。
問題はBレジスタで起きているようです。
Bレジスタが本来は”7”で終らなければならないのに”A”や”B”になってしまうのは、信じられないことですが、途中のどこかで余計なカウントアップが起きているのでは?

さて。
どうしたらそれを確認することができるでしょうか?
問題はCPUクロックが4MHzのときにのみ発生している点です。
それより低いクロックでは発生していません。
ということは、スローモードやステップ動作で確認することはできないということを意味します。
となると、頼るべきはやっぱりロジアナです。
MC4T11B.TXTを実行して得られるテストプログラムをCPUクロック4MHzで実行して、それをいつものカメレオンロジアナで観測しました。
見るべきはメモリアドレスのA0〜A7とAレジスタの出力とBレジスタです。
そのようにして得られた波形データを最初から確認していきました。
すると意外にも先頭に近いところで異常な数値を発見しました。
Aレジスタが+1されてオーバーフローするたびにBレジスタが+1されます。
ところがロジアナの記録を追っていったところ、Bレジスタが1から2にカウントアップするはずのところで、なんと6になってしまっていたのです。
そんなばかな。
下は異常が発生している様子を記録したロジアナの画像です。

上に書きましたようにまずはどこで何が起きているのかを確認するためにメモリアドレス、Aレジスタ、Bレジスタの出力を観測したのですが、その結果異常が発生しているところが特定できましたので、その次にはなぜそのような異常が発生するのかというその原因を探るためにさらに進んでテストを行ないました。
上の画像はそのときの画像です。
PROBE00はMCLKです。
PROBE01〜PROBE04はBレジスタのビット0〜ビット3の出力です。
18μsを過ぎたところで本来ならば0001から0010になるはずなのにいきなり0110になってしまっています。
最初はBレジスタのビット1とビット2のショートを疑いました。
でもそれはおかしいことにすぐに気が付きました。
それなら2MHzでも1MHzでも同じことがおきるはずだからです。
当初は原因がまったくわからずライン間のショートを疑ったりトランジスタの不良を疑ってトランジスタを交換してみたりしたのですが、どうにも原因がつかめません。
あれこれ悩んでまるっと2日間を空費してしまいました。

もう駄目。
やっぱり4MHzは無理なんだ。
仕方がない。
最後のテストMC4T11Bについては4MHzでは異常が発生するけれど原因は不明です、ということで。

一旦は諦めかけたのですけれど。
どうにも面白くないのですよねぇ。
異常が発生するのはこのプログラムだけなのですから。
どこかに原因があるはず。
やっぱりそれを明らかにしたい。
それがはっきりするまでは金麦はおあずけということで。

それでやっとたどりついたのが上のロジアナ画像でした。
PROBE05はALU回路のビット2の[8]の出力でPROBE06は[9]の出力です。
PROBE07はALUWRLです。
この信号がLからHになるときにALU回路からの出力がラッチされます。
ALU回路の回路図は[第395回]にあります。
PROBE08はALU回路のビット1の[8]の出力でPROBE09は[9]の出力です。
PROBE10はALU回路のビット0の[8]の出力でPROBE11は[9]の出力です。
18μsを過ぎたところのMCLKの1サイクルでBレジスタの値が0001から0110になっているのですが、ここはLD B,Aが実行されたところだと考えられます。
ひょっとするとその直前のAレジスタの値がおかしいのでは?
その直前では
LD A,B
ADD A,1
が実行されているはずです。
ちょうど18μsにかかっているMCLKの1サイクルはADD A,1が実行されているところだと考えられます。
そしてその1つ前の17μsを過ぎたところの1サイクルはLD A,Bのはずです。

PROBE11はALU回路のビット0の出力です。
PROBE09はビット1の出力です。
PROBE06はビット2の出力です。
その3つの出力を見ると、 PROBE11は1→0に変化しています。
PROBE09は0→1に変化しています。
そして問題のビット2、PROBE06はなんとずっと1のままです!
おかしい!
ALU回路のビット2の出力がおかしい!

上の画像をよく見るとALU回路のビット2の出力がただおかしいだけではなくて、そこはもっと納得がいかない異常な波形だったのでした。

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

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