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

●こういうトラブルが一番難しい

誤動作にもいろいろあります。
比較的簡単に解決できてしまう誤動作は、「確実に」発生してくれる誤動作です。
あるタイミングでいつも発生する異常ならば、オシロで観測しながら異常の発生しているラインを追求していくことで、原因にたどりつくことができます。
ところが、ときどき何のきっかけもなく、ポロリと単発的に発生する誤動作は、追及のしようがありません。
そのような誤動作が起きるかもしれないと考えられる原因を、思いつくまま、推理して、あれこれ試してみるしかありません。

今回は、レジスタの値が突然書きかえられてしまう、という誤動作です。
真っ先に思いついたのは、以前から気になっていたレジスタアドレス信号の遅れです。

このことについては、以前にも書きました([第72回]●d3〜d0の立ち上がりが遅い!)。
そして、その遅れに間に合うように、regWR、MEMWR信号の幅を縮めて、WR信号が立ち下がるタイミングを半クロック遅らせたのでした。

さらに、その遅れを考えると、CPUクロックが4MHzでは、とても無理と思えたので([第73回])、今回の試作2号基板では、CPUクロックを、当初の予定の半分の2MHzに落としました。

「もしも2MHzでも間に合わない回路がでてきた場合には、74HC03、74HC05を74HC126に置き換えるなどの対策が必要になります。」([第136回]

そういうことでしたから、今回の誤動作が発生したときに、真っ先に、「d3〜d0の遅れ」を疑ったのです。

●信号の立ち上がりが問題

どこが問題なのか、タイミングチャートと回路図で説明をします([第72回]および[第73回]でも説明していますけれど)。

POP命令のタイミングチャートです。


図は以前のものをそのまま使いましたので、CLOCKが4MHzになっていますが、現在は2MHzに下げています。

右側のPOP AF(これはZ80のニーモニックでした。8080ではPOP PSWでしたね)の、d3、d2、d1の立ち上がり(M2とM3の境の時点)が遅れます(ここで遅れるのは、ちょいと問題です)。
何回か説明をしていますけれど、d3〜d0、s3〜s0は内部レジスタを選択するためのアドレス信号です。dはdestination(目的、行き先)のイニシャルで、データの格納先レジスタを示します。sはsource(源泉、出所)のイニシャルでデータが出力されるレジスタを示します。
d3〜d0、s3〜s0とレジスタの関係についてはレジスタコード表([第27回])を参照してください。

POP PSW命令は、SP(スタックポインタ)で示されるスタックアドレスから、M2の期間にF(フラグレジスタ)に値をロードし、次のM3の期間にAレジスタに値をロードします。
F(フラグレジスタ)は、d3〜d0=0001で選択されます。
Aレジスタは、d3〜d0=1111で選択されます。

POP命令の回路図です。


上のほう、d3〜d1は74HC05の出力になっています。
74HC05はオープンコレクタ(ただしくは、オープンドレイン)のインバータです。
回路では、M2の期間中、出力がLになります。
M3の期間になると、74HC05の出力はハイインピーダンスになります。
d3〜d0は1KΩでプルアップされていますから、信号が出力されない期間は、「結果的に」Hになります。

それのどこが問題か、と言いますと、その「結果的に」というところが、実は余りよろしくないのですねぇ。
もともと74HC05や74HC03は負論理の回路を前提としています。Lアクティブです。
出力がLのときにだけ、「信号を出していますよ」、ということです。
それ以外のときには、出力はハイインピーダンスですから、「信号は出していませんよ」ということなのです。

その期間は、信号を出していませんから、このラインは他の方が自由にお使いいただけます、というわけです。
でも、誰も使わないから、「結果的に、Hの情報が出ているように見える」、だけです。

積極的にHの情報を出しているわけではないから、そのHは、信号レベルとしては「弱い」。
プルアップ抵抗で無理矢理Hにしているだけなんですねぇ。
それがよくないことは、わかってはいるのですけれど…。
世の中には「わかっちゃいるけど、やめられない」ことがたくさんあるのですよ(ああ。植木等さんも、もういないのですねぇ)。

プルアップ抵抗(1KΩ)だけで、ラインの浮遊容量やそのラインにつながっているゲートの入力容量などの”C”を充電することで無理矢理Hになるので、立ち上がりが遅くなってしまいます。
プルアップ抵抗をもっと小さくすれば、立ち上がり時間をもっと短縮することができるのですが、そうすると、ゲートの出力がLのときに、プルアップ抵抗を通してVccからゲートの出力に流れ込む電流が増大して、ICの限界を超えてしまいます。
参考までに、そのあたりの数値について、データシートで確かめてみましょう。

●74HC05のデータシート(部分)です


[出典]Texas Instruments社SN74HC05datasheet(赤線は筆者)

うーん。active−low wired−ORはわかるけど、あれまあ、active−high wired−ANDにも使えますって…。
んじゃあ、ここまで、「本当はよくない使い方です」、てな感じでひっぱってきた、私の立場がないじゃありませんか。
そういうつもりでデータシートを参照したわけじゃないんですけどねぇ。

え?
何を言っているのか、さっぱりわかりません?
またまた、本題から、外れてしまいますけれど。

●wired−ORとwired−AND

まずは、wired−ORです。

図の左側がその回路で、その下の表は真理表です。
右の図は、左の回路と同じ働きをする回路を通常のゲートで組んだものです。
A、B、Cは正論理ですが、間にインバータが入っていますから、74HC05の出力が結合したラインを見ると、そこは負論理(Lアクティブ)になっています。右図を見れば、このラインがORであることは間違いありません。
LアクティブのワイヤードORですから、active−low wired−ORです。

では、次はwired−ANDです。wired−ORという言葉は聞きますけれど、wired−ANDというのは、あまり聞きませんね。

図の左側がその回路で、その下の表は真理表です。
右の図は、左の回路と同じ働きをする回路を通常のゲートで組んだものです。
今度はさきほどとは逆で、A、B、Cは負論理ですけれど、間にインバータが入っていますから、74HC05の出力が結合したラインを見ると、そこは正論理(Hアクティブ)になっています。右図を見れば、このラインがANDであることは間違いありません。
HアクティブのワイヤードANDですから、active−high wired−ANDです。

って、これ、両方とも、同じ回路じゃないの?
そうです。その通りです。
真理表をHに注目すると、ORなのですが、Lに注目してみると、ANDなのです。
じつは、ORとANDは同じ回路なのですが、アクティブな信号がlowかhighのどちらなのか、によって同じ回路をORととらえるかANDととらえるかがきまるのです。

それでは、ORでもANDでも、どちらでも同じか、というと、右側の回路は全く同じになりますけれど、左の回路は、active−lowとactive−highでは、少し働きが異なってきます。
それが「信号の立ち上がりの遅れ」なのです。
右図の回路は入力信号がOR(またはAND)ゲートの入力部分で、L→Hになる場合と、逆にH→Lになる場合とで、その信号が変化する時間は異なりません。
しかし左図の回路では、L→Hになる時間は、H→Lになるときの時間に比べて非常に遅くなります。
左側の回路は、active−lowのwired−OR回路としては、通常のHC回路とそれほど変わらない速度が期待できますが、同じ回路でも、active−highとして使う場合には、active−lowに比べて遅い回路でなければ使うことができません。

active−highとして少しでも速い回路で使いたい場合には、プルアップ抵抗を小さくするしかありません。
おお。寄り道していたのが、やっと本題に戻ってきました。
そうそう。そこのところを調べるのが、目的でした。
プルアップ抵抗を小さくすれば、信号の立ち上がり時間を速くすることはできますが、出力がLのときに、プルアップ抵抗を通じて、出力ゲートに流入する電流も大きくなってしまいます。


[出典]Texas Instruments社SN74HC05datasheet(赤線は筆者)

データシートの続きです。
absolute maximum ratings(絶対最大定格)です。
これを見ると、出力に流せる電流は最大25mAになっています。
プルアップ抵抗は1KΩですから、74HC05(または74HC03)の出力がLのときにプルアップ抵抗を通じてゲートの出力端子に流入する電流は5mAです。
それなら、まだ相当余裕がありますから、プルアップ抵抗を500Ωにして、電流が10mAになっても、まだまだ大丈夫。

かと言いますと、そうではないのです。
その下のContinuous current through Vcc or GNDを見ますと、最大50mAになっています。
74HC05は1つのパッケージに6ゲート入っていますから、もしも全部のゲートの出力がLになったとすると、GND(電源端子)に流れる電流は、10×6=60mAになってしまい、絶対最大定格の50mAを超えてしまいます。

プルアップ抵抗が1KΩの場合に、6ゲート全部の出力がLになったときにGND端子に流れる電流は、5×6=30mAですから、これなら絶対最大定格を超えることはありません。まあまあ、このあたりの抵抗値が安全な値の目安だということになります。

●それではどうすればよいのでしょう?

POP命令の回路の変更部分のみ示します。


74HC05を外して代わりに74HC126を使います。
74HC126はコントロール端子がアクティブの期間中はL出力だけではなくて、H出力もアクティブになりますから、L→Hの立ち上がりも遅れることなく、普通のゲートと同じように速く立ち上がります。

●改良前と改良後の波形の写真です

こちらは改良前の写真です。

上(CH1)は74HC05の入力信号で、下(CH2)はd1の波形です。
立ち上がりがなまっているのがわかります。

こちらは変更後の写真です。

上(CH1)は、74HC126の入力信号(M2をインバートしたもの)で、下(CH2)はd1の波形です。
左右の立ち上がり部分が、今回74HC05から74HC126に変えた、POP命令の部分です。
立ち上がりがシャープになりました(真中の立ち上がりは別の命令です)。

それで、問題が解決したかといいますと、せっかく改良したにもかかわらず、一向に誤動作はおさまりませんでした。
2009.2.1upload

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