工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Verilog

Dラッチ完全マスター:設計、動作原理、フリップフロップとの違い

ラッチとフリップフロップの根本的な違い

フリップフロップはクロックのエッジ(立ち上がり/立ち下がり)で入力を取り込み、次のエッジまで出力を保持します。クロックエッジ以降の入力変化は無視されます。

一方、ラッチはエッジではなくレベルで動作します。イネーブル信号(en)がアサートされている間、出力qは入力dを透過的に追従します。イネーブルが非アサートになると、その瞬間の値をラッチ(保持)します。

Dラッチの設計

3入力(データd、イネーブルen、アクティブローリセットrstn)、1出力(q)のポジティブラッチを実装します。

module d_latch (
  input  d,     // データ入力
  input  en,    // イネーブル(Highで透過)
  input  rstn,  // アクティブローリセット
  output reg q  // 出力
);
  // 感度リストに en, rstn, d をすべて含める
  // これらいずれかが変化したらブロックが実行される
  always @(en or rstn or d) begin
    if (!rstn)
      q <= 0;        // リセット時は強制クリア
    else if (en)
      q <= d;        // en=High: 入力dを出力qに透過
    // en=Lowのときは前状態を保持(暗黙のラッチ動作)
  end
endmodule

重要なポイント

回路図

テストベンチ

ランダムなタイミングでenとdを切り替え、ラッチの透過・保持動作を検証します。

module tb_latch;
  reg d;
  reg en;
  reg rstn;
  reg [2:0] delay;
  reg [1:0] delay2;
  integer i;
  wire q;

  d_latch dl0 (
    .d(d), .en(en), .rstn(rstn), .q(q)
  );

  initial begin
    $monitor("[%0t] en=%0b d=%0b q=%0b", $time, en, d, q);
    
    // 1. 初期化
    d <= 0; en <= 0; rstn <= 0;
    
    // 2. リセット解除
    #10 rstn <= 1;
    
    // 3. ランダムに en と d をトグル
    for (i = 0; i < 5; i = i + 1) begin
      delay  = $random;
      delay2 = $random;
      #(delay2) en <= ~en;
      #(delay)  d <= i;
    end
  end
endmodule

シミュレーション結果

ncsim> run
[0]  en=0 d=0 q=0
[11] en=1 d=0 q=0   // en=1になり d=0 を透過
[18] en=0 d=0 q=0   // en=0で保持
[19] en=0 d=1 q=0   // en=0なので d 変化しても q 変わらず
[20] en=1 d=1 q=1   // en=1で d=1 を透過
[25] en=1 d=0 q=0   // en=1継続中に d=0 へ追従
[27] en=0 d=0 q=0   // en=0で保持
[32] en=0 d=1 q=0   // 保持継続
[33] en=1 d=1 q=1   // 透過再開
[34] en=1 d=0 q=0   // 追従
ncsim: *W,RNQUIE: Simulation is complete.

波形解説

緑色ハイライト:en=1区間ではqがdに追従(透過モード)

白色区間:en=0区間ではqが直前の値を保持(ラッチモード)

フリップフロップ vs ラッチ:使い分けの指針

項目フリップフロップラッチ
動作トリガクロックエッジイネーブルレベル
面積/消費電力大きい小さい
タイミング解析容易(STA標準対応)困難(透過パス考慮必要)
グリッチ耐性高い低い(透過中にグリッチが出力に出る)
主用途汎用順序回路、ステートマシン高速パス、アドレスラッチ、特殊用途

注意点

意図しないラッチ生成はバグの温床です。always @(*)やalways_combで組み合わせ回路を書く際、全分岐で出力に代入がないとラッチが生成されます。常にdefaultケースや全パスでの代入を心がけてください。意図的なラッチは本例のように明示的な感度リストと条件分岐で記述しましょう。

Verilog

  1. 共通エミッタ増幅器:設計、測定、フィードバック技術
  2. オペアンプとして機能する高利得差動増幅器の構築
  3. 精密電圧フォロワ:オペアンプ負帰還による正確な信号追従の習得
  4. 非反転増幅器:構築、テスト、オペアンプ利得制御の習得
  5. C# 入出力の基礎:ユーザー入力と出力の基本をマスター
  6. C++入出力完全ガイド:cin/coutの基本から複数入力まで
  7. C言語入出力(I/O)マスター:scanf()とprintf()徹底解説
  8. C++ストリームをマスター:cout、cin、cerr、clogの実践ガイド
  9. C言語の入出力マスター:標準関数とファイル操作
  10. Python I/Oとモジュールインポート完全マスター: 実践ガイド
  11. Java入出力をマスター:表示、読み取り、データフォーマット