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

●RXが誤動作するときにはクセがありそう

[第371回]で、RXが誤動作するかどうか確認するために、次のプログラムを実行していただくように、と書きました。

8000 3EFF   MVI A,FF
8002 B7     ORA A
8003 C8     RZ
8004 C30380 JMP $8003

そして、もし誤動作することが確認できたなら、今度は下のように少し書き換えて実行してみてください、と書きました。

8000 3EFF   MVI A,FF
8002 B7     ORA A
8003 C8     RZ
8004 00     NOP
8005 C30380 JMP $8003

今度は誤動作しなくなったはず、と書きましたが、では、それはなぜなのでしょうか?

それを説明するためには、RZ命令が条件不成立のときに、T4のタイミングでregWR信号の出力にヒゲが発生して、その結果PCLregWR(プログラムカウンタの下位8ビットへの書き込みパルス)が発生し、プログラムカウンタが書き換えられてしまうと、どういうことがおきるのか、を考えてみる必要があります。

タイミングチャートで説明してみましょう。
こんな感じだと思います。

T4のときにMclrが出され、タイミングがT0になるために、アドレスバスにはプログラムカウンタの値(RXの次のアドレス)が出力されます。
そしてデータバスには、RXの次の命令が出力されます。
ところが、そのT0のときに「ヒゲ」によってPCLregWRが誤って出力されてしまうため、プログラムカウンタの下位8ビットが書き換えられてしまいます。
なにがPCLに書かれるかといいますと、そのときに内部データバス(=外部データバス)に出力されている値、つまりRXの次の命令コードがPCLに書かれてしまうのです(注)。

(注)実はT0がスタートしたときにはT4の「残骸」がまだ残っていますから、アドレスバス上ではプログラムカウンタの出力とスタックポインタの出力がぶつかっているはずです(煩雑になるので、上のチャートでは省略してあります)。
ですから、その間はデータバスはかなり乱れているのではないかと思います。
しかしT4はマシンクロックカウンタからの出力ですから、MclrがLになるとすぐにクリアされてしまいます。
「すぐに」と書きましたが、実際にはクロックカウンタ74HC161のCLEAR→出力の遅延時間(typ.20ns)+74HC238の遅延時間(typ.50ns)を考えると、まあ、おおよそ100nsていどでT4が消えると思います。
つまりアドレスバスがプログラムカウンタに占有されるのは、そのあたりからということになります。
それがメモリの出力に反映されるのは、意外に速いはずで(RAMはCSからの出力遅延よりもアドレスラインの変化からの出力遅延の方が短い)、多分50nsもあればデータバスは安定すると思います。
T0がスタートしてから150〜200nsのあたりです。
そのすぐ後(T0スタートから250ns)に、PCLregWRがヒゲによって一瞬(オシロの観測では40〜50nsですが個体差がかなりあると思います)Lになってしまうため、その立ち上がり時に、このときのメモリからの出力がプログラムカウンタ(下位8ビット)に書き込まれてしまうのです。(09.10.29追記)

その書き換えられたアドレスバスの値はすぐにメモリ出力に影響を与えるため、データバスの値は、書き換えられたメモリアドレスから出力されるデータに変わってしまいます。
データバスの値がOPcodeレジスタにフェッチされるのはT1の終わりですから、次に実行される命令は、そのときにOPcodeレジスタにラッチされた命令、つまり書き換えられたアドレスにある命令、ということになります。

最初のチェックプログラムの場合、RZの次の命令はJMP命令(コードC3)でしたから、RZの次にはアドレス80C3の命令が実行されることになります。
80C3には何が書かれているかわかりませんから、多分暴走することになります。

RZの次にNOP(コード00)を置くと、RZの次に実行されるのは、8000にある命令になります。
この場合、RZの次にノークロックで(つまり実行時間0、瞬間的に)JMP $8000が実行されたのと同じことになりますから、本当はやっぱり暴走してはいるのですが、見かけ上は、8000〜8003が繰り返し実行されているように見えます。

以上は理屈で考えた推測です。
しかし多分そのように動いているだろうな、ということはプログラムカウンタの表示LEDを見れば確認することはできます。
でも、実際にアドレスバスやデータバスを観測して、そのように動いていることを確認してみたいものです。
そのためには、ロジアナが必要ですねぇ。
オシロでは…。残念ながら、無理、です(注)。

(注)本当は無理ではありません。2現象オシロでしたら、CH1にregWRを入れてそれでトリガをかけておいて、CH2でデータバスやアドレスバスのラインを1本ずつ観測しながら、それをメモしていけば観測は可能です。
メッチャ面倒ですけれど。(09.10.29追記)

これほど長い年月、この業界に居ながら、じつは私はロジアナを持っていなかったのです。
ロジアナはとにかく高い!
いや、今はどうだか知りません。以前はとにかく高かった。
たしか百万円ほどもした、はず。

ンナものは、必要ない!
で、ソニーテクトロの2現象100MHzストレージオシロだけでやってきました、のです。
いや、やせ我慢ではなく、実際に、私の仕事の上では、ロジアナは持っていたとしても多分ほとんど出番は無かったはずだと思います。
大抵回路のチェックはICの破損、回路の断線、ショートを発見することですから、ロジアナではちょっとムリがあります。
慣れてくるとアナログオシロは実に効果的です。
もちろんラインを1本ずつあたっていかなければいけませんが、ショートや断線は、波形を見るだけでほとんど即断できます。

プログラムのミスやハードの不具合は、これもロジアナよりも、ソフトウェア的手段での解析のほうが早く原因にたどり着けると思います。
というわけで、ロジアナは持っていなかったのですけれど…。

次回は、そのロジアナの話題です。

持っていなかったはずのロジアナが…なんと!
おお、こんなところに、ころがっていたじゃないの!
2009.10.28upload
2009.10.29追記

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