学ぶ › トピック 12
タイミング図、グリッチ、静的ハザード
読了時間:約 8 分 · bitGateLab チーム
紙の上ではゲートは瞬時に応答しますが、現実には、どのゲートも数ナノ秒かかります。この違いは、真理値表ではほとんど問題になりませんが、タイミング図では問題になります。遅延の異なる二つの経路があると、グリッチと呼ばれる偽のパルスが生じ、そうなるべきでないときにカウンタを進めたり、ラッチをトリガしたりすることがあります。この記事では、タイミング図の読み方、遅延の計算、そしてカルノー図を使った静的ハザードの検出と除去を学びます。
タイミング図の読み方
タイミング図では、各信号を、共通の横軸(時間軸)の上で上がったり(1)下がったり(0)する線として描きます。任意の時刻に縦線を一本引いたと想像すれば、その時点でのすべての信号の値がわかります。入力のエッジが原因であり、入力のエッジから、それが引き起こす出力の変化までの間隔が遅延です。クロックのある回路では、各アクティブエッジの直前の値を読みます。フリップフロップがサンプリングするのは、その瞬間だからです。
伝搬遅延とクリティカルパス
伝搬遅延とは、入力の変化から、その結果として出力が変化するまでの時間で、それぞれの遷移の 50 % の点の間で測ります。次の二つの値を区別します。
- tPLH:出力が Low から High に変わるときの遅延。
- tPHL:出力が High から Low に変わるときの遅延。
5 V で動作させた 74HC ファミリでは、単純なゲートの遅延は 10 ns 程度で、容量性負荷が大きくなるほど、また電源電圧が下がるほど長くなります。
回路の遅延とは、入力から出力までのあらゆる経路のうち最も遅い経路、つまりクリティカルパスの遅延のことです。各経路上のゲートの遅延を合計し、最大のものを採用して求めます。
例:F = A·B + A·C で、tNOT = 5 ns、tAND = 10 ns、tOR = 10 ns とします。
- B または C からの経路:AND + OR = 20 ns。
- A から上側の AND を通る経路:AND + OR = 20 ns。
- A からインバータを通る経路:NOT + AND + OR = 25 ns。
クリティカルパスは、A からインバータを通る経路で、25 ns です。どの入力が変化しても、F が安定するまでにこれより長くかかることはありません。
グリッチと静的ハザード
ここでいう静的 1 ハザードとは、入力が変化する間も出力が 1 のままであるべきなのに、一瞬 0 に落ちる可能性がある状況です。静的 0 ハザードはその逆で、出力が 0 のままであるべきなのに、一瞬 1 になるスパイクが出ます。どちらも、ある変数とその否定が、遅延の異なる経路を通って出力に届くときに現れます。
先ほどの例の回路で、B = C = 1 とします。論理的には、常に F = A + A = 1 です。ところが A が 1 から 0 に下がるとき、項 A·B は、A·C がオンになるより先にオフになります。A はまずインバータを通らなければならないからです。
グリッチの発生経過(B = C = 1、A が t = 0 で下がる):
- t = 5 ns:インバータが A を立ち上げます。
- t = 10 ns:A·B の AND の出力が下がります(t = 0 での A の変化に応答)。
- t = 15 ns:A·C の AND の出力が上がります(t = 5 での A の変化に応答)。
- 10 ns から 15 ns の間は、OR の二つの入力がどちらも 0 です。OR は 10 ns 後に応答するので、F は t = 20 から t = 25 ns まで 0 になります。
グリッチの幅は、二つの経路の遅延の差、つまりインバータの遅延である 5 ns です。A が立ち上がる場合は、A·B が t = 10 でオンになり、A·C が t = 15 でオフになります。その間は両方とも 1 なので、グリッチは生じません。
このほかに動的ハザードもあります。出力が一度だけ変化するべきところで、三回以上変化してしまうものです(たとえば 1 → 0 → 1 → 0)。同じ変数に対して遅延の異なる経路が三つ以上ある、多段の論理回路で現れます。
カルノー図でハザードを見つけて取り除く
積和形のカルノー図では、1 の入った二つのセルが隣接しているのに、別々のグループで覆われていて、両方を覆うグループが一つもないとき、静的 1 ハザードが現れます。一方のセルからもう一方へ移ることは、変数を一つだけ変えることを意味し、その変化の間に、回路はある項から別の項へ「飛び移る」ことになります。
解決策は、コンセンサス項を追加することです。二つのセルを両方とも覆う、追加のグループです。論理的には冗長ですが(真理値表は変わりません)、遷移の間も出力を 1 に保ってくれます。
例:F = A·B + A·C。
- A·B はセル ABC = 110 と 111 を覆います。A·C は 001 と 011 を覆います。
- セル 011 と 111 は隣接していて(変わるのは A だけ)、別々のグループに入っています。これが、B = C = 1 のときに見たハザードです。
- 両方を覆うグループは B·C で、これは A·B と A·C のコンセンサスです。一方の項にそのままの形で、もう一方の項に否定の形で現れる変数を取り除き、残ったものを掛け合わせて作ります。
- ハザードのない回路:F = A·B + A·C + B·C。B = C = 1 のとき、項 B·C はずっと 1 なので、OR の出力はもう下がりません。
和積形の場合は、双対の考え方になります。別々のグループに入っている隣接した 0 を探し、コンセンサスの和項を追加して、静的 0 ハザードを取り除きます。たとえば F = (A + B)·(A + C) は B = C = 0 のときにハザードがあり、因数 (B + C) を追加すれば修正できます。
よくある間違い
- 真理値表が正しい回路は誤動作しないと考える。真理値表は、遷移の間のふるまいについては何も教えてくれません。
- クロックやリセットを駆動する回路で、簡単化のときに「余分だから」とコンセンサス項を取り除く。
- 最も遅い経路の遅延だけを合計するべきところで、回路中のすべてのゲートの遅延を合計する。
- 二つの入力が同時に変化するときのグリッチも、コンセンサス項で取り除けると思い込む。対応できるのは一つの変数の変化だけです。
シミュレータで試してみよう
タイミング図で、スパイクと、コンセンサス項を追加するとそれが消える様子を見ることができます。
- インバータ一つ、AND 二つ、OR 一つを置き、F = A·B + A·C を組みます。
- B = 1、C = 1 に固定し、A を、切り替えられる入力か、遅いクロック信号につなぎます。
- タイミング図を開き、A を 1 から 0 に何度か切り替えます。遷移の瞬間の F を観察し、短いパルスやグリッチの通知が現れるかどうかを確かめます。
- B·C を作る三つ目の AND を追加し、その出力を OR に加えます。
- A をもう一度切り替えて、F が 1 のまま保たれることを確かめます。
練習問題
- F = A·C + B·C の静的ハザードを見つけ、ハザードのない形を書いてください。
解答
A·C は 100 と 110 を、B·C は 011 と 111 を覆います。セル 110 と 111 は隣接していて(変わるのは C)、別々のグループに入っています。A = B = 1 のときです。コンセンサス:A·B。F = A·C + B·C + A·B。
- 練習問題 1 の回路で、tNOT = 4 ns、tAND = 8 ns、tOR = 8 ns、A = B = 1 とします。グリッチは C のどちらの遷移で現れ、いつ、どれだけ続きますか。
解答
C が t = 0 で下がるときです。B·C は t = 8 で下がり、C は t = 4 で上がり、A·C は t = 12 で上がります。8 ns から 12 ns の間、OR の入力は二つとも 0 になるので、F は t = 16 から t = 20 ns まで 0 になります。幅は 4 ns です。C が上がるときにはグリッチは生じません。
- 練習問題 2 の遅延を使うと、F = A·C + B·C のクリティカルパスはどれですか。
解答
C からインバータを通る経路です。4 + 8 + 8 = 20 ns。
- F = (A + B)·(A + C) について、B = C = 0 のとき出力はどんな値であるべきですか。また、どんなグリッチが現れる可能性がありますか。
解答
B = C = 0 のとき、F = A·A = 0 です。A が変化するときに、一瞬 1 になるスパイクが現れることがあります(静的 0 ハザード)。因数 (B + C) を追加すれば取り除けます。