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

●どこが設計ミスなのか?

前回の終わりのところで、「おばかな設計ミス」と書きました。
ヒゲの出る回路は他にもありました。
そうです。マシンクロックの出力回路です([第144回])。
でもこのときには、「おばかな設計ミス」だとは書きませんでした。
いけしゃあしゃあと「コンデンサでつぶせばよい」と平気で書いていたのですよね。
平気どころじゃありません。
[第364回]ともなると、もう完全に居直りです。
「遅れたっていい」「ヒゲなどツブしてしまえばいい」もうしっかりと居直っています。

それが今回は一転して「おばかな設計ミス」です。
首尾一貫していませんねぇ。
ま、そこが機械と人間とが違うところです。人などはもともと矛盾した存在なのです。
と、まあ、それは冗談です。

[第360回]で、25年前に私が「トランジスタ技術」(CQ出版社)に連載したときの記事を引用して、「25年前も今も設計に対する私の考え方は変わっていません」、などとよせばいいのに大見得を切って、
「なんたってデジタル回路なんだから、余裕はたっぷり十分すぎるくらいあるのだから、誤動作などするわけがない。
誤動作なんかしたら、そりゃあ、あなた。よっぽど設計にアナがあるのですよ。」
なんてホラもホラ、大法螺を吹いて、ご丁寧に、「あんまり大見得を切ると引っ込みがつかなくなって恥をかくのが落ち」って自分でもわかってるじゃないの。
その通り。しっかりと恥をかいてしまいました。

でもそういうことなのです。
自分でわかっていて、そういう回路を選択して、そのために「やむを得ず」出てしまうヒゲをコンデンサでつぶすのは、恥だとは思いません。他に回避策があっても、あえてこれを選ぶ、という根拠があれば、よいのではありませんか。
それは設計ミスではありません。

しかし、今回はダメです。これは、はっきり言って、おばか。
どこが、おばかか?

こういうことです。
だいたいregWRが遅れることははじめからわかっていました。


広大な基板全体に広がったregWRの配線のあちこちから送られるオープンコレクタ出力信号をプルアップ抵抗で受けているのですから、立下りはまあ良いけれど、立ち上がりについては悲惨な波形になることはわかっていました。
そのことについては、[第72回]で、regWRではありませんが「d3〜d0の立ち上がりが遅い」と書いています。書いているだけではなくて、オシロスコープで観測した波形写真までつけています。
そしてそのつぎの[第73回]では「この遅れは200nsくらいはありそう」なので「CPUクロックは2MHzに落とすしかない」と書いています。

そこまでわかっているのですから、当然のことながら、regWRの遅れも頭にしっかり入っていたはずなのですが…。
まったく、うかつでした。

RXのタイミングチャートをregWRを中心にしてアレンジしたのが下図です。

regWR信号は出力データ(D0−D7、iB0−iB7)のほぼ真中にあって、しかも立ち上がりの遅れを意識して、前よりも後ろを大きくあけています。
CLKは2MHzですから前が250ns、後ろには500nsの余裕があることになります。
これはRXのタイミングチャートなのですが、他のどの命令でもregWRのタイミングはこのようになっています。
どう転んだって絶対に誤動作などしないはずの回路だったのですが…。

普通の回路はそれで良かったのです。
RXも、普通に実行されている(つまり条件が成立して、普通のRETと同じようにリターンする)限りにおいては、全く問題はなかったのです。

ところがRXは、条件が成立しない場合には、途中で実行を中止してしまいます。
具体的にはT4のはじめのところでMclrパルスを出力して、マシンクロックカウンタをクリアしてしまいます。
ここに落とし穴がありました。
前回にもお見せした、ロジアナの波形をもとにした図です。

一番下、T4のときにMclrが出力されますが、「それはすでにT4が出されたあとなので」、そしてさらにそれに遅延が加わりますから、T4はある程度の期間は出力されてしまうことになります(100nsぐらい)。
するとその期間はregWR(IC42のpin1入力信号)もアクティブになります。
しかし、このregWRはIC42でゲートされているため、pin2に入力されるCLK2がLの期間でないと、レジスタへの書き込み信号として出力されることはありません。
もしも、regWRの立ち上がりがCLK2がLになるよりも早ければ、です。

regWRの波形です。

下(CH2)がregWR(IC42のpin1入力信号)で、上(CH1)が誤出力されたIC42のpi3からの出力信号です。
ちなみにこのタイミングはかなりワーストなもので、いつもこのようになるとは限りません。
オシロで捉えようとしてプログラムをループさせてみたのですが、なかなか捕まえられませんでした。
IC42のpin1にオシロのプローブをあてて、さらにちょいと+アルファしてやっと必ず出力される状態になりました。

ところで、回路が間違っている、というからには、ではどういう回路にすべきだったのか、という問題になるのですが、それについては、また次回に書くことにいたします。

お手持ちのMYCPU80が、RXで誤動作するかどうかのテストについて、まず説明をいたします。
TK80回路のキーから入力して、次のプログラムを書いてください。
8000からでも9000からでも良いのですが理由があって、かならず下2桁が00のアドレスから書いてください。

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

書き終わったら8000からRUNさせてみてください。
暴走したら、対策が必要です。
もし暴走しないでループを実行し続けたら、とりあえずは誤動作せずに動いています。
暴走しないで正しく動いている場合には、CPUは8003から8007の間を繰り返し実行し続けますから、PC(プログラムカウンタ)のLEDは10000000 00000111のように点灯して見えます。
この場合には、とりあえずは対策はしなくてもよいのですが、なにしろかなりぎりぎりのタイミングだと思いますから、気温などの変化によって、いつ誤動作が出てくるかわかりません。
できたらお手数で申し訳ありませんが、誤動作防止の対策をしていただいたほうがよろしいかと思います。

ところで、もし誤動作していたら、の話なのですが…。
下のように、8004以下を書き換えて、もう一度実行してみてください。

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

今度は誤動作しなくなったはずです(なぜなのかについては、次回に説明いたします)。

●ヒゲ退治の対策です

出てしまったヒゲをつぶすには270pFのコンデンサをIC42のpin3とGND(pin7)との間に取り付けます。
もうひとつ、出なくするための対策として、IC42のpin1とVcc(pin14)との間に1KΩの抵抗を取り付けます。これはもとのプルアップ抵抗(1KΩ)に、さらに並列に1KΩを追加することで、プルアップ抵抗を500Ω相当にするものです。こうすることで、regWR入力信号の立ち上がりをスピードアップすることができます。

MYCPU80の基板裏の写真です。

IC42(74HC32)のpin1とpin14との間に1KΩの抵抗を取り付け、pin3とpin7の間に270pFコンデンサを取り付けます。

もう少し拡大してみました。


抵抗を取り付けたあとの、IC42のpin1入力とpin3出力信号の波形写真です。

下(CH2)がregWR(IC42のpin1入力)で上(CH1)がpin3の出力です。
regWR信号の立ち上がりが早くなり、ヒゲは完全に消えています。
(次回に続きます)

2009.10.26upload

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