← ブログに戻る順序論理

順序論理を極める:Dラッチの仕組みとシミュレーション

Dラッチはゲート付きSRコアを1入力の記憶回路へ変えます。方程式を導出し、透過性を理解し、記号だけでは見えないタイミング上の制約を学びます。

DennyDenny
読了まで約10分
Chalkboard feature illustration for “順序論理を極める:Dラッチの仕組みとシミュレーション”

要約: Dラッチは1ビットを記憶し、Qnext=(ED)+(E‾Q)Q_{next}=(E D)+(\overline{E}Q)に従います。EnableがHIGHのとき、Qは伝搬遅延後にDへ追従します。EnableがLOWのとき、Qは保持されます。DとD‾\overline Dをゲートすることで、通常のデータ入力がセットとリセットを同時にアサートすることを防げますが、物理的なラッチには依然としてセットアップ/ホールド要件があり、閉じるエッジ付近ではメタステーブル状態になる可能性があります。

順序論理はしばしばSRラッチから始まります。2つの独立した制御入力は、無効なアサートの組合せを許します。ゲート付きDラッチは、それらの制御を1つのデータ入力とその補数から導き、通常動作中はその組合せを取り除くとともに、新しいデータを取り込める時点を明示します。

D_LATCHコンポーネント図

D_LATCHを分解する:何であり、なぜ重要なのか

本質的にD_LATCHは、SR構造から導かれるレベル感応型の記憶素子です。ブールモデルでは、入力のゲート処理によりSetとResetは相互排他的に保たれます。これは組合せ論理とエッジトリガの記憶素子の間に位置します。ゲートは現在の入力に依存する一方、ラッチは以前の値を保持できます。

このコンポーネントには、主な入力が2つ、出力が2つあります。

  • D(データ): ラッチが記憶すべき値(0または1)を決める単一の入力です。
  • E(イネーブル): 多くの場合「E」または「G」(ゲート)と表記されるこの入力は、制御スイッチとして働きます。ラッチがD入力に注意を向けるタイミングを決めます。
  • Q: 記憶したデータを反映する主出力です。
  • Q‾\overline{Q}: 記憶データの補数(反転)出力です。

この動作は、Enable信号の状態に基づく2つの異なるモードで定義されます。E=1E = 1のとき、ラッチは透過モードです。出力Qは単純にD入力の状態へ追従します。Dが変化すれば、Qもほぼ即座に変化します。E=0E = 0のとき、ラッチはラッチモードに入ります。Q出力はD入力を完全に無視し、Eが1から0へ遷移する直前の最後の値を保持します。

D_LATCHの動作を確認する

技術仕様と真理値表

D_LATCHを理解するには、記号の向こう側にある状態遷移を支配する論理まで掘り下げる必要があります。真理値表は、現在の入力に基づいてQの次状態(QnextQ_{next})を明確に定義します。Eが0の場合、D入力は無関係であり、「ドントケア」を表す「X」で示します。

E(イネーブル)D(データ)QnextQ_{next}動作
0XQQ保持(ラッチ)
100リセット(透過)
111セット(透過)

特性方程式

この動作は、D_LATCHの特性方程式で数学的に表せます。この方程式は回路動作の正式な定義であり、より大きな順序回路設計でブール簡略化を行う際に不可欠です。

Qnext=(E⋅D)+(E‾⋅Q)Q_{next} = (E \cdot D) + (\overline{E} \cdot Q)

これを第一原理から導出しましょう。D_LATCHの内部はゲート付きSRラッチであり、次のようになります。

  • S=E⋅DS = E \cdot D
  • R=E⋅D‾R = E \cdot \overline{D}

SRラッチの特性方程式はQnext=S+R‾⋅QQ_{next} = S + \overline{R} \cdot Qです。代入すると次のようになります。

Qnext=(E⋅D)+(E⋅D‾)‾⋅QQ_{next} = (E \cdot D) + \overline{(E \cdot \overline{D})} \cdot Q

ド・モルガンの法則を適用すると、(E⋅D‾)‾=E‾+D\overline{(E \cdot \overline{D})} = \overline{E} + Dです。したがって、次のようになります。

Qnext=(E⋅D)+(E‾+D)⋅Q=(E⋅D)+(E‾⋅Q)+(D⋅Q)Q_{next} = (E \cdot D) + (\overline{E} + D) \cdot Q = (E \cdot D) + (\overline{E} \cdot Q) + (D \cdot Q)

(E⋅D)(E \cdot D)はDとQの両方が関係する場合をすでに覆っているため、(D⋅Q)(D \cdot Q)項はブール簡略化(コンセンサス定理)により吸収され、すっきりした結果が残ります。

Qnext=(E⋅D)+(E‾⋅Q)Q_{next} = (E \cdot D) + (\overline{E} \cdot Q)

これを論理的な構成要素に分けると、次のとおりです。

  • E⋅DE \cdot D項は透過性を表します。Enableが高い場合、出力はDの値になります。
  • E‾⋅Q\overline{E} \cdot Q項は記憶を表します。Enableが低い場合、出力は現在の状態Qを維持します。
  • この方程式は、見方を変えればマルチプレクサです。Enable信号が新しいデータと記憶済みの値のどちらを選ぶかを決めます。

内部の論理:SRからDへ

D_LATCHは、工夫を加えた「ゲート付きSR_LATCH」と考えられます。内部ゲート構造を見ると、D入力は「Set」側へ直接送り、反転したD入力(NOTゲート経由)は「Reset」側へ送ります。これにより、回路がイネーブルのとき、SとRは常に反対になります。

  • S=E⋅DS = E \cdot D
  • R=E⋅D‾R = E \cdot \overline{D}

E=1E=1では、D=1D=1がSetを、D=0D=0がResetを生成します。したがって通常のデータ経路は両方を同時に指示できません。E=0E=0では、両方の制御がデアサートされ、コアは保持します。現実のゲートは同時には切り替わりません。閉じるタイミング付近でDまたはEnableが遷移するとタイミング要件に違反し得るため、DラッチはSR真理値表上の誤りを避けても、メタステーブル状態をなくすわけではありません。

SR_LATCHコンポーネント図

よくある落とし穴:透過性の危険

D_LATCHの最大の強みである透過性は、複雑な高速システムでは最大の弱点にもなります。これは、単純な回路からCPU設計へ進む多くの学習者がつまずく重大な落とし穴です。

Enable信号が高い全期間にわたり出力Qは入力Dに追従するため、D線上のノイズ、グリッチ、意図しない信号変化はすべて直接出力に通り抜けます。これをレベル感応の動作と呼びます。

Enable信号を窓だと想像してください。E=1E=1では、窓は大きく開いています。飛ぶ鳥や落ち葉(「グリッチ」)を含め、外で起きるすべてのこと(D入力)をリアルタイムで見られます。E=0E=0になると、窓は瞬時にすりガラスで覆われ、最後に見えたものだけのスナップショットを映します。

実際に透過性が危険な理由: あるD_LATCHの出力が組合せ論理を通り、同じラッチまたは別のラッチの入力へ戻るシステムを考えてみましょう。Enableが高い間、出力の変化は直ちに論理を伝搬して入力に現れ、入力は再び出力を変化させます。これは組合せ論理を通るフィードバック経路を作り、次の原因となり得ます。

  1. 1つのイネーブルウィンドウ内での意図しない複数回の状態変化。
  2. データ線上の過渡的なスパイクがQへ通り、下流回路を壊すグリッチの伝搬。
  3. 最終的にラッチされる値がEnableの立下りの正確な瞬間に依存するタイミングの予測不能性。これは検証にとって悪夢です。

多くの同期設計では、外から見える取り込みがクロックエッジに対応するDフリップフロップを使います。別の高性能設計では、タイムボローイングのために意図的に2相ラッチを使います。どちらの選択でもタイミング解析は不要になりません。それぞれが異なるセットアップ、ホールド、透過性、クロッキングの制約を定義します。

オシロスコープによる検証:信号を見る

D_LATCHのタイミングを本当に理解するには、波形を見る必要があります。digisim.ioでは、これらのタイミング関係をデバッグする最高の味方がOSCILLOSCOPEです。

OSCILLOSCOPEをE、D、Qピンに接続すると、いくつかの重要な挙動に気付きます。

  1. 伝搬遅延(tpdt_{pd}): 物理的なモデルまたは遅延を考慮するモデルでは、透過中にDが変化してからQが応答するまでに時間が見られます。理想的な論理シミュレータはこの遅延をモデル化しない場合があります。
  2. ラッチの瞬間: Eが1から0へ下がる瞬間のQ線を観察してください。その正確なマイクロ秒にDが持っていた値が、以後Dがどう変化してもQに保持されます。
  3. グリッチの取り込み: Eが高い間にDを素早く切り替えると、それらのパルスがQに鏡写しのように現れます。Eが低い間にDを切り替えると、OSCILLOSCOPE上のQ線は平坦で安定した水平線のままです。

オシロスコープのデモを開く

実世界での用途:ブレッドボードの先へ

D_LATCHは単なる学術的な練習ではありません。日常的に使う機器のアーキテクチャに見られる、主力の構成要素です。

1. CPUパイプラインレジスタ

パイプラインはステージ間に状態を置くため、異なる命令が同時に異なるステージを占有できます。クロッキング手法により、これらの境界にはエッジトリガのフリップフロップ、または交互のラッチ相が使われます。ラッチベースのパイプラインは境界をまたいで時間を借りられますが、透過性、非重複、ホールドタイミングを慎重に制御する必要があります。

2. アドレスのデマルチプレクシング(Intel 8086の例)

集積回路上の物理ピンを節約するため、Intel 8085や8086のような初期のマイクロプロセッサは、多重化されたアドレス/データバスを使っていました。マシンサイクルのある部分ではピンがメモリアドレスを運び、別の部分ではデータを運びます。

技術者は、有名な74LS373オクタル透過ラッチのような外部D_LATCHを使い、これらの信号を「デマルチプレクス」しました。プロセッサはバスへアドレスを置き、**ALE(Address Latch Enable)**という信号をパルスします。D_LATCHはアドレスを取り込んでメモリチップ用に保持し、プロセッサのピンを解放して、その後にデータを送受信できるようにします。D_LATCHがなければ、CPUには2倍のピンが必要になり、より大きく、はるかに高価になっていたでしょう。

オシロスコープ付きDラッチテンプレート

digisim.ioでD_LATCHを組み立てる

理論は不可欠ですが、直感は実際に配線することで得られます。以下の構成では、ANDゲート2個、NORゲート2個、NOTゲート1個を使います。

手順を追った構築

  1. ゲートを配置する: キャンバスへANDゲート2個、NORゲート2個、NOTゲート1個をドラッグします。
  2. 入力を準備する: INPUT_SWITCHコンポーネントを2つ追加します。一方を「データ」、もう一方を「イネーブル」とラベル付けします。
  3. 入力論理:
  • 「データ」を上側のANDゲートへ接続します。
  • 「データ」をNOTゲートへ接続し、NOT出力を下側のANDゲートへ接続します。
  • 「イネーブル」を両方のANDゲートの2番目の入力へ接続します。
  1. 記憶コア:
  • 上側のANDゲートの出力をNORゲートの入力へ接続します。
  • 下側のANDゲートの出力を2つ目のNORゲートの入力へ接続します。
  • クロス結合: ここが肝心です。上側のNORゲートの出力を下側のNORゲートの入力へ接続します。下側のNORゲートの出力を上側のNORゲートの入力へ戻して接続します。
  1. 出力: OUTPUT_LIGHTを下側のNORゲートの出力へ接続します。これがQです。

SimCast体験

digisim.ioのSimCast機能は、信号伝搬をスローモーションで再生します。「Enable」信号が門番のように働く様子を見てください。DataがHIGHでも入力ANDゲートへ到達してそこで止まり、EnableもHIGHになるまで先へ進みません。

カリキュラム内の関連トピック

digisim.ioでデジタル論理の探索を続けるにあたり、次の関連トピックが理解をさらに深めます。

D_LATCHは、digisim.ioの体系的な学習パスにおける要の地点です。「いま何が起きているか」から「以前に何が起きたか」への転換を示します。

最後に:メモリへの第一歩

Dラッチは、双安定フィードバックを制御可能なレベル感応型ストレージへ変えます。通常のD入力がセットとリセットを同時に要求することは防ぎますが、透過性と閉じるエッジのタイミングは依然として中心的な設計上の懸念です。

Dフリップフロップを続けて読めば、エッジトリガのストレージがインターフェースをどう変えるかが分かります。または、Dラッチのコンポーネントリファレンスを開いてください。

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