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

●RAMのバッテリーバックアップ

RAMのバッテリーバックアップは、電源を切っている間、RAMのデータを保存しておくために、電池からRAMデータ保持電圧を供給します。
電源を切ったときに、通常電源から電池(「つくるCPU」では3Vのボタン電池を使います)への切換えをシームレスに行うため、RAMのVccへは電源と電池の両方からダイオードを介して接続をしています(下図)。


ダイオードを入れることで、電源ON時に+5Vから電池に電流が流れるのを防ぎ、また逆に電源OFF時には、電池からRAM以外の回路に余計な電流が流れてしまうのを防いでいます。
電源をただ切り換えるだけならば、図のようにダイオードを入れるだけで済んでしまいます。
しかしメモリのバックアップの最大の目的は、RAMのデータの維持(と保護)です。
電源OFFの間はCPU回路は死んでいるわけですから、その間にRAMのCE(chip enable)とR/W(read/write)がアクティブにならないようにしておく必要があります。

そのようにする簡単な方法は、CEとR/Wにそれぞれスイッチを入れておいて(スイッチはいずれか一方だけでもよい)、電源OFFの前にスイッチを切ってしまうという方法です。
これは確実で簡単な方法ですが、電源OFFに先だって、スイッチを切らなければならないことや、スイッチのON/OFF時のチャタリングによって、一時的にプログラムが暴走してRAMの中身を書き換えてしまうことを防ぐために、スイッチのON/OFFはリセットスイッチを押しながら行わなければならない、ことなどの面倒くささを伴います。

前回([第174回])にも回路図をお見せした、トランジスタと74HC126による、CEとR/W信号のコントロールは、その面倒なスイッチの処理を自動的にやってしまおう、というものです。
このあたりの動作の説明は、[第130回]でしています。
でもまあ、時間がたってしまいましたから、もう一度ざっと説明することにいたします。

そのときの説明で使った回路図です。


シリコントランジスタは、エミッタとベースとの間に0.6V程度の電圧差がないと、コレクタ電流を流すことができません。
上図の場合、エミッタペース間の電圧が0.6V程度以下になると、コレクタに電流が流れなくなりますから、コレクタ電圧は0Vになります。

Vccに+5Vが供給されているときは、抵抗で分圧されたベースとエミッタとの間の電圧は0.6Vよりも少し高い程度の電圧になります。しかし、するとエミッタとベース間には電流が流れて、1KΩとトランジスタのエミッタベース間抵抗の合成値が小さくなるとともに、ベース電流が4.7KΩに流れることで、ベース電位が押し上げられます。
すると、エミッタベース間電圧が小さくなって、ベース電流は小さくなり、結果として、またベース電圧は押し下げられます。
そのような動作によって、エミッタベース間の電圧は、0.6Vよりもやや大きいある電圧に落ち着きます。

このとき、エミッタコレクタ間は導通していますから、コレクタ電圧はVccに近い値になっています。
このコレクタからの出力は、RAMのCEとR/W信号をゲートしている、74HC126のコントロール端子につながっています。
なお、上図ではCEしか見えませんが、R/Wも74HC126でゲートされています(前回[第174回]の説明図参照)。
74HC126のコントロール端子がHのときは、ゲートがONになりますから、CPU回路とRAMとの間のCE信号とR/W(MEMWR)信号は、CPUからRAMにそのまま伝わります。

電源がOFFになると、Vccの電圧は次第に低下し、最終的には0Vになります。
Vccの電圧が低下すると、Vccを分圧して得られていた、トランジスタのエミッタとベース間の電圧差も次第に小さくなり、Vccが4V〜3V程度まで低下したときに、その電圧差が0.6V以下になって、エミッタコレクタ間が遮断され、コレクタ電圧が0Vになります。
すると、RAMのCEとR/Wをゲートしていた74HC126がOFFになって、CPUとRAMとの間のアクセスが遮断され、RAMデータの書き換えが禁止されます。

Vccがどの程度まで低下したときに、トランジスタがOFFすればよいか、というタイミングは重要で、余り早くOFFしてしまうと、Vccがわずかに変動しただけで、RAMへのアクセスが禁止されてしまうため、結果としてCPUが暴走してしまうことになります。
また、逆に余り遅くなってしまうと、CPUの回路がまともに動作しなくなって、暴走するかもしれず、その結果、RAMのデータが書き換えられてしまうかもしれません。

そのタイミングはエミッタとベースに入れた2本の抵抗の比で決まります。
図の値はカットアンドトライによって、トランジスタがOFFになるときのVccが、通常の許容値よりも低いが、CPU回路はまだ十分に動作できる範囲の4V〜3V程度になる、ように決めたものです。
なお、トランジスタはアナログ素子ですから、その電圧値のある一点で突然にONからOFFになるのではなくて、徐々にONからOFFに変わります。したがって、コレクタの電圧はゆっくりと(といってもTTLやHCに比較しての話ですが)低下していきます

そのような原理の回路ならば、RAMのバックアップは完璧、と思ったのですが…。
思わぬ、というか、またしても、つい、うっかりしていて、見事に落とし穴にはまってしまったのですねぇ。

●そこで、前回の「犯人捜し」の続きです

完璧のはず、だったのに、思わぬトラブルで、MEMWRがポロリ、というのを発見してしまった、というのが前回のお話でした。
なぜ微妙なタイミングでポロリが出てしまうのかは、「謎」だったのですけれど、どう回路を工夫してもそれがなくならないらしいことがわかったので、今度は74HC126の入力を調べてみると、なんとこれまた微妙なタイミングを境にして、突然CPUからMEMWRが連続して出力されていることがわかりました。
さては電圧が低下したため、CPUのどこかの回路が暴走して、MEMWRが出力されているに違いない。
なにはさておき、とにかく、まずは、その発信元を突きとめよう、というところまでが、前回のお話でした。

回路図を調べてみたところ、MEMWRを出力する、命令回路は以下の通りであることがわかりました。

MOV、MVI、PUSH、CALL、STA、STAX、XTHL、SHLD、RST

この中に、真犯人が、いるはず…(ほんとに、いるかなぁ…)。

ひとつずつ、順番にオシロでストレージしながら調べていきました。
みつかりません。全然。
みんな、シロです。

やっぱりね。
完璧なはずなんだから、そんな、誤動作なんて、するはず、ないんだよね。

とうとう、最後のRSTの回路になってしまいました。
うーん。だめだろうなぁ。
でも、そうだとすると、いったい、発信元はどこなんだろう…。
やれやれ、しんどいこっちゃ、と思いながら、オシロを見てみましたら…。

や、や、や、や、や!

いた!いましたよ!犯人が!

●ついに!犯人を、発見!



上側(CH1)はRST、下側(CH2)はMEMWRです。
RSTが突然Hになって、そのときから、MEMWRが出力されています。

RST命令については、まだ説明はしていませんが、回路図だけは、じつは[第137回]でチラリとお見せしています。
でも、もう一度、お見せします。

●RST命令の回路図です

赤で囲ったところが問題の回路です。
ある時点から、RST信号がアクティブになってしまうため、74HC03のpin5とpin10がHになって、結果として、MEMWR信号が連続して出力されていたのです。
でも、なぜ?

●RST命令とは?(とりあえず、簡単に)

RSTは1バイトのCALL命令です。
RST0〜RST7の8種あります。

RST命令のマシン語コードをビット表現で示すと、
11vvv111
になります。
vvvは3ビットのvector(ベクトル)で、メモリの固定アドレスを示します。

vvvの値と、それによって示されるメモリアドレスです。vvvはビット表現で、メモリアドレスは16進数で示します。

vvv    メモリアドレス  命令コード  ニーモニック
000     0000      C7      RST0
001     0008      CF      RST1
010     0010      D7      RST2
011     0018      DF      RST3
100     0020      E7      RST4
101     0028      EF      RST5
110     0030      F7      RST6
111     0038      FF      RST7

RST命令は、1バイト命令で、vvvで示すアドレスのプログラムをCALLする命令です。
このうちでもRST7は、マシン語コードがFFで、データバスがプルアップされていて、メモリから何も出力されていないときは、バスがFFになることを利用して、最も簡便なINT割り込みとして利用されるほか、RAM上での命令のブレーク動作としても利用されます。

今回は、なぜか、電源OFFのある時点から、このRST命令がデコードされてしまうため、そのときからMEMWRが出力されてしまうらしいことがわかりました。
デコードされた結果でなければ、RSTがアクティブになることは考えられないのですけれど、ではなぜ、電源OFFされたときに、こんな変なタイミングでRST命令がデコードされてしまうのでしょうか?
デコードされるからには、そのコードがOPコードとして、OPコードレジスタにフェッチされなくてはならないはずなのですが…。

●そうか、わかったぞ!

そうか!そうだったのか!わかったぞ!
そういうわけだったんだ!

名探偵コナンは突然叫びます。

大抵の名探偵は、実に超人的な推理力と観察力の持ち主です(ただ一人の例外は、もちろん、名探偵毛利小五郎のおっちゃん)。
ンなぁ、小学生のガキがそんな推理、できるわけはないじゃないのぉ。
そこは、それ、マンガですから。
オトナは、そんなんじゃあ、とても納得しません。

それはそうなのですけれど、でも、昔の推理小説ファンは今よりも寛大でした。
ホームズ名探偵が、読者の知らない謎解きの鍵を突然とりだして、快刀乱麻を断つごとく、あっという間に事件を解決してみせても、素直に拍手喝采を送ったのですから。

しかし、推理小説ファンの目が肥えてくると、次第にブーイングの声が高まります。
それって、ズルイよぉ。ネタを隠しといて最後に出してくるなんて、アンフェアじゃないのさぁ。

いっそのことそれなら、ということで、最初から犯罪の進行を読者に全部公開してしまって、それから、探偵がいかにして、犯人にたどりつくかを記述する、という手法のものがあらわれました。
どうだ?これなら、文句ねぇだろう?
こういうのを、倒叙モノというのだそうです。
「刑事コロンボ」とか「古畑任三郎」がそれですね。

一方、本格的な謎解きを仕掛けて、読者に挑戦する、という作品も出てきました。
かのエラリークイーンの「国名シリーズ」がその代表格です。
事件が次々と発生して、謎が謎を呼び、ついに、クライマックス、そしていよいよ探偵の謎解きがはじまる、というところまでくると、
「読者への挑戦」というページがあらわれます。

作者は、ここまでのページにおいて、犯人を示す手がかりを隠すことなく、その全てを読者に公開しているのである。
聡明なる読者ならば、犯人が誰なのか、すでにお気づきであろう。

うむむ…。
確かに。最後まで、読んだら、ああ、そうか、あれが伏線だったのか、ってわかりますけれど。
結末までいかないことには、なかなかそうはわかるもんじゃぁありませんよ、ねぇ。

うわぁ。めちゃめちゃ、脱線してしまいました。
こちらの記事の方は、本格的推理小説でもなんでもありません。
でも、ちょいと、エラリークイーンの真似をして、聡明な読者ならば…、ってやつをやってみましょうか。

なぜ、電源OFFの過程でRST命令が実行されてしまうのか。
その手がかりは、隠すところなく、今回の文章中に全てが示されているのである。
果たして、その原因、その理由は何だったのか?聡明なる読者諸君ならば、すでにお気づきであろう。
2009.3.3upload

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