順序回路とフリップフロップ
📋 このページの内容
順序回路は時間の概念があるため、初心者にはやや難しいかもしれません。ここでしっかりと理解しておきましょう。
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 エッジ | その時の D | Q の変化 |
|---|---|---|
| 1回目↑ | 1 | Q → 1(転送) |
| 2回目↑ | 0 | Q → 0(転送) |
| 3回目↑ | 1 | Q → 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 |
| 1 | 1 |
| 2 | 0 |
| 3 | 1 |
| 4 | 0 |
分周(ぶんしゅう)
N 個の D-FF を接続すると 0〜(2ᴺ−1) を繰り返すカウンタを構成できます。
3. 同期カウンタ
インクリメント回路 + D-FF で構成されます。全 D-FF が同一のクロックで同時に動作するため、出力はほぼ同時に変化します。
4ビット同期カウンタの動作
| CK 立ち上がり | Q3 | Q2 | Q1 | Q0 | 10進値 |
|---|---|---|---|---|---|
| 0(初期) | 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 0 | 1 | 1 |
| 2 | 0 | 0 | 1 | 0 | 2 |
| 3 | 0 | 0 | 1 | 1 | 3 |
| … | … | … | |||
| 15 | 1 | 1 | 1 | 1 | 15 |
| 16 | 0 | 0 | 0 | 0 | 0(折り返し) |
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(初期) | 0 | — | 1 |
| 1 | 1 | — | 2 |
| 2 | 2 | — | 3 |
| 3 | 3 | — | 4 |
| 4 | 4(N-1) | ✓ アクティブ | 0(ゼロ回路) |
| 5 | 0(折り返し) | — | 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)
| CK | DIN | Q0 | Q1 | Q2 | Q3 |
|---|---|---|---|---|---|
| 初期 | — | 0 | 0 | 0 | 0 |
| 1↑ | 1 | 1 | 0 | 0 | 0 |
| 2↑ | 0 | 0 | 1 | 0 | 0 |
| 3↑ | 1 | 1 | 0 | 1 | 0 |
| 4↑ | 1 | 1 | 1 | 0 | 1 |
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 を確定し続けなければならない時間
