PREVIEW
クロック信号とデータ入力を備えた D フリップフロップの図で、エッジトリガ・キャプチャを示している。

基本的なエッジトリガ・メモリ要素である D フリップフロップは、現代の同期デジタル設計の礎であり、予測可能なデータ・キャプチャと記憶を可能にします。

D フリップフロップ:デジタル設計におけるエッジトリガ・メモリ

D フリップフロップはクロックの単一エッジで D 入力をキャプチャします ── 同期レジスタが必要とする「スナップショット」挙動。タイミングと準安定性も解説します。

TL;DR: D フリップフロップはクロックのアクティブ・エッジが立ち上がる瞬間にデータ (D) 入力にあるものをキャプチャし、次のアクティブ・エッジまでその値を保持します。特性方程式は Q(t+1)=DQ(t+1) = D です。イネーブルが High の間透過する D ラッチ と異なり、D フリップフロップのキャプチャ窓は実質的にゼロ ── これが同期デジタル設計の礎たる理由です。

組合せ論理ゲート ── ANDORNOT ── は計算しますが、記憶しません。状態を保持するためには、メモリ要素が必要です。シンプルな D ラッチ は記憶を提供しますが、決定的な欠陥があります:透過性です。Enable を High に保たれた D ラッチは開いた窓のように振る舞います ── 入力上のあらゆるグリッチが直接出力へと駆け抜けます。

堅牢で予測可能なシステムには、窓ではなくカメラのように振る舞う部品 ── つまり一瞬だけ完璧なスナップショットを撮るような部品が必要です。それが D_FLIP_FLOP、現代の同期設計の礎です。

D_FLIP_FLOP コンポーネント図

D_FLIP_FLOP:定義

D_FLIP_FLOP は同期式の 1 ビット・メモリ要素です。「D」は「Data(データ)」を表し、その主要な目的はデータラインに存在する値をキャプチャすることです。レベル感応型の同類である D_LATCH と異なり、D_FLIP_FLOP はクロック信号の遷移という厳格な命令の下で動作します。

digisim.io 環境では D_FLIP_FLOP は シーケンシャル・ロジック(Sequential Logic) カテゴリにあります。マスターすべき必須端子は 4 つあります:

  1. D (Data):格納したいビット値(0 または 1)を保持する入力。
  2. CLK (Clock):制御信号。フリップフロップはこの入力上で特定の遷移 ── エッジ ── を見たときにのみ動作します。
  3. Q:現在格納されているビットを反映する主出力。
  4. Q\overline{Q} (Q バー):常に Q の論理的逆を出す反転出力。

D_FLIP_FLOP の魔法は エッジトリガ 挙動にあり、レベル感応型デバイスである D_LATCH との区別を理解することが決定的に重要です:

  • レベル感応型(D ラッチ):Enable が High である 全期間 の間、出力は入力に追従します。「キャプチャ窓」は Enable パルスの幅と等しいです。窓の間に発生したあらゆるグリッチが通過します。
  • エッジトリガ型(D フリップフロップ):出力はクロックの 瞬間的な遷移 ── 立ち上がりエッジ(Low から High へ)または立ち下がりエッジ(High から Low へ)── でのみ入力をキャプチャします。キャプチャ窓は実質的にゼロ幅です。エッジ間の入力は完全に無視されます。

この区別こそが、基本的なシーケンシャル・ロジックから堅牢な同期設計への根本的な転換です。D ラッチは透過的ですが、D フリップフロップは精密に定義された一瞬を除いて不透明です。

D_FLIP_FLOP の動作を試す

真理値表:瞬間をキャプチャする

正エッジトリガ型 D_FLIP_FLOP の挙動は、シンプルだが強力な真理値表で要約できます。矢印 (\uparrow) は立ち上がりクロック・エッジ ── 同期システムにおいて本当に重要な唯一の瞬間 ── を表します。

CLKDQnextQ_{next}動作
\uparrow00「0」をキャプチャ
\uparrow11「1」をキャプチャ
0XQ状態を保持(静的)
1XQ状態を保持(静的)
\downarrowXQ状態を保持(立ち下がりエッジは無視)

D 列の「X」は「ドントケア」記号です。CLOCK が遷移していない限り、D 入力は出力 Q に何の影響も及ぼさないことを意味します。出力は最後にキャプチャされた値を単に維持します。これが「エッジトリガ」と呼ぶ理由です。回路をデバッグしていてスイッチを切り替えても出力が変化しないなら、CLOCK を確認してください。パルスしていますか? していないなら、D_FLIP_FLOP は設計どおり、まさに何もしていないだけなのです。

基礎となるロジック:特性方程式

D_FLIP_FLOP はゲートから構築できます ── 通常は 2 つの D_LATCH コンポーネントによるマスター・スレーブ構成 ── ものの、その挙動は特性方程式によって最も優美に記述されます。この方程式は現在の入力 D に基づいて、出力の次状態 Q(t+1)Q(t+1) を定義します。

D_FLIP_FLOP の場合、方程式は美しいほど単純です:

Q(t+1)=DQ(t+1) = D

この方程式は次のように読みます:「次のクロック・エッジ後の Q の値は、そのクロック・エッジ時の D の値そのものになる」と。

D_FLIP_FLOP はデジタル世界の「コピー猫」です。論理を実行することなく、ただ覚えるだけです。しかしこれらのコピー猫を連結することで、4 ビット・レジスタシフトレジスタ、そして最終的には CPU のメモリ階層全体を作り出すのです。

よくある落とし穴:準安定性の地雷原

フリップフロップは完璧なデジタル・デバイスのように見えますが、それはアナログ世界に住んでいます。データを精密な瞬間にキャプチャするという約束には、2 つのタイミング・パラメータで定義される厳格な契約があります:セットアップ・タイムホールド・タイム

  1. セットアップ・タイム (tsut_{su}):アクティブ・クロック・エッジが到着する に D 入力が安定していなければならない最小時間。フリップフロップはデータを「見て」キャプチャ用に内部ゲートを準備するためにこの時間を必要とします。
  2. ホールド・タイム (tht_h):アクティブ・クロック・エッジが過ぎた に D 入力が安定していなければならない最小時間。内部回路は値を確実にロックするためにこの時間を必要とします。

この契約に違反するとどうなるか? 答えは 準安定性 (metastability) の領域に入る、です。

急峻な屋根の頂点に完璧にバランスする球を想像してください。それは左(0)に落ちようとするか、右(1)に落ちようとしますが、短い予測不能な瞬間、中央でぐらつきます。デジタル回路で D 入力がクリティカルなセットアップ・ホールド窓の中で変化すると、出力 Q は次のいずれかの障害モードを示すことがあります:

  1. 中間電圧:Q が有効な HIGH と LOW のしきい値の間の電圧で安定します。下流のゲートはこれを異なって解釈する可能性があり、同じ信号から「0」を読むものと「1」を読むものが現れます。
  2. 長時間の発振:内部フィードバック・ループが状態間で発振し、最終的に解決しますが、解決時間は決定的ではなく確率的です。
  3. 遅延した解決:Q は最終的に有効な状態に落ち着きますが、遅延がクロック周期を超え、次段が古いまたは無効なデータをサンプリングします。

非同期入力(システムクロックとタイミング関係を持たない信号)に対する標準的な工学的対策は 2 段同期化器 です:システムクロックでクロックされた直列の 2 つの D_FLIP_FLOP。最初のフリップフロップは準安定状態になるかもしれませんが、2 つめがその出力をサンプリングする前に解決するためのフルクロック周期の時間があります。これにより準安定性が伝播する確率が天文学的に低くまで減らされます。

現代の CPU のような複雑なシステムでは、解決されない準安定イベント 1 つで壊滅的障害を引き起こす可能性があります。これが、digisim.io で OSCILLOSCOPE_8CH を使ってタイミング関係を検証する理由です ── データがクロック・エッジの到来前に十分に安定していることを保証するためです。

対話型シミュレーション:エッジトリガ D_FLIP_FLOP の構築

理論からキャンバスへ移りましょう。レベル感応型ラッチとエッジトリガ・フリップフロップの違いを真に理解するには、両者を並べて見る必要があります。

D_FLIP_FLOP エッジトリガ・テンプレート

ステップバイステップのシミュレーション・ガイド

  1. ワークスペースを開く:digisim.io エディタ に移動します。
  2. コンポーネントを配置:
  • D_FLIP_FLOP をキャンバスにドラッグします。
  • D 入力用に INPUT_SWITCH を追加します。
  • CLK 入力用に CLOCK コンポーネントを追加します。
  • Q 出力に OUTPUT_LIGHT を追加します。
  1. テスト:
  • INPUT_SWITCH を「1」にします。OUTPUT_LIGHT が消えたままなのを観察してください。
  • CLOCK をトグルします。クロックが 0 から 1 に行く瞬間、ライトがつきます。
  • 今度はクロックがまだ High (1) の間に INPUT_SWITCH を「0」にします。ライトが点いたままなのに気づくでしょう! これが D_LATCH との重要な違いです。フリップフロップはもう「透過的」ではありません。立ち上がりエッジで「1」をキャプチャし、入力が変化したという事実を今や無視しているのです。
  1. OSCILLOSCOPE による検証:
  • OSCILLOSCOPE のチャンネル 1 を CLOCK に接続します。
  • チャンネル 2 を Q 出力に接続します。
  • シミュレーションを実行し、波形を観察します。Q 出力はクロックの立ち上がりエッジと完全に同期してのみ遷移することが見えるはずです。

エッジトリガ・テンプレートを開く

実世界の応用:レジスタから周波数分周器へ

D_FLIP_FLOP は学術的演習にとどまりません ── これは今までに使ったあらゆるデジタル機器の根本的な構成要素です。

1. CPU レジスタとアキュムレータ

64 ビット・プロセッサには多数のレジスタが含まれています。64 ビット・レジスタは本質的に 64 個の D_FLIP_FLOP コンポーネントの配列で、すべてが共通の CLOCK ラインを共有しています。CPU が結果を「格納」する命令を実行するとき、データを DATA_BUS_8BIT(または 64 ビット相当)に置き、クロックをパルスします。その単一の同期した瞬間に、値全体がキャプチャされます。これがまさに、CPU アーキテクチャ・レッスン(レッスン 63〜70)で扱う ACCUMULATOR や INSTRUCTION_REGISTER の機能の仕方です。

2. 周波数分周器

D_FLIP_FLOP の反転出力 (Q\overline{Q}) を自分の D 入力に戻して接続すると、トグル回路が作れます。

立ち上がりクロック・エッジごとに、フリップフロップは現在の状態の反対をキャプチャします。Q が 0 だったら 1 になります。1 だったら 0 になります。Q 出力でフルサイクル(0 \rightarrow 1 \rightarrow 0)を完了するのに 2 クロック・パルス必要なので、出力周波数は入力クロック周波数のちょうど半分になります。これがデジタル時計や直列通信のボーレート・ジェネレータの基礎です。

周波数分周を試す

同期設計が勝つ理由

D_FLIP_FLOP が標準になる前は、エンジニアたちは異なる速度でゲートを通過する信号により「グリッチ」や「レース」を引き起こす「非同期」設計に苦しんでいました。

D_FLIP_FLOP を使うことで、私たちはグローバルなハートビート ── CLOCK ── を強制します。組合せ論理(AND と OR ゲート)が雑然としていて伝搬遅延 (tpdt_{pd}) を持っていても、次のクロック・エッジが到来する前に落ち着きさえすれば構わない、ということを許します。D_FLIP_FLOP は障壁として機能し、その雑然さがシステムを通じて伝播するのを防ぎます。データのための「安全な港」を作り出すのです。

これがカリキュラムでシーケンシャル・ロジックに多大な時間を費やす理由です(レッスン 41〜62)。D_FLIP_FLOP をマスターすると、コンピュータの中で時間そのものがどう管理されているかが理解できるようになります。

まとめと次のステップ

ここまでで多くの内容を扱ってきました。ラッチの「透過的」な危険から D_FLIP_FLOP の「スナップショット」の精度へと移り、特性方程式 Q(t+1)=DQ(t+1) = D を見て、準安定性とタイミング制約という現実に直面しました。

シーケンシャル・ロジックの次のステップとしては、JK フリップフロップ(トグル、セット、リセット・モードを追加)を読み、続いて SR と JK フリップフロップ を読むとよいでしょう。たった今学んだ契約の背後にあるタイミングの物理学については、隠れたクロック を読んでください。

チャレンジ: 4 ビット・レジスタを構築してみてください。4 つの D_FLIP_FLOP コンポーネントを使い、すべての CLK ピンを単一の CLOCK に接続し、4 ビット・ニブル(1011 など)を同時に格納します。SimCast で動作中の回路を録画してみてください ── 肉眼では捉えきれないタイミング問題を発見する最良の方法です。

D_FLIP_FLOP コンポーネントを開く または 新しい回路を始める