FPGA を学び始めたばかりの人にとって、ラッチ(Latch)とフリップフロップ(Flip-Flop, FF)の違いは少し分かりにくいものです。本記事では、それぞれの役割や FPGA 設計における注意点、見分け方について詳しく解説します。
目次
1. ラッチとフリップフロップの基本的な違い
ラッチもフリップフロップも「データを保持する回路」ですが、動作の仕方が異なります。
項目 | フリップフロップ(FF) | ラッチ(Latch) |
---|---|---|
動作タイミング | クロックのエッジ(立ち上がり/立ち下がり) | Enable 信号が有効な間 |
制御方法 | クロックでデータを確定 | Enable が 1 の間、データを更新 |
設計の安定性 | 安定しやすい(クロック同期設計) | 不安定になりやすい(グリッチの可能性) |
FPGA での推奨度 | 推奨(基本的に FF を使う) | 推奨されない(意図せず発生するとバグの原因) |
FPGA 設計では フリップフロップを使うのが基本 です。ラッチは非同期動作でタイミング制御が難しくなるため、意図せず生成されないように注意が必要です。
2. ラッチの存在意義
では、「ラッチはまったく不要なのか?」という疑問が生じるかもしれません。実際には、ラッチには特定の用途での有用性があります。
ラッチが役立つ場面
- 低消費電力設計(ASIC など)
- フリップフロップはクロックが動作している限り動き続けますが、ラッチは Enable 信号がオフのときは完全に静的になり、電力を消費しません。
- そのため、ASIC(特定用途向け IC)の設計では、ラッチを意図的に使用することで消費電力を削減できます。
- 簡単なデータ保持(状態保持用)
- フリップフロップを使うほどではない、一時的なデータ保持が必要な場合、ラッチを使うことで回路を簡素化できます。
- 例えば、一部のバス制御や短期間のデータラッチに使われることがあります。
- グリッチ除去や非同期信号処理
- 一部の非同期信号の保持や、信号の安定化にラッチを使うことがあります。
- ただし、これも FPGA ではフリップフロップを用いた同期回路で置き換えられることが多いため、使用する場合は注意が必要です。
FPGA ではラッチの使用を避けるべきですが、「ラッチがまったく不要なものではない」という点も理解しておくと良いでしょう。
3. HDL でのラッチとフリップフロップの見分け方
✅ フリップフロップ(FF)の記述例
VHDL
process(clk)
begin
if rising_edge(clk) then -- クロックの立ち上がりでデータ確定
q <= d;
end if;
end process;
Verilog
always @(posedge clk) begin // クロックの立ち上がりでデータ確定
q <= d;
end
→ これはフリップフロップ!
rising_edge(clk)
やposedge clk
でデータを取得している。- クロックを基準にした設計で安定。
🚨 ラッチ(Latch)の記述例
VHDL
process(enable, d)
begin
if enable = '1' then -- Enable 信号が '1' の間だけデータを更新
q <= d;
end if; -- enable が '0' のとき q を保持(ラッチ動作)
end process;
Verilog
always @(enable or d) begin
if (enable) begin // Enable が '1' のときだけ更新
q = d;
end
// else がないため、enable=0 のとき q を保持(ラッチ)
end
→ これはラッチ!
enable
信号でデータを制御し、enable = 0
のとき前の値を保持。- クロックの影響を受けないため、非同期になりやすい。
- 意図しないタイミングで値が変わる(グリッチが発生しやすい)。
まとめ
判定基準 | フリップフロップ (FF) | ラッチ (Latch) |
---|---|---|
クロックのエッジ | ✅ 必須 (rising_edge(clk) ) | ❌ なし |
Enable信号のみで制御 | ❌ なし | ✅ あり |
値の保持方法 | クロックエッジで更新 | EnableがOFFのとき保持 |
意図しない発生 | しない | する可能性が高い |
初心者のうちは、「クロックで制御しない回路は危険」くらいの意識で OK!
HDL コードを書いていて「これってラッチかな?」と疑問に思ったら、ぜひ見直してみてください!