学ぶ › トピック 9
ラッチとフリップフロップ:SR、D、JK、T を順に理解する
読了時間:約 7 分 · bitGateLab チーム
これまでの回路では、出力はそのときの入力だけで決まっていました。数を数えたり、データを保存したり、処理がどの段階まで進んだかを覚えておいたりするには、記憶が必要です。そして最小の記憶セルがラッチです。この記事では、二つのゲートでラッチを作り、それをエッジトリガ型のフリップフロップに発展させ、カウンタやステートマシンの設計に必要になる表の使い方を学びます。
SR ラッチ
二つの NOR ゲートの出力を、互いに相手の入力へ交差させてつなぐと、SR ラッチになります。このフィードバックこそが記憶を生み出します。出力はいったんある値になると、自分自身でその値を保ち続けます。
| S | R | 次の Q | 動作 |
|---|---|---|---|
| 0 | 0 | Q | 保持 |
| 0 | 1 | 0 | リセット |
| 1 | 0 | 1 | セット |
| 1 | 1 | — | 禁止 |
S = R = 1 のときは両方の NOR が 0 を出力するので、Q と Q は互いに反転した関係ではなくなります。さらに悪いことに、そのあと二つの入力が同時に 0 に下がると、最終的な状態は、どちらのゲートが速いかで決まってしまいます。そのため、この組み合わせは禁止されています。S·R = 0 という条件のもとで成り立つ特性方程式は、Q+ = S + R·Q です。
NAND ゲートを使うと SR ラッチになり、入力は負論理になります。11 で保持、01 で Q = 1、10 で Q = 0 となり、00 が禁止の組み合わせです(両方の出力が 1 になります)。
D ラッチ:イネーブルの間は透過
禁止の組み合わせをなくすために、イネーブル入力 EN を追加し、S = D·EN と R = D·EN を作ります。S と R が同時に 1 になることはないので、問題は解消します。動作は単純です。
- EN = 1:ラッチは透過(トランスペアレント)になり、Q は常に D に追従します。
- EN = 0:Q は、D が最後に取っていた値のまま固定されます。
この透過性がラッチの弱点です。ラッチの出力を、論理回路を通して自分自身の入力につなぐと、EN = 1 の間に信号が何周もしてしまい、結果は予測できません。同期式の順序回路には、データをある一瞬だけで取り込むものが必要です。
エッジトリガ型フリップフロップ
立ち上がりエッジトリガ型の D フリップフロップは、クロックが 0 から 1 に変わる瞬間にだけ、D を Q に写します。それ以外の時間は D を無視します。これは、イネーブルが互いに逆の二つの D ラッチ(マスタとスレーブ)を縦続接続して作ります。クロックが 0 の間はマスタが D に追従し、スレーブは閉じています。クロックが立ち上がるとマスタが閉じ、スレーブが、取り込まれた値を出力に通します。式は最も単純で、Q+ = D です。
この基本のフリップフロップをもとに、設計でよく使われる二つのタイプが定義されています。
- JK:SR に似ていますが、禁止の組み合わせがありません。J = K = 1 にすると、エッジごとに Q が反転(トグル)します。式:
Q+ = J·Q + K·Q。 - T(トグル):T = 0 で保持、T = 1 でトグルします。式:
Q+ = T ⊕ Q。J = K = T とした JK から、または D = T ⊕ Q とした D から作れます。
| J | K | Q+ | 動作 |
|---|---|---|---|
| 0 | 0 | Q | 保持 |
| 0 | 1 | 0 | リセット |
| 1 | 0 | 1 | セット |
| 1 | 1 | Q | トグル |
例:JK フリップフロップが Q = 0 から始まり、(J, K) = (1,0)、(0,0)、(1,1)、(0,1)、(1,1) の順に五つのエッジを受け取ります。それぞれに Q+ = J·Q + K·Q を適用します。
- (1,0)、Q = 0:1·1 + 1·0 = 1。
- (0,0)、Q = 1:0·0 + 1·1 = 1(保持)。
- (1,1)、Q = 1:1·0 + 0·1 = 0(トグル)。
- (0,1)、Q = 0:0·1 + 0·0 = 0。
- (1,1)、Q = 0:1·1 + 0·0 = 1(トグル)。
各エッジの後の Q の並び:1、1、0、0、1。
励起表
特性表は「入力が与えられたとき、Q はどうなるか」に答えます。設計に必要なのは、その逆の問いです。「Q をこの値からこの値に変えたい。どんな入力を与えればよいか」。それに答えるのが励起表で、カウンタやステートマシンを設計するたびに使うことになります。
| Q → Q+ | D | T | J K | S R |
|---|---|---|---|---|
| 0 → 0 | 0 | 0 | 0 X | 0 X |
| 0 → 1 | 1 | 1 | 1 X | 1 0 |
| 1 → 0 | 0 | 1 | X 1 | 0 1 |
| 1 → 1 | 1 | 0 | X 0 | X 0 |
JK の欄にある X こそ、このフリップフロップでは式が短くなりやすい理由です。0 から 1 に変えるとき、K は 0(セット)でも 1(トグル)でもかまいません。この自由度をカルノー図で活用するのです。
セットアップ時間、ホールド時間、最高周波数
実際のフリップフロップでは、D がエッジの前に一定時間安定している必要があります。これがセットアップ時間(tsu)です。さらに、エッジの後も一定時間安定していなければなりません。これがホールド時間(th)です。この時間窓の中で D が変化すると、出力はどちらかに落ち着くまで、しばらく中間のレベルにとどまることがあります。これがメタステーブル状態(準安定状態)です。また、出力がエッジの後に変化するまでには、遅延 tCQ がかかります。
同期回路では、信号はあるフリップフロップから出て、組み合わせ回路を通り、次のフリップフロップに届きます。クロックの最小周期は次のとおりです。
Tmin = tCQ + t論理 + tsu
例:tCQ = 15 ns、最も長い組み合わせ回路の経路が 20 ns、tsu = 5 ns とします。
Tmin = 15 + 20 + 5 = 40 ns なので、fmax = 1 / 40 ns = 25 MHz です。
ホールドの確認には最短の経路を使います。tCQ の最小値が 5 ns で、二つのフリップフロップの間に論理回路がなければ、新しいデータはエッジの 5 ns 後に届きます。th = 3 ns なら、5 ns ≥ 3 ns なので条件を満たします。
よくある間違い
- ラッチをフリップフロップと呼ぶ。ラッチはイネーブルのレベルに反応し、フリップフロップはクロックのエッジに反応します。
- 設計で励起表が必要なときに、特性表を使う。
- NAND ラッチでは入力が負論理で、禁止の組み合わせが 11 ではなく 00 であることを忘れる。
- クロックのエッジちょうどで D を変化させておきながら、確定した結果を期待する。
- 実物のフリップフロップで、非同期のプリセット入力とクリア入力を未接続のままにする。非アクティブなレベルにつないでおく必要があります。
シミュレータで試してみよう
ラッチとフリップフロップの違いは、タイミング図を見ればすぐにわかります。両方を組んで、同じ信号を与えてみましょう。
- NOR ゲートを二つ置き、それぞれの出力をもう一方の入力につなぎます。入力 S と R、それに表示用の LED を二つ追加します。
- S と R を切り替えて、禁止の行も含めた表の四つの行を確かめ、禁止の行では Q と Q が同時に 0 になることを観察します。
- D ラッチと D フリップフロップを置き、両方に同じデータ入力と、同じクロック信号(またはイネーブル信号)をつなぎます。
- タイミング図を開き、クロックが 1 の間に D を何度か変えます。ラッチは変化に追従し、フリップフロップは立ち上がりエッジの値だけを取り込みます。
- J = K = 1 にした JK フリップフロップでも試し、出力の周波数がクロックの半分になることを観察します。
練習問題
- T フリップフロップが Q = 1 から始まり、四つのエッジで T = 1、1、0、1 を受け取ります。Q はどんな値を取りますか。
解答
Q+ = T ⊕ Q より、1⊕1 = 0、1⊕0 = 1、0⊕1 = 1、1⊕1 = 0。並びは 0、1、1、0 です。
- フリップフロップを Q = 1 から Q = 0 に変えるには、J と K をどんな値にすればよいですか。
解答
J = X、K = 1 です。K = 1 かつ J = 0 ならリセット、J = K = 1 ならトグルになります。どちらの場合も Q は 0 になります。
- いま tCQ = 12 ns、tsu = 4 ns で、目標の周波数が 40 MHz だとします。フリップフロップ間の論理回路には、最大でどれだけの遅延が許されますか。
解答
T = 1 / 40 MHz = 25 ns。t論理 ≤ 25 − 12 − 4 = 9 ns。
- D フリップフロップを JK として動作させるための D の式を書いてください。
解答
D = J·Q + K·Q です。これは JK の特性方程式そのものです。