標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第174回]

●RAMのバックアップがどうもおかしい…

前回、堂々の完成!とご報告申し上げたのでしたが、またなんだかおかしいところをみつけてしまいました。
RAMのバックアップがなんだかおかしいのですね。
電源のOFF/ONをすると、ときどきRAMの中身が壊れてしまいます。

じつはこのことには、少し前から気がついていました。
電源を切って、回路を直して、それから電源を入れて、またテストをする、ということを繰り返していると、さきほどRAMに入れておいたプログラムが壊れてしまっている、ということがときどきあります。
多分、ハンダ付けや部品の取り付けなどをしているときに、何かの影響でRAMが書き換わるのだろう、ぐらいに思っていたのですが…。

やっぱり、どうも、おかしい。
せっかくここまで出来上ってきたのですから、ここはひとつ、徹底的に調べてみることにしましょう。
ということで、いったい何が原因なのかを、徹底的に追求してみることにしました。

最初は、当然のことながら、RAMのバックアップ回路を疑いました。
うまく働いていないのではないか…?

RAMのバックアップ回路は、「第138回」で、RAM/ROM回路図として紹介しました。
今回はメモリバックアップ回路の部分だけを切り取って、再掲いたします。

ボタン電池の電圧なども含め、一通り調べてみたのですが、バックアップは正常に行われていて、特に怪しいところは見当たりません。
うまくバックアップできているようです。

電源を繰り返しON/OFFしながら、あれこれ調べているうちに、あることに気がつきました。
ディップスイッチをメモリ書き込みモードにセットしておくと、電源をON/OFFしても、RAMの値が破壊されない、らしいようです。
リセットスイッチを押したまま、電源のON/OFFをした場合にも、RAMの値は破壊されないようです。

ということは、どうもCPU回路が通常動作をする状態で、電源をON/OFFすると、だめなようです。
さらに追求していくと、電源ONではなくて、電源OFFのときに、RAMの値が破壊されてしまうらしい、こともわかってきました。
プログラムを実行中にいきなり電源を切ると、RAMの値が破壊されてしまう、ということのようです。

しかも、レジスタの更新のみを行い、全くメモリに書き込みを行わないプログラムを実行させているときでも、その実行中に、電源を切ると、RAMの値が書き換わってしまう、ということもわかってきました。

うーん。わからん。
わからないときには、信号を徹底的に観察してみることです。
で、オシロであれこれ観察してみましたところ…。

●あれま。WRITEパルスが出ています



上側(CH1)は、さきほどのRAMバックアップ回路図の、74HC126のpin4(トランジスタ2SA1015のコレクタ出力)で、下側(CH2)は74HC126のpin6(RAMのR/Wへの出力)です。
トランジスタ2SA1015のコレクタ出力が、ほとんどOFFになって、1.5V近くまで低下した、こんなおかしなタイミングでWRITE信号が確かに出ています。

犯人はこいつに間違いありません。
しかし、こいつは犯人だけれど、こいつは親玉ではない。下っ端だ。
なぜなら、こんなところで、こんな信号が単独で出るわけがない。
きっと黒幕がいるはず。

とすると、74HC126の入力があやしい。

●こいつが黒幕か?



上側(CH1)は、74HC126のpin5(CPU回路からのMEMWR出力)で、下側(CH2)は上の写真と同じ、74HC126のpin6(RAMのR/Wへの出力)です。
WRITE信号がしっかり出てるじゃありませんか!
しかし、それにしても、どうして、こんなおかしなタイミングで、突然、まるで狂ったようにWRITE信号が出力されるのでしょう?

●その、狂ったようなWRITE信号はとりあえず無視するとして…

多分、電源がOFFされて、Vccが低下していく過程で、あちこちの回路が暴走を始めた結果、こうなったのではないか、と考えました。
そこで、その「暴走」WRITE信号はとりあえず無視しておいて、RAM側にポロリと出力される信号をなんとか押さえる方に注目しました。
なんだか微妙なタイミングだけれど、もう少し、もうほんの少し、74HC126が速くOFFできれば、このポロリは無くなるはず。
2SA1015の回路をあらためて見てみると、コレクタ側のRが、10KΩになっていて、こいつが大きいために、トランジスタがOFFになっても、ここの電圧が0Vになるまでに時間がかかってしまうのでは…。
そこで、Rを小さくしてみました。
思いきって、うんと小さく、560Ωにまで落としてみたのですけれど…。
あんまり変わりはありませんねえ…。
(キミには実際失望するほかはないねえ、ワトソンくん。いいかげんに、その間違いに気がついてくれたまえよ。)

あとで気がついたのですけれど、この抵抗のせいではなかったのですねぇ。
もともとトランジスタはアナログ素子ですから、瞬間的にOFFになるのではなくて、一定の時間勾配をもって、徐々にOFFになるのは、回路の特性として仕方がなかったのです。

なんとかして、シャープにOFFできないものかと、あれこれ考えてみたのですが、いい解決法はありません。
いっそ2SA1015を使うのをあきらめて、電源監視用のICでも使おうか、とも考えたのですけれど、せっかく、トランジスタ1本と抵抗だけでうまく出来た、はずの回路だったのですから、なんとかこれはこのまま生かしたい。
とすると…。

●あの「暴走」WRITE信号を追及するしかないか…

(キミも少しは科学的思考が身についてきたようだね、ワトソンくん。その方向が正しいことに、ボクは最初から気がついていたのだよ)

そこで、まずは、このWRITE信号がCPU回路のどこから発信されているのかを、つきとめてみることにしました。
回路図を広げて、オシロをつなぎながら、電源をOFFすることを繰り返して、どうやら、このWRITE信号が命令回路のどこかから出ているらしいことまではつきとめました。

どの命令が犯人か?
こうなったら、しらみつぶしです。
回路図をざっと調べてみました。
命令回路のうちでWRITE信号(memWR)を出力しているのは以下の命令です。
MOV、MVI、PUSH、CALL、STA、STAX、XTHL、SHLD、RST
この中に犯人がいるはずです。

どうやってみつけるか?
たとえば、XTHLの回路です。

memWRは2箇所で出力されています。
Tクロックはどうやらずっと出力されているらしいことがわかりましたから(これについてはまたのちほど説明しますが)、74HC03の入力のうち、Tクロックではないほうの信号をチェックすればよいということになります。
図の場合には、XTHL信号です。
これはOPコードがデコード回路によって、デコードされた結果、XTHL命令だった場合にアクティブになる信号です。
ここに、オシロのプローブをつないで、オシロのもう一方のチャンネルには例のWRITE信号を入力して、その信号でトリガするようにしておいて、電源OFFして、ストレージされた波形を調べます。

うーん。どこかの命令のデコード信号の回路に断線があるとか…。だけど、全部の命令の回路は動作テストしたですものねぇ…。
はたして、みつかりますかねぇ。
2009.3.2upload

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