74LS と 74HC をつなぐと H が通らないことがある ―― ロジックICのレベルと HiZ を確かめる

  • 電子回路
  • cmos
  • ハードウェア
  • 電子工作
  • spice

種類の違うロジックICをつないだのに、思ったように動かない。そういうとき、原因はソフトでもタイミングでもなく、電圧のレベルが合っていないか、出力どうしがぶつかっているか、のどちらかであることが多いです。同じ 5V で動く 74LS と 74HC ですら、片方の出力をもう片方の入力に直結すると、H が正しく伝わらないことがあります。

この記事では、各ファミリの規格値からノイズマージンを総当たりで計算して危ないところを見つけ、その理由を SPICE の波形で確かめます。扱うのは、出力と入力のレベルが合うかどうかと、HiZ(出力を切り離した状態)とフローティングでどこが崩れるか、の二つです。前半でレベルの話を、後半で衝突とフローティングの話をします。部品の実測ではなく、公開されている DC 規格値と、自分で書いた小さな回路のシミュレーションだけで進めます。

レベルが合う、とはどういうことか

出力側には、H を出したときに保証される最低電圧 VOH と、L を出したときの最高電圧 VOL があります。受け側には、H と認める最低電圧 VIH と、L と認める最高電圧 VIL があります。つなぐ相手が H を出したとき、その VOH が受け側の VIH を上回り、しかもいくらか余裕があること。そして L のときは、VOL が VIL を下回っていること。この H 側と L 側それぞれの余裕を、ノイズマージンと呼びます。

5V と 3.3V と 1.8V の代表的な値で、駆動側と受け側の全組み合わせのマージンを計算してみました。表の数字は、H 側と L 側のうち小さい方、つまり余裕の少ない方です。

駆動ファミリを行、受けファミリを列にとったノイズマージンのマトリクス。5V の 74LS から 74HC のマスは赤で -0.8V、同じ 74LS から 74HCT のマスは緑で +0.3V。3.3V(LVTTL) から 74HC も赤。5V CMOS の 74HC・74HCT から 3.3V や 1.8V へ、また 3.3V から 1.8V へは過電圧の濃い赤になっている

緑がマージンに余裕あり、黄が乏しい、赤がレベルの届かない組み合わせ、濃い赤は過電圧です。この中で赤くなっているのが、5V どうしの 74LS から 74HC のマスです。H 側のマージンが −0.8V で、足りていません。ところが、同じ 74LS でも受けが 74HCT なら、H 側のマージンは −0.8V から +0.7V に転じて、H が届くようになります。表に出ている +0.3V は、このとき余裕の少ない方に回った L 側の値です。同じ 5V の相手で、受け方を変えるだけでこれだけ変わります。

74LS の H が 74HC に届かない理由

74LS が H で保証するのは「2.7V 以上」という下限だけで、悪い条件では 2.7V まで下がりえます。一方、74HC が H と確実に認めるのは、電源電圧のおよそ 0.7 倍、5V なら 3.5V 以上です。この 3.5V と、L と認める 1.5V のあいだは、H とも L とも保証されない領域です。74LS の最悪の H である 2.7V は、ちょうどこの、どちらとも決められない領域に入ってしまいます。

なぜ 74HC の入力は 3.5V まで要求するのか。CMOS 入力が切り替わるしきい値は、だいたい電源の半分あたりにあって、しかも温度や個体でずれます。そのばらつきを見込んで、確実に H と言える下限を高めに置いてあるからです。しきい値の位置を見るために、素朴な CMOS インバータを SPICE で二つ用意して、入力を掃引してみました。一つはしきいを電源の半分(約 2.5V)に釣り合わせたもの、もう一つは NMOS 側を強くしてしきいを約 1.4V に下げたもの(上下のバランスを n 側に振ると、切り替わる電圧が下がります)で、前者がふつうの CMOS 入力、後者が TTL 互換の入力(74HCT など)にあたります。

CMOS インバータ2種類の入力対出力の伝達曲線。しきい 2.5V の曲線は入力 2.7V で出力がまだ 0.87V までしか下がらず、しきい 1.4V の曲線は同じ 2.7V で出力が 0.04V まで落ちきっている。74LS の High の下限保証 2.7V(悪条件でここまで下がる)の位置に破線が引かれている

しきいが 2.5V の CMOS 入力では、74LS の 2.7V はしきい値からわずか 0.2V の位置で、出力が切り替わる境目のすぐ際にあります。この一個体はたまたま切り替わっていますが、温度や個体差でしきいが 2.7V を超えれば、もう H として拾えません。74HC の VIH が 3.5V と高いのはこのためで、2.7V は保証の外にあります。対して、しきいが 1.4V の TTL 互換入力なら、2.7V はしきいをゆうに越えていて、出力もきれいに振り切れています。これが 74HCT が用意されている理由だと思います。入力しきい値の仕様を TTL 互換にして、TTL や 74LS の低い VOH を確実に H として受けられるようにしてあります。安く済ませたいなら、74LS のトーテムポール出力(TTL の押し引き出力段)に 5V へのプルアップ抵抗を足して、弱い H を電源側へ引き上げる手もあります(そのぶん L のとき抵抗に電流が流れます。この持ち上げがいちばんきれいに効くのは、H を自前で出さないオープンコレクタ出力です)。

電圧そのものが違うとき

電源電圧が異なると、事情はもう少し込み入ります。マトリクスに戻ると、3.3V の出力を 5V の 74HC に入れる組み合わせも赤でした。3.3V 側は H を出しても自分の電源 3.3V より上には振れず、5V の CMOS が求める 3.5V に届きません。保証値の VOH で見ればさらに低く、マージンは −1.1V です。逆に、5V の CMOS 出力を 3.3V の入力に入れる向きは濃い赤、過電圧です(同じ 5V でも、74LS のように出力の天井が低いものはここまで上がらないので、表では過電圧になっていません)。レベルとしては H も L も認識できますが、3.3V 部品の入力が耐えられる電圧を超えて、壊す恐れがあります。この向きでは、受け側が 5V トレラント(電源を超える入力に耐える)かどうかを、入力の絶対最大定格で確認します。

電圧をまたぐ接続は、直結できません。低い方から高い方へ H を届けたいならレベルを持ち上げ、高い方から低い方へは過電圧にならないよう電圧を落とす必要があります。どちらも、専用のレベル変換IC(双方向なら自動で向きを判定するトランスレータ、片方向なら 5V トレラント入力のバッファなど)を挟むのが素直な解です。片方向で速度が要らなければ、直列抵抗とクランプ、あるいは分圧で間に合うこともあります。I2C のように複数がぶら下がる線なら、オープンドレイン出力を低い側の電源にプルアップして電圧をそろえます。相手の H が低いだけで電圧はまたがないなら、TTL 互換入力(74HCT など)を選ぶ手もあります。どのやり方をとるにせよ、電圧の違う線を何も挟まず直結しない、というのが出発点です。

HiZ とフローティング

レベルが合っていても、出力の状態で問題が出ることがあります。3ステート出力は、H でも L でもない切り離した状態(HiZ)を持てて、これで一本の線を複数の相手で共有します。厄介なのは、その線が誰にも駆動されない瞬間や、入力が開放されたときです。

CMOS の入力をどこにもつながず開放(フローティング)すると、漏れ電流や周囲のノイズで電位が定まらず、電源の中間あたりに落ち着くことがあります。さきほどのインバータで、電源電流を入力電圧に対して測るとこうなります。

CMOS ゲートの電源電流を入力電圧に対してプロットした山型の曲線。入力が中間電位の 2.5V 付近で電流が 4mA 前後のピークになり、入力が 0V や 5V に近いところではほぼ 0 になる。フローティング入力が漂う 1.5〜3.5V の帯が塗られている

中間電位では、ゲート内部の P 側と N 側が同時に部分的に導通して、電源から GND へ電流が流れ続けます。これを貫通電流と呼びます。この図では 4mA 前後で、絶対値はモデル次第ですが、要は無駄に流れて発熱し、しかもわずかなノイズで出力が不安定に振れます。だから CMOS の入力は開放したままにしてはいけません。使わない入力も含めて、H か L に固定します。信号線なら、確定させたい向きにプルアップ抵抗かプルダウン抵抗を入れます。抵抗値は、入力を留めておくだけなら 10k〜100kΩ くらいで足り、I2C のように線そのものを駆動する用途では、上限が立ち上がり時間(抵抗と配線容量で決まる)、下限が L のときに引ける電流(VOL を満たせるか)で決まります。

同じことは、ゆっくり変化する信号でも起きます。長い配線や RC で立ち上がりが鈍った信号は、この中間電位の帯に長くとどまるので、同じ貫通電流と出力のばたつきを招きます。入力にヒステリシスを持たせたシュミットトリガ入力(74HC14 など)を挟むと、H と L でしきいがずれるぶん、遷移の途中で行き来しにくくなります。

もっと物理的な破損につながりやすいのがバス競合です。3ステートの線で、ある駆動が H を出したまま、別の駆動が同じ線に L を出してしまうと、両者の出力が衝突します。

バス競合の過渡波形。前半はバス電圧が 5V で電源電流はほぼ 0。時刻 5us で片方の駆動が L に反転すると、バス電圧が約 2.5V の不定な中間電位に落ち、同時に H を出している側の電源電流が 19mA まで跳ね上がる

前半は二つの駆動がどちらも H で一致していて、線は 5V、電流はほぼ流れません。途中で片方が L に反転した瞬間、線の電圧はどちらとも読めない中間に落ち(このモデルは対称なので約 2.5V、実際は出力抵抗の差で偏ります)、H を出している側の電源から L 側へ大きな電流が流れ込みます。この例で 19mA です。これが続けば発熱し、素子を傷めます。3ステートのバスは、同時に一つだけが駆動するよう、イネーブルが重ならないように設計します。オープンドレイン(オープンコレクタ)なら、各出力は L か HiZ しか出さず、H はプルアップ抵抗が作るので、この H 対 L の競合は起きません。

おわりに

つなぐ前に一度マージンを計算しておくと、レベルの不整合はだいたい防げます。やること自体は、H 側と L 側の両方でマージンが正になるかを確かめるだけです。総当たりの表にしてしまえば、どの向きが危ないか、どこにレベル変換が要るかが一目で分かります。

出てくる対処もだいたい決まっています。同じ電源で相手の H が弱いだけなら、TTL 互換入力を選ぶか、プルアップで H を持ち上げれば済みます。電源電圧そのものをまたぐなら、レベル変換ICを挟みます。一本の線を複数の相手で共有したいときは、オープンドレインとプルアップでそろえます。そして、使わない入力は開放したままにせず、H か L に固定しておく。こうした対処が頭に入っていれば、つなぐ前に手が決まります。

ひとつ注意で、ここで使った DC 規格値は代表的なワーストケースで、実際の値はメーカー・負荷電流・温度で動きます。SPICE の波形も、しきいの位置や電流の出かたを見るための素朴なモデルで、電流の絶対値そのものではありません。実際の設計では、必ず使う型番のデータシートを引いてください。

計算のコードと SPICE のネットリストは GitHub に置きました(logicia32/logic-levels-lab)。ngspice があれば、この記事と同じ図が出ます。表の規格値を手持ちのファミリに入れ替えれば、自分が使う組み合わせでも同じマージンの一覧が出せます。

この記事は Zenn に初出したものを加筆・補足したものです ── Zenn の元記事を見る