要約: SRラッチは最も単純な記憶要素ですが、両入力が1のときに禁止状態があります。JKフリップフロップは、内部フィードバック(、)を使い、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と****を持ちます。

SRラッチの真理値表
| S | R | Q(次状態) | 動作 |
|---|---|---|---|
| 0 | 0 | Q(変化なし) | 保持(メモリ) |
| 0 | 1 | 0 | リセット(クリア) |
| 1 | 0 | 1 | セット(1を保存) |
| 1 | 1 | ? | 無効(禁止) |
SRラッチの特性方程式
動作は形式的には次で表されます。
制約 がSRラッチの根本的な弱点です。この式が有効なのは、SとRが同時に’1’でない場合だけです。この制約を破ると禁止状態、つまり両出力が’0’になり、入力を放した後の最終状態は非決定的な競合状態になります。

禁止状態が危険な理由
S=R=1では、両方のNORゲートが’0’を出力するよう強制され、Q = = 0となります。これは論理的矛盾です。両入力が同時に’0’へ戻ると、両ゲートは’1’を出力しようと競合します。どちらが勝つかは、伝播遅延、温度、製造ばらつきのナノ秒規模の差に依存します。結果は予測不能であり、最悪の場合、出力はメタステーブル状態、すなわち有効な’0’でも有効な’1’でもない中間電圧へ入ることがあります。
JKフリップフロップ:完全な解決策
JKフリップフロップはSRラッチの禁止状態に正面から向き合います。条件を未定義のままにせず、JK設計はそれをトグル、すなわち各クロックエッジで出力が反転する状態として再定義します。この1つの工夫により、欠点のある記憶要素がデジタル設計で最も用途の広いフリップフロップへ変わります。

JKフリップフロップの真理値表
| J | K | Q(次状態) | 動作 |
|---|---|---|---|
| 0 | 0 | Q(変化なし) | 保持 |
| 0 | 1 | 0 | リセット |
| 1 | 0 | 1 | セット |
| 1 | 1 | (反転) | トグル |
JKフリップフロップの特性方程式
フィードバックにより、ある現在状態に対するセットとリセットの要求は相互排他的になります。 がJ項をゲートし、 がK項をゲートします。これによりSRの禁止入力組合せがなくなります。ただしフィードバックだけでは、レベルセンシティブJK設計のレースアラウンドは防げません。マスタースレーブまたはエッジトリガのタイミングが、外部から見える遷移をサンプリングイベントごとに1回へ制限します。

マスタースレーブ・アーキテクチャ
初期のJK設計はレベルトリガであり、レースアラウンド条件を生みました。クロックパルスが十分長くHighなら、トグルした出力がフィードバックされ、同じパルス中にもう一度トグルし、制御不能な発振につながります。
解決策は、2つのSRラッチを直列に使うマスタースレーブアーキテクチャです。
- マスタラッチ: クロックがHIGHの間に入力を取り込む。出力はスレーブから分離される。
- スレーブラッチ: クロックがLOWへ遷移するとマスタの出力を取り込む。このとき外部Q出力が実際に変わる。
マスタとスレーブは同時に透明にはならないため、出力はクロックサイクルごとに1回だけ変われます。現代の実装では、同じ効果をより効率的に得るためにエッジトリガを使いますが、マスタースレーブの概念を理解すると、JKフリップフロップになぜクロックが必要か、なぜレースアラウンド問題に耐性を持つかを説明できます。
レースアラウンド条件:詳しく見る
レースアラウンド条件は、クロッキング戦略がなぜ非常に重要かを示すため、詳しく注目する価値があります。
J=K=1(トグルモード)の単純なレベルセンシティブJKラッチでは、順序は次のとおりです。
- クロックがHIGHになる。出力が0から1へトグルする。
- 新しい出力(Q=1)が入力ゲートへフィードバックされる。
- クロックはまだHIGHである。ゲート論理は新しい状態を見て再びトグルする。Qは1から0へ戻る。
- このサイクルはクロックがHIGHである限り繰り返す。
出力はゲートの伝播遅延周波数で発振し、本質的にリング発振器になります。クロックが下がるときの最終状態は、ゲート遅延に対する正確なパルス幅に依存するため、動作は非決定的です。
digisim.ioで使われるようなエッジトリガJKフリップフロップは、これを完全に取り除きます。フリップフロップはクロック遷移の瞬間にだけJとKをサンプリングします。出力が変わってフィードバックされる時点では、サンプリング窓はすでに閉じています。
励起表:フリップフロップで設計する
順序回路(カウンタや状態機械など)を設計するときは、望む状態遷移から逆向きに作業し、必要な入力を決めます。ここで励起表が不可欠になります。
SRラッチの励起表
| (現在) | (望み) | S | R |
|---|---|---|---|
| 0 | 0 | 0 | X |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | X | 0 |
(X = ドントケア)
JKフリップフロップの励起表
| (現在) | (望み) | J | K |
|---|---|---|---|
| 0 | 0 | 0 | X |
| 0 | 1 | 1 | X |
| 1 | 0 | X | 1 |
| 1 | 1 | X | 0 |
JK励起表にはドントケア条件が豊富にあることに注目してください。各遷移に1つのドントケアがあります。SR表ではドントケアが少なく、 の制約もなお強制しなければなりません。これらの追加ドントケアにより、フリップフロップを駆動する組合せ論理を設計するとき、ブール式を大幅に簡略化できます。実設計でゲート数を最小化する際の具体的な利点です。
包括的な比較
| 特性 | SRラッチ | JKフリップフロップ |
|---|---|---|
| 入力 | S(Set)、R(Reset) | J、K、クロック |
| S=R=1 / J=K=1 | 無効(競合状態) | トグル(明確に定義) |
| トリガ方式 | レベルセンシティブ(非同期) | エッジトリガ(同期) |
| クロックが必要か? | いいえ(基本SRラッチ) | はい |
| 特性方程式 | ||
| 禁止状態 | 存在する(S=R=1) | 除去される |
| 励起表のドントケア | 少ない | 多い(より良い最適化) |
| レースアラウンドのリスク | 該当なし(クロックなし) | エッジトリガで除去 |
| 実装規模 | コアラッチは相互結合ゲート2個 | 実装依存。マスタースレーブとエッジトリガ形式には追加の記憶・ゲーティングが必要 |
| 主な用途 | 制御状態の保持、スイッチのデバウンス | カウンタと教育用状態機械設計 |
| ほかのフリップフロップ型を作れるか? | 限定的 | はい(万能) |
エッジトリガ:クロックの役割
現代のフリップフロップはエッジトリガです。クロック遷移の正確な瞬間にだけ状態を変えます。これは、入力にいつでも応答するレベルセンシティブSRラッチと根本的に異なります。

エッジトリガには3つの重要な保証があります。
- 定義されたサンプリングイベント: セットアップおよびホールド制約を満たすとき、指定エッジで入力を取り込む。
- 時間的フィルタリング: サンプリング窓と重ならないデータグリッチは取り込まれない。ただしクロックグリッチとエッジ近傍のデータ変化は依然としてハザードである。
- 合成可能性: 複数のフリップフロップがクロックを共有し、個別のクロックからQへの遅延後に更新できるため、協調したマルチビット状態が可能になる。
SRとJKの間の変換
JKフリップフロップは「万能」と考えられるため、ほかのフリップフロップ型をエミュレートできます。これらの変換を理解すると、両部品への理解が深まります。
SRからJKへの変換: QとをフィードバックするANDゲートを加えます。
フィードバックにより、J=K=1のとき、現在状態に応じてSまたはRの一方だけがアクティブになります。これにより、構造的に禁止SR状態を防ぎながらトグル動作を作ります。
JKからDへの変換: DをJへ、をKへ接続します。
JKからTへの変換: JとKを1つのT入力として結びます。
カウンタ構築:JKフリップフロップを象徴する応用
J=K=1のとき、JKフリップフロップは各クロックエッジでトグルします。これはバイナリカウンタの自然な基本ブロックにします。Q出力で次段のクロックを駆動するJKフリップフロップを4つ連鎖すると、0000から1111までを順に進む4ビットリップルカウンタになります。
リップルカウンタ(非同期)
リップルカウンタでは、各フリップフロップのQ出力が次のフリップフロップのクロック入力を駆動します。各段が次段をトリガするにつれて、カウントがチェーンを「波及」します。
- FF0はシステムクロックエッジごとにトグルする(周波数 = )。
- FF1はFF0の遷移ごとにトグルする(周波数 = )。
- FF2はFF1の遷移ごとにトグルする(周波数 = )。
- FF3はFF2の遷移ごとにトグルする(周波数 = )。
出力Q3 Q2 Q1 Q0は、各クロックサイクルで1ずつ増える4ビット2進数を表します。トレードオフは、各段が伝播遅延を加えるため、上位ビットが下位ビットより遅く安定することです。各クロックエッジの直後の短い瞬間、カウンタ出力は過渡的に不正な値を表示するかもしれません。高速用途ではこのリップル遅延が問題になるため、すべてのフリップフロップが同じクロックを共有する同期カウンタが好まれます。
同期カウンタ
同期カウンタでは、すべてのフリップフロップがシステムクロックを共有します。各フリップフロップのJおよびK入力は、現在状態から導かれる組合せ論理で駆動されます。3ビット同期アップカウンタでは、次のとおりです。
- FF0:J0=K0=1(常にトグル)。
- FF1:J1=K1=Q0(Q0=1のときだけトグル)。
- FF2:J2=K2=Q0 Q1(Q0とQ1がともに1のときだけトグル)。
すべての段が同じクロックエッジをサンプリングし、クロックを通した段間のリップル依存をなくします。それでも出力にはクロックからQへの遅延があり、組合せイネーブル論理にも遅延があり、異なるビットが物理的にまったく同時に遷移する必要はありません。



設計例:励起表を使う
励起表の実用的な価値を示すため、JKフリップフロップを使い、0、1、2、3、0、1、…と数える単純な2ビットカウンタを設計すると考えてください。
ステップ1:状態表。 各組合せについて現在状態と望む次状態を列挙します。
| 現在Q1 | 現在Q0 | 次Q1 | 次Q0 |
|---|---|---|---|
| 0 | 0 | 0 | 1 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 1 |
| 1 | 1 | 0 | 0 |
ステップ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で次の回路を試してください。
- SRラッチ: 2つのNORゲートから作り、4つすべての入力組合せを試験する。禁止状態を注意深く観察する。
- JKトグルモード: J=K=1をクロックと配線し、オシロスコープで各エッジにQがトグルする様子を見る。
- 3ビットリップルカウンタ: トグルモードのJKフリップフロップを3つ連鎖する。Q出力をオシロスコープへ接続し、2進カウントパターンを観察する。
- SRからJKへの変換: SRラッチ、ANDゲート2個、クロックからJKフリップフロップを作る。J=K=1が禁止状態ではなくきれいなトグルを作ることを検証する。
- 励起表の演習: JKフリップフロップを使うmod-6カウンタを設計する。励起表を使い、各フリップフロップのJおよびK入力論理を導く。
これらの基本要素から完全なFSMを作るにはカウンタと状態機械へ続き、レジスタで一般に使われる同期記憶要素についてはDフリップフロップのリファレンスを開いてください。



