順序回路とフリップフロップ

順序回路は時間の概念があるため、初心者にはやや難しいかもしれません。ここでしっかりと理解しておきましょう。

もふねこ

L2までの回路は『いまの入力』だけで出力が決まっていたよね?🐾
でも、順序回路は『過去の記憶』を持てるんだ!「クロック(時計の針)」に合わせて動くから、ここからが本当のデジタル回路の面白いところだよ!

1. フリップフロップとラッチ

順序回路で状態を保持する記憶素子には、フリップフロップ(FF)とラッチの2種類があります。

🔵 フリップフロップ(D-FF)

  • クロック CK のエッジ(立ち上がり/立ち下がり)で動作
  • CK 立ち上がり時の D の値を Q に転送
  • 次の CK エッジまで Q の値を保持
  • エッジ間で D が変化しても Q は変わらない

🟣 ラッチ

  • ゲート G のレベル(H/L)で動作
  • G=1 の期間中は D をそのまま Q に通す
  • G=0 になると直前の Q を保持
  • G=1 の間は D が変化するたびに Q も変化する

D-FF のタイミングチャート

CK エッジその時の DQ の変化
1回目↑1Q → 1(転送)
2回目↑0Q → 0(転送)
3回目↑1Q → 1(転送)
エッジ間変化ありQ は変化しない(保持)

ラッチのタイミングチャート

G の状態D の変化Q の動作
G = 1(透過)変化ありD をそのまま Q に出力(透過モード)
G = 0(保持)変化ありQ は変化しない(保持)
💡
重要な違い フリップフロップはエッジトリガ、ラッチはレベルトリガ。HDL設計では意図せずラッチが生成されると問題になるため、フリップフロップを使う設計が基本です。

2. カウンタの基本(2進カウンタ)

カウンタはクロックの入力数を数える回路です。時間計測、繰り返し回数の計数などに使用されます。

最も単純な2進カウンタは D-FF + インバータ で構成されます。

  • D-FF の出力 Q をインバータで反転して D に戻す
  • CK の立ち上がりごとに Q が 0→1→0→1 … と反転する
  • 出力の周波数はクロックの 1/2(分周)
CK 立ち上がり回数Q(1ビット)
0(初期)0
11
20
31
40
分周(ぶんしゅう) N 個の D-FF を接続すると 0〜(2ᴺ−1) を繰り返すカウンタを構成できます。

3. 同期カウンタ

インクリメント回路 + D-FF で構成されます。全 D-FF が同一のクロックで同時に動作するため、出力はほぼ同時に変化します。

4ビット同期カウンタの動作

CK 立ち上がりQ3Q2Q1Q010進値
0(初期)00000
100011
200102
300113
15111115
1600000(折り返し)

4. N進カウンタ

0〜N-1 を繰り返すカウンタです。構成要素:

  • 同期カウンタ(インクリメント回路 + D-FF)
  • N-1 検出回路:カウント値が N-1 になったことを検出
  • ゼロ回路:N-1 検出信号がアクティブのとき D-FF 入力を 0 にする

N=5(5進カウンタ)の動作例

CK 立ち上がりQ(出力)N-1 検出次の D 入力
0(初期)01
112
223
334
44(N-1)✓ アクティブ0(ゼロ回路)
50(折り返し)1
💡
必要なビット数 N進カウンタに必要な D-FF の数 K は、2ᴷ ≥ N を満たす最小の整数 K です。例:N=5 なら K=3(2³=8 ≥ 5)。

5. シフトレジスタ

D-FF を複数直列に並べた回路です。CK は全 D-FF に共通入力されます。

  • 用途①:シリアル↔パラレル変換
  • 用途②:クロックに対する遅延の生成

4ビットシフトレジスタの動作(入力: 1,0,1,1)

CKDINQ0Q1Q2Q3
初期0000
1↑11000
2↑00100
3↑11010
4↑11101

4クロック後に Q3〜Q0 = 1011 が揃い、シリアル入力がパラレル出力に変換できます。

6. セットアップタイムとホールドタイム

もふねこ

ここは超重要!FPGAやASICでバグが起きたとき、大半の原因がこの「セットアップ/ホールドタイム違反」なんだ🐾
『写真を撮る瞬間(クロック)の前後は、動かないでじっとしててね』というルールだと覚えてね!

D-FF が正しく動作するために、入力 D はクロック CK の前後で一定時間、安定している必要があります。

パラメータ定義違反した場合
セットアップタイム(Ts) CK 立ち上がりに D が確定していなければならない最小時間 CK エッジ時の D の値が正確に Q に転送されない可能性がある
ホールドタイム(Th) CK 立ち上がりに D を確定し続けなければならない最小時間 CK エッジ直後の D の値が Q に誤って転送される可能性がある

タイミング図(概念)

期間内容
CK ↑ より Ts 前からD を確定させておく(セットアップタイム違反NG)
CK ↑ の瞬間D の値を Q にサンプリング
CK ↑ より Th 後までD を変えないでおく(ホールドタイム違反NG)
⚠️
タイミング違反 セットアップタイム・ホールドタイムのいずれかが守られないと、出力 Q が不定(メタスタビリティ)になる場合があります。論理合成ツールによるタイミング解析(スタティックタイミング解析)で必ず確認します。
もふねこ

ちょっと覚えることが多くて頭がパンクしそうかな?🐾
でも大丈夫。実務のコードで書く順序回路は、ほとんどが『D-FF』を使った同期回路なんだ。
次は、この順序回路を使ってロボットの脳みそ(ステートマシン)を作ってみるよ!

📌 まとめ

  • 順序回路の記憶素子にはフリップフロップ(エッジトリガ)とラッチ(レベルトリガ)がある
  • D-FF はクロックの立ち上がりエッジで D の値を Q に転送し、それ以外は保持する
  • ラッチは G=1 の間 D が Q に透過し、G=0 で Q を保持する
  • 2進カウンタは D-FF + インバータで構成し、出力はクロックの 1/2 の周波数になる(分周)
  • 同期カウンタは全 D-FF が同一クロックで動作し、出力はほぼ同時に変化する
  • N進カウンタは 0〜N-1 を繰り返す。N-1 検出回路とゼロ回路で実現する
  • シフトレジスタは D-FF を直列接続し、シリアル↔パラレル変換やクロック遅延生成に使用する
  • セットアップタイム:CK 立ち上がり前に D を確定させておく時間
  • ホールドタイム:CK 立ち上がり後も D を確定し続けなければならない時間