← ブログに戻る順序論理

SR対JKフリップフロップ:順序論理の基礎

JKフリップフロップは、J=K=1をトグルとして再定義することでSRラッチの禁止状態を解決します。両者を比較し、励起表を導き、それぞれからカウンタを作ります。

DennyDenny
読了まで約12分
Chalkboard feature illustration for “SR対JKフリップフロップ:順序論理の基礎”

要約: SRラッチは最も単純な記憶要素ですが、両入力が1のときに禁止状態があります。JKフリップフロップは、内部フィードバック(S=J⋅Q‾S = J\cdot\overline{Q}、R=K⋅QR = K\cdot Q)を使い、J=K=1をトグルとして再定義することでこれを修正します。また、マスタースレーブクロックによりレースアラウンド発振を防ぎます。

加算器やマルチプレクサなどの組合せ回路は、現在の入力だけから出力を作ります。順序論理はメモリを加えます。フリップフロップはクロックサイクルをまたいで状態を保持します。このガイドでは、2つの基礎的な順序部品、SRラッチとJKフリップフロップを比較し、JK設計がSRの重大な欠点をどう取り除くかを示します。

組合せ論理と順序論理

加算器やマルチプレクサのような組合せ回路は、伝播遅延後、現在の入力値によって決まる出力を作ります。物理入力は常に有効なレベルへ駆動しなければなりません。「入力なし」は特別な操作ではなく、浮遊入力は電気的に未定義です。

順序回路は重要な性質、すなわち状態を加えます。出力は現在の入力だけでなく入力履歴にも依存します。つまりメモリを持ちます。フリップフロップはQ=0またはQ=1の状態になり、明示的に変更するよう指示されるまでその状態を維持できます。これが計算を可能にします。状態がなければ、レジスタも、カウンタも、プログラムカウンタも、CPUもありません。

SRラッチ:メモリが始まる場所

SRラッチ(Set-Reset Latch)は、2つの相互結合されたNOR(またはNAND)ゲートから作られる、最も単純な記憶要素です。2つの入力、S(Set)とR(Reset)、そして2つの補数出力、Qと**Q‾\overline{Q}**を持ちます。

相互結合ゲートと真理値表を示すNORベースSRラッチ

SRラッチの真理値表

SRQ(次状態)動作
00Q(変化なし)保持(メモリ)
010リセット(クリア)
101セット(1を保存)
11?無効(禁止)

SRラッチの特性方程式

動作は形式的には次で表されます。

Qnext=S+R‾⋅Q(constraint: S⋅R=0)Q_{next} = S + \overline{R} \cdot Q \quad \text{(constraint: } S \cdot R = 0\text{)}

制約 S⋅R=0S \cdot R = 0 がSRラッチの根本的な弱点です。この式が有効なのは、SとRが同時に’1’でない場合だけです。この制約を破ると禁止状態、つまり両出力が’0’になり、入力を放した後の最終状態は非決定的な競合状態になります。

SRラッチ実演テンプレート

禁止状態が危険な理由

S=R=1では、両方のNORゲートが’0’を出力するよう強制され、Q = Q‾\overline{Q} = 0となります。これは論理的矛盾です。両入力が同時に’0’へ戻ると、両ゲートは’1’を出力しようと競合します。どちらが勝つかは、伝播遅延、温度、製造ばらつきのナノ秒規模の差に依存します。結果は予測不能であり、最悪の場合、出力はメタステーブル状態、すなわち有効な’0’でも有効な’1’でもない中間電圧へ入ることがあります。

JKフリップフロップ:完全な解決策

JKフリップフロップはSRラッチの禁止状態に正面から向き合います。J=K=1J=K=1条件を未定義のままにせず、JK設計はそれをトグル、すなわち各クロックエッジで出力が反転する状態として再定義します。この1つの工夫により、欠点のある記憶要素がデジタル設計で最も用途の広いフリップフロップへ変わります。

オシロスコープを備えたマスタースレーブJKフリップフロップ

JKフリップフロップの真理値表

JKQ(次状態)動作
00Q(変化なし)保持
010リセット
101セット
11Q‾\overline{Q}(反転)トグル

JKフリップフロップの特性方程式

Qnext=(J⋅Q‾)+(K‾⋅Q)Q_{next} = (J \cdot \overline{Q}) + (\overline{K} \cdot Q)

フィードバックにより、ある現在状態に対するセットとリセットの要求は相互排他的になります。Q‾\overline{Q} がJ項をゲートし、QQ がK項をゲートします。これによりSRの禁止入力組合せがなくなります。ただしフィードバックだけでは、レベルセンシティブJK設計のレースアラウンドは防げません。マスタースレーブまたはエッジトリガのタイミングが、外部から見える遷移をサンプリングイベントごとに1回へ制限します。

JKフリップフロップのレッスン

マスタースレーブ・アーキテクチャ

初期のJK設計はレベルトリガであり、レースアラウンド条件を生みました。クロックパルスが十分長くHighなら、トグルした出力がフィードバックされ、同じパルス中にもう一度トグルし、制御不能な発振につながります。

解決策は、2つのSRラッチを直列に使うマスタースレーブアーキテクチャです。

  1. マスタラッチ: クロックがHIGHの間に入力を取り込む。出力はスレーブから分離される。
  2. スレーブラッチ: クロックがLOWへ遷移するとマスタの出力を取り込む。このとき外部Q出力が実際に変わる。

マスタとスレーブは同時に透明にはならないため、出力はクロックサイクルごとに1回だけ変われます。現代の実装では、同じ効果をより効率的に得るためにエッジトリガを使いますが、マスタースレーブの概念を理解すると、JKフリップフロップになぜクロックが必要か、なぜレースアラウンド問題に耐性を持つかを説明できます。

レースアラウンド条件:詳しく見る

レースアラウンド条件は、クロッキング戦略がなぜ非常に重要かを示すため、詳しく注目する価値があります。

J=K=1(トグルモード)の単純なレベルセンシティブJKラッチでは、順序は次のとおりです。

  1. クロックがHIGHになる。出力が0から1へトグルする。
  2. 新しい出力(Q=1)が入力ゲートへフィードバックされる。
  3. クロックはまだHIGHである。ゲート論理は新しい状態を見て再びトグルする。Qは1から0へ戻る。
  4. このサイクルはクロックがHIGHである限り繰り返す。

出力はゲートの伝播遅延周波数で発振し、本質的にリング発振器になります。クロックが下がるときの最終状態は、ゲート遅延に対する正確なパルス幅に依存するため、動作は非決定的です。

digisim.ioで使われるようなエッジトリガJKフリップフロップは、これを完全に取り除きます。フリップフロップはクロック遷移の瞬間にだけJとKをサンプリングします。出力が変わってフィードバックされる時点では、サンプリング窓はすでに閉じています。

励起表:フリップフロップで設計する

順序回路(カウンタや状態機械など)を設計するときは、望む状態遷移から逆向きに作業し、必要な入力を決めます。ここで励起表が不可欠になります。

SRラッチの励起表

QQ(現在)QnextQ_{next}(望み)SR
000X
0110
1001
11X0

(X = ドントケア)

JKフリップフロップの励起表

QQ(現在)QnextQ_{next}(望み)JK
000X
011X
10X1
11X0

JK励起表にはドントケア条件が豊富にあることに注目してください。各遷移に1つのドントケアがあります。SR表ではドントケアが少なく、S⋅R=0S \cdot R = 0 の制約もなお強制しなければなりません。これらの追加ドントケアにより、フリップフロップを駆動する組合せ論理を設計するとき、ブール式を大幅に簡略化できます。実設計でゲート数を最小化する際の具体的な利点です。

包括的な比較

特性SRラッチJKフリップフロップ
入力S(Set)、R(Reset)J、K、クロック
S=R=1 / J=K=1無効(競合状態)トグル(明確に定義)
トリガ方式レベルセンシティブ(非同期)エッジトリガ(同期)
クロックが必要か?いいえ(基本SRラッチ)はい
特性方程式Qnext=S+R‾⋅QQ_{next} = S + \overline{R} \cdot QQnext=JQ‾+K‾QQ_{next} = J\overline{Q} + \overline{K}Q
禁止状態存在する(S=R=1)除去される
励起表のドントケア少ない多い(より良い最適化)
レースアラウンドのリスク該当なし(クロックなし)エッジトリガで除去
実装規模コアラッチは相互結合ゲート2個実装依存。マスタースレーブとエッジトリガ形式には追加の記憶・ゲーティングが必要
主な用途制御状態の保持、スイッチのデバウンスカウンタと教育用状態機械設計
ほかのフリップフロップ型を作れるか?限定的はい(万能)

エッジトリガ:クロックの役割

現代のフリップフロップはエッジトリガです。クロック遷移の正確な瞬間にだけ状態を変えます。これは、入力にいつでも応答するレベルセンシティブSRラッチと根本的に異なります。

オシロスコープを備えたエッジトリガDフリップフロップ

エッジトリガには3つの重要な保証があります。

  1. 定義されたサンプリングイベント: セットアップおよびホールド制約を満たすとき、指定エッジで入力を取り込む。
  2. 時間的フィルタリング: サンプリング窓と重ならないデータグリッチは取り込まれない。ただしクロックグリッチとエッジ近傍のデータ変化は依然としてハザードである。
  3. 合成可能性: 複数のフリップフロップがクロックを共有し、個別のクロックからQへの遅延後に更新できるため、協調したマルチビット状態が可能になる。

SRとJKの間の変換

JKフリップフロップは「万能」と考えられるため、ほかのフリップフロップ型をエミュレートできます。これらの変換を理解すると、両部品への理解が深まります。

SRからJKへの変換: QとQ‾\overline{Q}をフィードバックするANDゲートを加えます。

  • S=J⋅Q‾S = J \cdot \overline{Q}
  • R=K⋅QR = K \cdot Q

フィードバックにより、J=K=1のとき、現在状態に応じてSまたはRの一方だけがアクティブになります。これにより、構造的に禁止SR状態を防ぎながらトグル動作を作ります。

JKからDへの変換: DをJへ、D‾\overline{D}をKへ接続します。

JKからTへの変換: JとKを1つのT入力として結びます。

カウンタ構築:JKフリップフロップを象徴する応用

J=K=1のとき、JKフリップフロップは各クロックエッジでトグルします。これはバイナリカウンタの自然な基本ブロックにします。Q出力で次段のクロックを駆動するJKフリップフロップを4つ連鎖すると、0000から1111までを順に進む4ビットリップルカウンタになります。

リップルカウンタ(非同期)

リップルカウンタでは、各フリップフロップのQ出力が次のフリップフロップのクロック入力を駆動します。各段が次段をトリガするにつれて、カウントがチェーンを「波及」します。

  • FF0はシステムクロックエッジごとにトグルする(周波数 = f/2f/2)。
  • FF1はFF0の遷移ごとにトグルする(周波数 = f/4f/4)。
  • FF2はFF1の遷移ごとにトグルする(周波数 = f/8f/8)。
  • FF3はFF2の遷移ごとにトグルする(周波数 = f/16f/16)。

出力Q3 Q2 Q1 Q0は、各クロックサイクルで1ずつ増える4ビット2進数を表します。トレードオフは、各段が伝播遅延を加えるため、上位ビットが下位ビットより遅く安定することです。各クロックエッジの直後の短い瞬間、カウンタ出力は過渡的に不正な値を表示するかもしれません。高速用途ではこのリップル遅延が問題になるため、すべてのフリップフロップが同じクロックを共有する同期カウンタが好まれます。

同期カウンタ

同期カウンタでは、すべてのフリップフロップがシステムクロックを共有します。各フリップフロップのJおよびK入力は、現在状態から導かれる組合せ論理で駆動されます。3ビット同期アップカウンタでは、次のとおりです。

  • FF0:J0=K0=1(常にトグル)。
  • FF1:J1=K1=Q0(Q0=1のときだけトグル)。
  • FF2:J2=K2=Q0 ⋅\cdot Q1(Q0とQ1がともに1のときだけトグル)。

すべての段が同じクロックエッジをサンプリングし、クロックを通した段間のリップル依存をなくします。それでも出力にはクロックからQへの遅延があり、組合せイネーブル論理にも遅延があり、異なるビットが物理的にまったく同時に遷移する必要はありません。

Tフリップフロップ周波数分周器

非同期カウンタのレッスン

エッジトリガDフリップフロップのテンプレート

設計例:励起表を使う

励起表の実用的な価値を示すため、JKフリップフロップを使い、0、1、2、3、0、1、…と数える単純な2ビットカウンタを設計すると考えてください。

ステップ1:状態表。 各組合せについて現在状態と望む次状態を列挙します。

現在Q1現在Q0次Q1次Q0
0001
0110
1011
1100

ステップ2:励起表を適用する。 各フリップフロップについて必要なJとK入力を決めます。

FF0(Q0)では、遷移は0->1、1->0、0->1、1->0です。JK励起表より、すべての場合にJ0=1、K0=1です。したがってJ0=K0=1であり、FF0は常にトグルします。

FF1(Q1)では、遷移は0->0、0->1、1->1、1->0です。励起表より、J1=0/K1=X、J1=1/K1=X、J1=X/K1=0、J1=X/K1=1です。カルノー図から、J1=Q0かつK1=Q0です。

結果: 2ビット同期カウンタにはJ0=K0=1とJ1=K1=Q0が必要です。フリップフロップ自体と、Q0からFF1のJおよびK入力への1本の配線以外に追加ゲートは必要ありません。豊富なドントケアによりこの最小化は容易になりました。SRではなくJKを選ぶ直接の利点です。

応用の要約

応用部品理由
スイッチのデバウンスSRラッチ単純でクロック不要。最初の接点が状態をセットする
SRAMの概念相互結合双安定フィードバック高密度SRAMは通常、パッケージ済みSRラッチではなく、相互結合インバータとアクセス用トランジスタを使う
バイナリカウンタJKフリップフロップトグルモードで自然に数えられる
周波数分周器JKまたはTフリップフロップ各段がクロックを2分周する
状態機械(FSM)JKフリップフロップドントケア条件が論理を簡略化する
CPUレジスタDフリップフロップ最も単純なデータ取り込み、禁止状態なし
シフトレジスタDフリップフロップ段間のシリアルデータ移動

自分で試す

digisim.ioで次の回路を試してください。

  1. SRラッチ: 2つのNORゲートから作り、4つすべての入力組合せを試験する。禁止状態を注意深く観察する。
  2. JKトグルモード: J=K=1をクロックと配線し、オシロスコープで各エッジにQがトグルする様子を見る。
  3. 3ビットリップルカウンタ: トグルモードのJKフリップフロップを3つ連鎖する。Q出力をオシロスコープへ接続し、2進カウントパターンを観察する。
  4. SRからJKへの変換: SRラッチ、ANDゲート2個、クロックからJKフリップフロップを作る。J=K=1が禁止状態ではなくきれいなトグルを作ることを検証する。
  5. 励起表の演習: JKフリップフロップを使うmod-6カウンタを設計する。励起表を使い、各フリップフロップのJおよびK入力論理を導く。

これらの基本要素から完全なFSMを作るにはカウンタと状態機械へ続き、レジスタで一般に使われる同期記憶要素についてはDフリップフロップのリファレンスを開いてください。

アイデアを実際に動く回路にしましょう。