---
title: 时序論理回路
url: https://doc.liz6.com/ja/hardware/05-digital-circuits/03-sequential-logic-circuits
locale: ja
area: hardware
tags:
- hardware
- digital-circuits
date: 2026-06-30
modified: 2026-07-16
description: '时序論理回路 时序論理とは 时序論理 — 出力は現在の入力だけでなく、過去の状態にも依存します。 时序逻辑核心结构:组合逻辑 + 反馈存储 = 有记忆的电路 入力 組合せ論理 出力 ↓ 状態更新 フィードバック(状態読み取り) ↑ 記憶素子 クロック CLK によりサンプリング制御 特徴: クロック信号(Clock) …'
---

# 时序論理回路

## 时序論理とは

**时序論理** — 出力は現在の入力だけでなく、**過去の状態**にも依存します。

<svg viewBox="0 0 720 300" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system,'Source Han Sans CN','Microsoft YaHei',sans-serif" role="img" aria-label="时序逻辑核心结构:组合逻辑与反馈存储构成有记忆的电路">
  <defs>
    <marker id="seqfb1" markerWidth="10" markerHeight="8" refX="8" refY="3" orient="auto"><path d="M0,0 L8,3 L0,6 Z" fill="#475569"/></marker>
  </defs>
  <rect width="720" height="300" fill="#ffffff"/>
  <text x="360" y="28" text-anchor="middle" font-size="17" font-weight="700" fill="#1f2933">时序逻辑核心结构:组合逻辑 + 反馈存储 = 有记忆的电路</text>

  <text x="55" y="97" font-size="13" fill="#475569">入力</text>
  <line x1="85" y1="92" x2="138" y2="92" stroke="#475569" stroke-width="1.7" marker-end="url(#seqfb1)"/>
  <rect x="140" y="70" width="170" height="44" rx="8" fill="#4f46e5"/>
  <text x="225" y="97" text-anchor="middle" font-size="13" font-weight="700" fill="#ffffff">組合せ論理</text>
  <line x1="310" y1="92" x2="358" y2="92" stroke="#475569" stroke-width="1.7" marker-end="url(#seqfb1)"/>
  <text x="366" y="97" font-size="13" fill="#475569">出力</text>

  <line x1="270" y1="114" x2="270" y2="160" stroke="#475569" stroke-width="1.6" marker-end="url(#seqfb1)"/>
  <text x="280" y="142" font-size="11" fill="#64748b">↓ 状態更新</text>
  <line x1="180" y1="162" x2="180" y2="116" stroke="#475569" stroke-width="1.6" marker-end="url(#seqfb1)"/>
  <text x="120" y="142" font-size="11" fill="#64748b" text-anchor="end">フィードバック(状態読み取り) ↑</text>

  <rect x="140" y="162" width="170" height="44" rx="8" fill="#0d9488"/>
  <text x="225" y="189" text-anchor="middle" font-size="13" font-weight="700" fill="#ffffff">記憶素子</text>
  <text x="225" y="222" text-anchor="middle" font-size="11" fill="#0f766e">クロック CLK によりサンプリング制御</text>

  <rect x="60" y="238" width="600" height="50" rx="7" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="76" y="260" font-size="12.5" fill="#3730a3">特徴: クロック信号(Clock) + 状態保持</text>
  <text x="76" y="280" font-size="12.5" fill="#3730a3">—— フィードバックとクロックがあり、出力は現在の入力だけでなく、過去の状態にも依存します。</text>
</svg>

特徴: **クロック信号 (Clock)** + **状態保持**

---

## ラッチとフリップフロップ

### SR ラッチ (基本記憶素子)
```
NOR による実装:
    ┌───┐
S ──┤   ├── Q
    │NOR│
    │   ├──┐
    └───┘  │
    ┌───┐  │
R ──┤   ├──┘── Q̄
    │NOR│
    └───┘

S=1,R=0 → セット   (Q=1)
R=1,S=0 → リセット (Q=0)
S=0,R=0 → ホールド (保持)
S=1,R=1 → 禁止! (Q=Q̄=0, 解除後の状態は不確定)
```

### D ラッチ (レベルトリガ)
```
レベルトリガ: CLK=1 の間 D に追随し、CLK=0 でラッチ

D ────┬── Q
      │
CLK ──┘

問題点: CLK=1 の間に D が変化すると、Q も追随して変化する (トランスペアレント)
     フィードバックループ内で発振を引き起こす可能性がある
```

### D フリップフロップ (エッジトリガ) — デジタル回路の主力
```
シンボル:
    ┌───┐
D ──┤D  Q├── Q
CLK─┤>   │
    └───┘

クロック立下りエッジ (↑) のみ D をサンプリングし、それ以外の時間は Q を不変に保つ

重要なタイミングパラメータ:
  tsu (セットアップ): CLK エッジの前に D が安定している必要がある最短時間
  th  (ホールド):     CLK エッジの後に D が保持されている必要がある最短時間
  tcq (clk→q):        CLK エッジから Q の更新までの遅延

tsu/th を違反すると → 亜安定状態 (metastability) → Q が発振したり不確定になったりする!
```

### その他のフリップフロップ
```
JK フリップフロップ:
  J=1,K=0 → Q=1  (セット)
  J=0,K=1 → Q=0  (リセット)
  J=1,K=1 → Q を反転 (トグル)
  J=0,K=0 → ホールド

T フリップフロップ (トグル):
  T=1 → 各クロックエッジで1回反転
  T=0 → 保持

T フリップフロップをカスケード接続 = カウンタ
```

---

## レジスタ (Register)

```
n 個の D フリップフロップが同じクロックを共有 = n ビットレジスタ

    ┌───┐
D0 ─┤D  Q├── Q0
    │>  │
    └───┘
    ┌───┐
D1 ─┤D  Q├── Q1
    │>  │
    └───┘
    ...   ← 合計 n 個
    ↑
   CLK

各クロック立下りエッジで、すべての D がサンプリングされ → Q が更新される
これは CPU 内のレジスタやパイプラインレジスタの基本原理である
```

---

## カウンタ (Counter)

### 非同期 (リップル) カウンタ
```
Q0 → CLK1 → Q1 → CLK2 → Q2 ...
前の段の Q 出力が次の段の CLK を直接駆動

単純だが遅い (段差遅延が累積) + 中間状態にスパイクが発生する
```

### 同期カウンタ
```
すべてのフリップフロップが同じクロックを共有

任意の計数シーケンス (アップ/ダウン/双方向)
典型例: 74HC161 (4ビット同期), 74HC193 (双方向)
```

### 一般的な計数方式
```
2進数: 0→1→2→...→2ⁿ-1→0
10進数: 0→1→...→9→0  (BCDコード)
グレイコード: 1回の変換で1ビットのみ変化 (競合を回避)
  BCD:     000→001→010→011→100...
  グレイ:  000→001→011→010→110...
  1回の変換で1ビットのみ反転 → クロックドメイン間伝送に適している
```

---

## 状態機械 (FSM)

### Moore 型
<svg viewBox="0 0 720 330" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system,'Source Han Sans CN','Microsoft YaHei',sans-serif" role="img" aria-label="Moore 型状態機械:出力は現在の状態のみに依存し、状態遷移はクロックエッジで発生する">
  <defs>
    <marker id="moorefsm1" markerWidth="10" markerHeight="8" refX="8" refY="3" orient="auto"><path d="M0,0 L8,3 L0,6 Z" fill="#475569"/></marker>
  </defs>
  <rect width="720" height="330" fill="#ffffff"/>
  <text x="360" y="28" text-anchor="middle" font-size="17" font-weight="700" fill="#1f2933">Moore 型状態機械: 出力は現在の状態のみに依存</text>

  <rect x="280" y="62" width="160" height="66" rx="10" fill="#e0e7ff" stroke="#4f46e5"/>
  <text x="360" y="90" text-anchor="middle" font-size="13" font-weight="700" fill="#3730a3">S0</text>
  <text x="360" y="112" text-anchor="middle" font-size="11" fill="#4f46e5">out = A</text>

  <line x1="360" y1="128" x2="360" y2="182" stroke="#475569" stroke-width="1.7" marker-end="url(#moorefsm1)"/>
  <text x="372" y="158" font-size="11" fill="#64748b">条件を満たす (クロックエッジで遷移)</text>

  <rect x="280" y="184" width="160" height="66" rx="10" fill="#ccfbf1" stroke="#0d9488"/>
  <text x="360" y="212" text-anchor="middle" font-size="13" font-weight="700" fill="#115e59">S1</text>
  <text x="360" y="234" text-anchor="middle" font-size="11" fill="#0f766e">out = B</text>

  <rect x="60" y="270" width="600" height="50" rx="7" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="76" y="292" font-size="12.5" fill="#3730a3">出力は現在の状態のみに依存し、状態遷移はクロックエッジでのみ発生する</text>
  <text x="76" y="312" font-size="12.5" fill="#3730a3">—— 出力の変化はクロックに追従するため、スパイク (glitch) は発生しない。</text>
</svg>

### Mealy 型
<svg viewBox="0 0 720 240" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system,'Source Han Sans CN','Microsoft YaHei',sans-serif" role="img" aria-label="Mealy 型状態機械:出力は現在の状態と入力に依存し、入力が変化すると出力は直ちに反応する">
  <defs>
    <marker id="mealyfsm1" markerWidth="10" markerHeight="8" refX="8" refY="3" orient="auto"><path d="M0,0 L8,3 L0,6 Z" fill="#475569"/></marker>
  </defs>
  <rect width="720" height="240" fill="#ffffff"/>
  <text x="360" y="28" text-anchor="middle" font-size="17" font-weight="700" fill="#1f2933">Mealy 型状態機械: 出力は現在の状態 + 入力に依存</text>

  <rect x="250" y="70" width="170" height="64" rx="10" fill="#e0e7ff" stroke="#4f46e5"/>
  <text x="335" y="98" text-anchor="middle" font-size="13" font-weight="700" fill="#3730a3">S0</text>
  <text x="335" y="118" text-anchor="middle" font-size="11" fill="#4f46e5">現在の状態</text>

  <line x1="420" y1="102" x2="470" y2="102" stroke="#475569" stroke-width="1.7" marker-end="url(#mealyfsm1)"/>
  <text x="478" y="98" font-size="12" font-weight="700" fill="#9a3412">入力が 1 のとき出力 = 1</text>
  <text x="478" y="116" font-size="11" fill="#c2410c">(即時応答、クロックエッジを待たない)</text>

  <rect x="60" y="160" width="600" height="50" rx="7" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="76" y="182" font-size="12.5" fill="#3730a3">出力 = 現在の状態 + 現在の入力。入力が変化すると出力も直ちに変化する</text>
  <text x="76" y="202" font-size="12.5" fill="#3730a3">—— いつでも発生する可能性があり、スパイク (glitch) のリスクがある。ただし、状態数は Moore 型より少なくなる傾向がある。</text>
</svg>

### FSM の実装
```
1. 状態エンコーディング (2進数/ワンホットコード/グレイコード)
2. 現在の状態 → レジスタ
3. 次の状態 → 組合せ論理 (状態 + 入力 → 次の状態)
4. 出力論理 → Moore/Mealy

ワンホットコード: N個の状態 = Nビット、1ビットのみが1
  利点: 出力/次の状態の論理が単純
  欠点: フリップフロップの数が多い
```

---

## タイミング解析

### セットアップ/ホールド時間
```
     tsu  th
     ├──┤├┤
D ───┘    └────────────
         ↑
CLK ─────┘    ─────────

tsu: クロックエッジの前に D が安定している必要がある時間
th:  クロックエッジの後に D が保持されている必要がある時間

違反 → 亜安定状態!
```

### 最大周波数
```
fmax = 1 / (tcq + tcomb(max) + tsu)

tcq:    フリップフロップの CLK→Q 遅延
tcomb:  組合せ論理の最大遅延 (クリティカルパス)
tsu:    次の段のフリップフロップのセットアップ時間

fmax を向上させるには:
- 組合せ論理の段数を減らす
- パイプラインレジスタを挿入する (長いパスを複数の短いパスに分割する)
```

### 亜安定状態 (Metastability)
```
D が tsu/th のウィンドウ内で変化する場合:
  Q は中間電位に入る可能性があり → 発振 → 最終的に 0 または 1 に安定する

平均故障間隔 (MTBF):
  MTBF ∝ e^(t_wait/τ) / (f_clk × f_data)

解決策: 2段同期器 (2回サンプリング)
  async_in → [DFF] → [DFF] → sync_out
             ↑CLK      ↑CLK
  
  1段目で亜安定状態になる可能性があるが、2段目ではほぼ確実に安定している
```

---

## クロックドメイン間伝送 (CDC)

```
クロックドメインを跨ぐ信号伝送の黄金律:

1. 1ビット信号: 2段同期器 (デュアルフリップフロップ)
2. 複数ビットバス: 非同期 FIFO またはハンドシェイクプロトコルを使用
   複数ビットを直接同期してはならない! (各ビットが異なるサイクルでキャプチャされる可能性がある)
3. 低速→高速: 信号は少なくとも高速クロックの2周期間保持する
4. 高速→低速: 信号は低速クロックがサンプリングできる十分な時間保持する
```

---
*キーワード: フリップフロップ, DFF, セットアップ時間, ホールド時間, 亜安定状態, 状態機械, Moore, Mealy, CDC, 同期器*
