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
重要なポイント
always @(en or rstn or d):感度リストに出力更新に関わる全信号を列挙enがHighのときq <= d→ ポジティブラッチenがLowのとき代入文が実行されない → 前値保持(ラッチ動作)- 合成ツールによってはラッチ生成警告が出ることがある(意図的なら問題なし)
回路図
テストベンチ
ランダムなタイミングで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
- 共通エミッタ増幅器:設計、測定、フィードバック技術
- オペアンプとして機能する高利得差動増幅器の構築
- 精密電圧フォロワ:オペアンプ負帰還による正確な信号追従の習得
- 非反転増幅器:構築、テスト、オペアンプ利得制御の習得
- C# 入出力の基礎:ユーザー入力と出力の基本をマスター
- C++入出力完全ガイド:cin/coutの基本から複数入力まで
- C言語入出力(I/O)マスター:scanf()とprintf()徹底解説
- C++ストリームをマスター:cout、cin、cerr、clogの実践ガイド
- C言語の入出力マスター:標準関数とファイル操作
- Python I/Oとモジュールインポート完全マスター: 実践ガイド
- Java入出力をマスター:表示、読み取り、データフォーマット