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

●タイトルを訂正いたしました

正確さがウリのコンピュータがテーマの文章のタイトルがあいまい、というのはやっぱりよくないですねぇ。
そう思いまして、やれやれ、しんどいこっちゃ、とぶつぶつぼやきながら、過去ファイルを全部訂正いたしました。
ま、身から出たサビ、でだれに文句をいうこともできません。
ここまで読んできていただいた方々は、このみっともないタイトルの由来については、すでに先刻ご承知いただいているわけなのですが、はじめて訪問していただく方にとっては、「こりゃ、なんのこっちゃ」というあらぬ疑問をいだかせてしまいますので、ことの次第についてのコメントは[第1回]冒頭に追記いたしました。お暇でしたら、再読を…。

●前回についても少し加筆しました

前回のアドレスバス・データバスの回路図についての説明を今回にしようと思ったのですが、そうすると、今回の説明を読んで、回路図を参照するためにブラウザの戻るボタンで前回に戻って、それからまたブラウザの進むボタンでここに来て、とめまぐるしい操作をしなければならなくなります。
そんなこと、やってられないよ!
はい。その通りです。ですから、そう言われてしまわないために、前回の回路図の下に説明を追加いたしました。
以上、念のため、ご報告申し上げます。

●なぜLEDの接続に2通りを使っているのでしょう?その理由です

スタンダードのTTLや74LSなどはHレベルの出力電圧が低く、取り出せる電流値も少なかったために、LEDのアノードを接続するような、LEDの表示回路はできなかった、という説明を前回いたしました。
しかし、今回はCMOS、74HCですから、その理由でLEDのアノード接続ができない、ということはないはずです。
それなのに、やっぱりLEDを直接接続できなくて、74HC04を使わなければならない回路があるのです。
なぜなのでしょうか?

前回の回路図に戻ってじっくり考えていただきたいところなのですが、多分、面倒だ、と言われるでしょうから、比較できる回路図をお見せすることにいたします。
OPコードレジスタからの出力OP0〜OP7(LEDのアノードが直接出力ラインに接続されている)と、内部データバスラインiB0〜iB7(LEDが直接接続できないので、74HC04を経由してLEDを接続している)とを比較できるように、前回の回路図の一部を切り取って再編集しました。


さて、では図を良く見て考えてみてください。OP0〜OP7はLEDを直接接続できるのに、iB0〜iB7には、なぜLEDを直接接続できないのでしょうか?

接続したくないから?

そうではなくて、本当に接続できないのです。
では、なぜ?

それは、iB0〜iB7にはプルアップ抵抗がついているから、なのです。
おおお、なぜよ。たかが、抵抗の有り、無しがどうして関係などするのよ?説明してもらおうじゃないの。

●では、まず、そもそもなぜプルアップ抵抗が必要なのか?の説明から

(話し始めると、またまた、長ーいお話に、多分、なってしまいます)

OP0〜OP7にはプルアップ抵抗がありません。
でもiB0〜iB7にはプルアップ抵抗がついています。
なぜでしょうか?

OP0〜OP7はOPコードレジスタ74HC373からの出力ラインです。
74HC373をよく見ると、OE(1pin)がGNDに接続してあります。つまり74HC373からの出力は常時出っぱなしなのです。ラインはHであるかLであるかは別として常に信号が出ている(ロウインピーダンス)状態です。だからプルアップ抵抗などつける必要がありませんし、つけても意味がありません。

一方、iB0〜iB7はというと、74HC245からデータが出力されるときもありますが、逆に74HC245にデータが入力される向きになることもあります(そのときは、CPU内部のレジスタなどからデータが出力されます)。
74HC245の出力はG(19pin)によってコントロールされますから、GがHのときは、74HC245からは何も出力されませんし、GがLでも、DIR(1pin)がLのときは、ゲートの向きがA←Bになるので、やはりどこか別のレジスタからiB0〜iB7に何かデータが出力されない限り、iB0〜iB7には何も信号が存在しない、ことになります。
そういう場合、たいていはどこか別のレジスタからの信号がiB0〜iB7に出力されているはずですが、絶対に、常にiB0〜iB7に何かのデータが乗っている、という保証はありません。
何もデータがなければ、そのラインはハイインピーダンスになります。

●CMOSの入力端子をオープンにしてはいけません!

スタンダードのTTLや74LSでしたら、ハイインピーダンスでもそのままにしておいても良かったのですが(本当は、TTLでもハイインピーダンスのままにするのは、余り良くありません)、74HCなどのCMOS回路では、ラインをハイインピーダンスにしてはいけません。
絶対に、絶対に、絶対に!禁止です。

バスラインに限らずCMOSゲートの入力をハイインピーダンスのままにしておく(入力に何もつながないで、入力端子オープンの状態にしておく)と、どうなるか?
最悪の場合、ICが焼けて破損してしまいます。

●だけど、CMOSはほとんど電流を消費しないICだったのではないの?

そんな、焼け焦げてしまうほどの電流が流れることなど、本当にあるの?

CMOSのICは通常は消費電流はきわめて少ないとされています。
LEDの表示回路などはLEDの点灯時に当然電流が流れますが、CMOSゲートの出力に、別のCMOSゲートがつながっている、というような、ごく普通の回路では、後ろにつながったCMOSゲートを駆動するための電流は原理的には0です。

余談ですが、TTL回路は後ろにつながったゲート回路の入力トランジスタを駆動するために、前のゲートの出力トランジスタに電流が流れ込みます。

上の図の回路で、TTLの場合には、出力AがLのときにBからAに矢印の向きに電流が流れます。
どのくらいの電流値かというと、これが意外に大きくて、74LSの場合には0.4mAも流れます。
AがHのときにはほとんど電流は流れません(20μA)。

●ファンアウトということ

ついでながら、参考までに、では74LSの場合に、上の図の回路で、前のゲート(図の例ではANDゲート)の出力がLのときに、後ろに何個のゲートをつなぐことができるかというと、74LSゲートでは、出力Lのときに流し込むことができる電流値は8mAということになっているので、8/0.4=20になりますから、最大20ゲートを接続することができます。
この接続可能ゲート数のことをファンアウトといいます。ですからLSTTLではファンアウトは20ということになります。

●CMOSのファンアウトはン百?

話をもとに戻しまして、LSTTLではそのように、後ろにつないだゲートを駆動するために、前のゲートの出力に駆動電流が流れます。
しかしCMOS回路はFETで構成されていて、電流で駆動するのではなく、電圧のみで動作しますから、後ろにつながったCMOSゲートを駆動するために、前のゲートの出力FETはHまたはLの電圧のみを出力すればよく、電流は必要ありません。
さきほどのゲート出力の図で、CMOSゲートの場合には、AがHであってもLであっても矢印の向きにもその逆の向きにも電流は流れません。
したがって理屈の上ではLSTTLのようにファンアウト20のような、接続可能数の制限は無く、いくつつないでも駆動電流は0である、ということになります。
じっさいにはゲートをたくさんつなぐと回路の容量負荷(浮遊コンデンサ容量が負荷になる)なども無視できなくなりますから、無制限ということはありませんが、まあ、いくつ接続可能か、などと思い悩むほどきびしくは無いと思います(多分)。

●CMOSでは流れないはずの電流が流れてしまう?

それじゃあ、CMOSは駆動電流が必要ないのだから、回路がハイインピーダンスであっても、ICが焼き切れるほどの電流が流れるはずはないではないか?という当然の疑問がでてきます。

そのようなCMOSなのですが、じつは現実には、そうであるのに、なぜか電流が流れてしまうのです。
面倒なので詳しく確かめてはいません。想像です。推測に過ぎません。
多分、出力がHからLに、LからHにと変わる過程で、上のFETも下のFETも、両方のFETが過渡的にONになってしまう期間があるのでは?と思います。

●CMOSは出力がスイッチするときに電流が流れる(らしい)

HならH、LならLで出力がどちらかに固定していれば、電流は流れない。しかし、出力がスイッチすると、その出力が切り替わる瞬間だけ、上のFETから下のFETに、つまり後ろにつながっている回路の有り無しに関係なく、自分自身の出力回路の中だけで電流が流れてしまうことになるのでは、と想像しています。
もしそうなら、スイッチする回数が多ければ多いだけ、つまり動作周波数が高くなれば、高くなるだけ、より多く電流が流れることになります。

さてそこで、もしもCMOSゲートの入力に何もつながないで、ハイハンピーダンスにしておくと、どういうことがおきるか(これも想像ですけれど)?

多分、すると、CMOSを構成しているFETは入力インピーダンスが非常に高いので、無信号でもノイズによって簡単に動作してしまいます。入力がハイインピーダンスということでスレッショルド付近でふらふらするとなれば、出力はやはりHでもLでもない中間的な出力になって、その結果上のFETも下のFETも両方ともONになって、両方のFETの間に過電流が流れてしまうかもしれません。

あるいは、外来のノイズによって、入力ラインにVDD以上の電圧やGND以下のマイナスの電圧がかかってしまうかもしれません。
CMOSのICの入力に、GND〜VDDの範囲を超える電圧を加えると、IC内部になんだか逆バイアスされた電流だとかなんだとか、よくは知りませんが、そのような電流が流れて、止まらなくなってしまう(ラッチアップというのだそうです)現象がおきて、それで最後にはICが焼き切れてしまいます。

話が非常に長くなってしまいましたが、そういうわけなので、74HCやその他のCMOSのICを使う回路では、ラインをハイインピーダンスにしてはいけません。
ならば、どうするか?

●ラインをハイインピーダンスにしてはいけないので、プルアップ(またはプルダウン)

そこで、ハイインピーダンスにしないためにプルアップ抵抗をつけて、ラインに信号が無いときには、強制的にラインをHレベルにするのです。
ハイインピーダンスにしない、という目的のためならば、プルダウン抵抗をつけることもできます。その場合には、ラインに信号が無いときには、ラインがプルダウン抵抗によってLになります。

あ。プルアップ抵抗というのは、ラインとV+の間に適当な値の抵抗(1KΩ〜100KΩ)を入れる、その抵抗のことで、プルダウン抵抗というのは、ラインとGNDとの間に入れる抵抗のことです。

で、普通はプルアップ抵抗でもプルダウン抵抗でも、どちらでもよいのですが、今回の、「つくるCPU」回路の場合には、またあとで説明する理由によって、必要なラインには全てプルアップ抵抗をつけることで統一してあります。
以上が、iB0〜iB7にプルアップ抵抗がついている理由です。

●それでは、プルアップ抵抗があると、なぜLEDのアノード接続ができなくなるのか?その理由です

もう、おわかりの方もおいでのことと思います。


上の左の回路では、ラインが無信号の時は、プルアップ抵抗によって、A点の電圧は電源電圧になります。つまりHレベルです。
右の回路ではどうでしょうか?
2個の抵抗の値によって電源電圧(+5V)が分圧された電圧がAにかかります。当然Hレベルではありません。
もしも上の抵抗と下の抵抗+LEDの抵抗値が同じになったとすると、Aには電源電圧の1/2の2.5Vがかかることになります。
このような電圧がCMOSゲートの入力にかかると、出力段のFETが上下両方ともONになって、過電流が流れてしまうかもしれません。
したがって、このようなHでもなくLでもない中間の電位の信号をCMOSゲートに加えることは危険ですから、避けなければいけません。

これが、プルアップ抵抗がついたラインには、LEDを直接接続することができない、という理由です。

●いや、それでもLEDを直接接続できるはず

たしかにプルアップのついたラインにLEDのアノードを接続することはできません。
しかし!カソードなら接続できるではありませんか!(下図)

どうです。賢いでしょう、と得意になっておりましたら、このページをお読みになった方から、おかしいではないか?というご指摘をいただいてしまいました([第33回])。
ご指摘をいただくまで、うかつにも全く気がつきませんでした。

ご指摘の通り、図の回路はプルアップ抵抗の代用としては使えませんでした。
ここは、下図のようにしなければなりません。

図のように、本来のプルアップ抵抗は省略できません。
LED点灯用のR2は1KΩ〜2KΩくらいですから、出力側のゲートにさらに負担をかけない程度のプルアップ抵抗をつけなければならない、というところから、R1は5KΩ〜10KΩというあたりの値が妥当だと思います。

それでは、プルアップ抵抗さえつければ、これでいいか、というと、残念ながらこの使い方には、まだなお、欠点があって、いつでも使えるというわけにはいきません。

●欠点とは?

この接続方法だと、ラインのH、LとLEDの点灯、消灯が逆になってしまうのです。
AがHのときに、LEDは消えてしまいます。逆にAがLのときにLEDが点灯してしまいます。
これは、データバスなどの表示には全く困ります。
感覚的に、Hのときに点灯、Lのときに消灯してほしいですものね。

そういうわけで、データバスやその他のバスラインなどには、74HC04のゲートをLEDの数だけ消費してしまうという、まことに残念な回路を選択せざるを得なかったのです。
2008.8.3upload
2008.8.11加筆訂正

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