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

●なぜRST命令が実行されてしまうのか?

今回は、解決編です。
聡明なる読者諸君は、おわかりになりましたでしょうか?

電源を切ったとき、毎回ではありませんが、かなりの頻度でRAMの中身が書き換わってしまい、調べてみると、どうやらそのときには、RST命令が実行されている、ことがわかりました。
RST命令、もっと正確に言うと、命令コードFFのRST7が実行されてしまうのです。
なぜ?

図で説明しましょう。

左の回路図は、前回にも登場した、RAMのバッテリーバックアップ回路です。
(A)は電源OFF時に、ダイオードによって、Vccからバックアップ電池に切り換わって、RAMのデータを保持する、RAMの電源ラインです。RAMのCEとR/W(MEMWR)をゲートしている、74HC126のVccにもつながっています。
(B)はトランジスタのコレクタ出力ラインで、74HC126のコントロール入力になっています。
電源がOFFになって、Vcc電圧が低下してくると、トランジスタのエミッタベース間電圧も小さくなって、その値が0.6V以下になると、エミッタコレクタ間が遮断され、(B)の電圧はHからLになります。
このHからLへの変化はある時間勾配をもって進みます。
(B)が74HC126のスレッショルド電圧以下になると、74HC126のゲートはOFFになり、入力と出力は遮断されます。
(C)はRAMのCEラインで、RAMのみを実装しているときは、常時L(アクティブ)になっています。
電源がOFFになって、Vccが低下し、トランジスタがOFFになると、その結果、74HC126も、入出力間が遮断されるため、(C)はHになります。

右の図はその間の流れをグラフで示したものです。
(A)はダイオードを通しているため、Vccより0.7〜0.8V低めの電圧になります。
Vccが電池電圧(3V)以下になると、Vccから電池へと切り換わるため、それ以後は低下しなくなります。
(B)は最初はVccと同じ電圧ですが、エミッタコレクタ間が遮断されてくるにつれて、Vccの低下よりも急な勾配で低下します。
そして(B)の電圧が74HC126のスレッショルド(水平に引いた破線)を下回ると、74HC126の入出力間が遮断されるため、(C)のライン(RAMのCE)はLからHになります。
74HCのスレッショルドは1/2Vccなので、電源電圧の低下につれて、図の破線も低下するのが正確な図なのですが、ここでは、破線が、(B)のラインがスレッショルドを割り込んだ位置を示している、と解釈してください。

RAMのCEがHになると、RAMへのアクセスは無効になります。
すると、CEがアクティブのときに、MEMRDがLのときには読み出されていた、RAMのデータが出力されなくなってしまうので、データバスはハイインピーダンスになり、プルアップ抵抗によって、D7〜D0がすべてH、つまり11111111、FFになるのです。

ところで、このときCPUの回路はどうなっているのでしょうか?
そこで、思い出していただきたいのが、前回、トランジスタのコレクタがOFFになるタイミングについて説明した、以下の記述です。

トランジスタがOFFになるときのVccが、通常の許容値よりも低いが、CPU回路はまだ十分に動作できる範囲の4V〜3V程度になる、ように決めたものです。

然り。このときには、まだCPU回路は正常に動作していたのであります。
当然のこととして、CPUは次の命令を読もうとしてRAMにアクセスを試みます。
しかし、そのときのPC(プログラムカウンタ)の値が何であったとしても、データバスの値はFFなのですから、CPUはそのFFを次に実行すべき命令コードとして、OPコードレジスタにフェッチしてしまいます。
その結果、RST7命令が実行され、MEMWR信号が出されるため、RAMの値が書き換わってしまったのです。

さて、ここで、ひとつの疑問が生じます。
聡明な読者ならば、同じ疑問を抱かれたかもしれません。

上で説明した回路図によれば、トランジスタのコレクタがOFFになることで遮断される信号は、CEだけではなくて、R/W(MEMWR)も同時に遮断されるはずではなかったか?
もし、CEとMEMWRが同時に遮断されるのであれば、CEが遮断されたことによって、データバスがFFになり、その結果、誤って実行されたRST7命令回路からMEMWR信号が出力されたとしても、そのときには、そのMEMWR信号も遮断されているはずなのだから、そうだとすれば、RAMのデータは書き換えられなかったはずではないだろうか?
否。否。否!
たとえMEMWRがゲートされておらず、まったく無防備に常時、RAMに接続されていたのだとしても、CE信号さえ遮断されていれば、それによって、RAMはアクセス禁止の状態に置かれるのだから、RAMのデータを書き換えることは不可能だったはずではないか?
上でなされた説明には、論理に矛盾があるのではないか?

しごく当然の疑問です。
しかし、そこで、もういちど、前回の、以下の記述を思い出していただきたいのです。

コレクタの電圧はゆっくりと(といってもTTLやHCに比較しての話ですが)低下していきます

コレクタの電圧信号が、通常のTTL、74HC、などの信号に比較して、ゆっくりとした速度で、74HC126のコントロール入力のスレッショルド付近を横切って低下していったとき、どのようなことが起きるでしょうか?

スレッショルド電圧を境にして、ある一定の時間、ゲートが不安定な状態に置かれることになるのは、想像に難くありません。
のちの観察によって、今回の回路の場合、10〜20μsの間、74HC126のゲートは、チャタリングのようにON/OFFを繰り返すことが確かめられています。

そうなのです。
今回のトラブルは、CEと同時にMEMWRも遮断するように、両方の信号を74HC126でゲートしていたにもかかわらず、トランジスタのコレクタ電圧の低下が、アナログ素子の特性として、ゆっくりにしかなされえなかったために、瞬間的、完全には遮断できず、一定の期間、断続的にON/OFFが繰り返され、たまたまOFFになったときに、フェッチされたRST7命令が実行され、その結果として、2〜3μs後にMEMWR信号が出力されたときに、これもたまたま74HC126のゲートがONになってしまったために、引き起こされた、不幸な出来事だったのであります。

参考までに、74HC126のコントロール入力がスレッショルド付近をゆっくりと低下していくことにより、H、Lを繰り返すCEラインの波形写真をお見せします。



●では、解決策は?

これも、実は、前回の文章の中に示してあります。
CEラインをスイッチで遮断するという、簡便な方法についての説明で、以下のような注意点について述べています。

スイッチのON/OFF時のチャタリングによって、一時的にプログラムが暴走してRAMの中身を書き換えてしまうことを防ぐために、スイッチのON/OFFはリセットスイッチを押しながら行わなければならない、

そうなのです。
RAMのCEを遮断する前に、CPUをリセット状態にしておく必要があったのでした。
実は、当社のBASIC制御ボード、ZBKボードも、メモリのバックアップをしているのですが、電源の電圧降下を監視するICによって、CPUリセットとRAMのCEのガードとを同時に行うように、設計していたことを、すっかり忘れてしまっていました。

以下の回路図のように、トランジスタのコレクタ信号OFFによってCPUをリセットする回路を追加することで今回のトラブルは無事クリアできました。


この回路図だけを見ると、RESET信号もCEやMEMWRと同時にON/OFFするように思えますが、ここにはちょいとした「からくり」があります。
図の74HC126のVccはRAMと同じ、ダイオードを経由した電源ラインから供給されていますが、CPUリセットのために追加した74HC04、74HC05のVccは、そのほかのCPU回路と同じ、電源ラインからじかに供給されています。
そこに秘密があります。

最初に使った、バックアップ回路の電圧低下のグラフを利用して説明をします。

図の緑の破線は74HC126のスレッショルド電圧です。あまり複雑になると、わかりにくくなりますから模式的に表してあります。(A)の破線が74HC126の電源電圧の推移です。
CMOS−ICのスレッショルド電圧は1/2Vccですから、緑で示した破線も、正確に表現すれば、電源電圧にしたがって低下します。
この図は、斜めに低下してくるトランジスタのコレクタ電圧信号が、スレッショルドを割り込む位置を分かり易く示すために、その位置で水平に破線を引いている、と理解してください。
そして、赤の破線は、リセット回路の74HC04、74HC05のスレッショルド位置を示しています。
74HC04、74HC05の電源電圧は、供給されている電源電圧そのままです。図のVccのラインになります。
74HC126の電源電圧(図の(A)の破線)は、それよりもダイオード一本だけ低い(約0.7V低い)ので、その1/2である緑の破線は、赤の破線よりも0.3V程度低い位置にあります。
図からわかるように、リセット回路の74HC04、74HC05の方が早くスレッショルド電圧を割り込むことになります。
CEやMEMWRがOFFになるよりもわずかに早く、CPUリセットがONになるため、そのあとでCEがOFFになったときには、すでにリセットされているので、あやまってRST7が実行されることもなく、したがってMEMWRが出力されることもありません。

下の写真は、RAMのCE信号と、Mclr信号の波形です。



上側(CH1)がCEです。OFFされる前に、不規則にH、Lを繰り返している様子がわかります。
下側(CH2)は、RESETによってLレベルに固定されたMclr信号です。Mclr入力によって、マシンクロックがクリアされます。MclrがLレベルに固定されているので、CPUは完全に停止しています。
CEがOFFになるよりも、十分に早く、リセットがかかっているため、今回のようなトラブルは確実に回避されます。
2009.3.5upload

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