20260611_4


11.1 Registers and Register Transfers

そもそもレジスタとは?

何の回路?
→ 複数ビットのデータを「記憶」する回路。CPUの中にある「一時置き場」みたいなもの。

何でできてる?
→ D-FFを複数個並べたもの。各FFに共通のCLK、Load、Clearを接続。

どういう働き?
→ Load=1のとき、CLKエッジで入力Dの値をQに保存する。Load=0の間は値を保持。

何が優れてる?
→ 1クロックでnビット同時保存できる。複数レジスタ間でバスを使ってデータ転送ができる。

レジスタの動作詳細

4-Bit D-FF レジスタ(ゲート付きクロック)

flowchart LR
    subgraph "4-Bit D-FF Register (Gated Clock)"
        D0["D₀"] --> AND0["AND"] --> FF0["D-FF₀"]
        D1["D₁"] --> AND1["AND"] --> FF1["D-FF₁"]
        D2["D₂"] --> AND2["AND"] --> FF2["D-FF₂"]
        D3["D₃"] --> AND3["AND"] --> FF3["D-FF₃"]

        FF0 --> Q0["Q₀"]
        FF1 --> Q1["Q₁"]
        FF2 --> Q2["Q₂"]
        FF3 --> Q3["Q₃"]
    end
    CLK[CLK] --> AND0 & AND1 & AND2 & AND3
    LOAD[Load] --> AND0 & AND1 & AND2 & AND3
    CLR[Clear] -.-> FF0 & FF1 & FF2 & FF3
  • Load=1 のとき、入力DがCLKの立ち下がりエッジでFFにロードされる
  • Clearは非同期リセット(いつでも有効)

4-Bit D-FF レジスタ(共通クロック + CE)

flowchart LR
    subgraph "4-Bit Register with Clock Enable"
        D0["D₀"] --> FF0["D-FF₀"]
        D1["D₁"] --> FF1["D-FF₁"]
        D2["D₂"] --> FF2["D-FF₂"]
        D3["D₃"] --> FF3["D-FF₃"]
        FF0 --> Q0["Q₀"]
        FF1 --> Q1["Q₁"]
        FF2 --> Q2["Q₂"]
        FF3 --> Q3["Q₃"]
    end
    CLK[CLK] --> GATE["AND Gate"]
    CE[CE (Load)] --> GATE
    GATE --> FF0 & FF1 & FF2 & FF3
    CLR[Clear] -.-> FF0 & FF1 & FF2 & FF3
  • CE=1 ならクロックが有効になりデータがロードされる
  • CE=0の間はクロックがブロックされ、値を保持

レジスタ間のデータ転送(トライステートバス)

flowchart LR
    subgraph "Register Transfer via Tri-State Bus"
        A["Register A"] --> BA["Tri-state
Buffer A"]
        B["Register B"] --> BB["Tri-state
Buffer B"]
        BA --> BUS["Data Bus"]
        BB --> BUS
        BUS --> Q["Register Q"]
        SEL_A[SEL_A] --> BA
        SEL_B[SEL_B] --> BB
    end
  • SEL_A=1 → バスにAの値が載る
  • SEL_B=1 → バスにBの値が載る
  • 同時に1つだけONにするのが重要(バス衝突防止)

8-Bit レジスタ + トライステート出力

  • 実際のIC(例:74HC574)ではFF出力にトライステートバッファが内蔵
  • En=0 のとき出力が有効、En=1 のとき Hi-Z(切断)
  • 図11-3(a)(b) 参照

Parallel Adder with Accumulator

  • 1つのレジスタ(Accumulator)に数値を格納し、別の数を加算して結果を格納
  • Ad=1 のとき、和 Si = xi + yi + ci がアキュムレータに格納される
  • 図11-5 参照

Adder Cell with Multiplexer

  • FFがyiを直接ロードするか、和出力siをロードするかをMUXで選択
  • Ld=1 → MUXがyiを選択 → アキュムレータにロード
  • 図11-6 参照

11.2 Shift Registers

そもそもシフトレジスタとは?

何の回路?
→ データを「ビット列」として格納し、CLK毎に1ビットずつ隣のFFへ移動(シフト)させる回路。

何でできてる?
→ D-FFを直列に並べたもの。前のFFの出力Qが次のFFの入力Dに繋がる。

どういう働き?
→ Shift=1のとき、CLK毎に SI → FF₃ → FF₂ → FF₁ → FF₀ → SO とデータがずれる。Shift=0なら保持。

何が優れてる?
Serial ↔ パラレル変換ができる。通信(USB, SPI, I2C)の基礎。遅延回路にもなる。

シフトレジスタの動作詳細

4-Bit シフトレジスタ(Serial In/Serial Out)

flowchart LR
    subgraph "4-Bit Right Shift Register"
        SI["SI
(Serial In)"] --> FF3["D-FF₃"]
        FF3 --> FF2["D-FF₂"]
        FF2 --> FF1["D-FF₁"]
        FF1 --> FF0["D-FF₀"]
        FF0 --> SO["SO
(Serial Out)"]
    end
    CLK[CLK] --> FF3 & FF2 & FF1 & FF0
    SHIFT[Shift] --> FF3 & FF2 & FF1 & FF0
  • Shift=1 のとき、CLK毎にSI→FF3→FF2→FF1→FF0→SO とデータが右にシフト
  • Shift=0 のとき、データ保持(シフトしない)
  • 立ち下がりエッジ駆動

シフトレジスタの動作表

ShLQ3+Q2+Q1+Q0+Action
00Q3Q2Q1Q0No change
01D3D2D1D0Load
1XSIQ3Q2Q1Right shift

状態方程式

  • Q3+ = Sh’·L’·Q3 + Sh’·L·D3 + Sh·SI
  • Q2+ = Sh’·L’·Q2 + Sh’·L·D2 + Sh·Q3
  • Q1+ = Sh’·L’·Q1 + Sh’·L·D1 + Sh·Q2
  • Q0+ = Sh’·L’·Q0 + Sh’·L·D0 + Sh·Q1

そもそもJohnson Counterとは?

何の回路?
→ シフトレジスタの出力端を逆転させて入力端に戻す(逆フィードバック)ことで、一定の状態系列を繰り返すカウンタ。

何でできてる?
→ D-FFの直列接続 + 出力Q₀のNOTをSIにフィードバック。

どういう働き?
→ nビット Johnson Counterは 2n状態 を巡回する。

何が優れてる?
→ フルデコード不要で状態を識別できる。スイッチバウンス除去やタイミング生成に便利。

Johnson Counter(ジョンソンカウンタ)

  • Shift Register with Inverted Feedback = Johnson Counter / Twisted Ring Counter
  • 出力Q0の逆転を入力SIにフィードバック
  • 2n個の状態を巡回する(nビットJohnson → 2n状態)
  • 図11-12 参照

そもそもLFSRとは?

何の回路?
→ シフトレジスタの入力SIを、複数のFF出力のXORで決める回路。

何でできてる?
→ D-FFの直列接続 + XORゲートのフィードバック。

どういう働き?
→ 原始多項式を使うと 最長周期(M系列) の擬似ランダム系列を生成する。5ビットなら周期31。

何が優れてる?
→ 通信の暗号化、拡散、テストパターン生成などに利用。

LFSR(Linear Feedback Shift Register)

  • シフトレジスタの入力SIが 関数 SI = f(x1,x2,…,xn) で決まる一般形
  • 線形フィードバック = XORベースのフィードバック
  • M系列 = 最長周期の擬似ランダム系列(原始多項式で構成)
  • 例:5ビットFF、周期 2⁵-1=31
  • 携帯電話等の通信で利用

11.3 Design of Binary Counters

そもそもカウンタとは?

何の回路?
→ クロックパルスの個数を「数える」回路。FFの状態を一定の系列で遷移させる。

何でできてる?
→ T-FFやD-FFに組み合わせ回路を繋げたもの。

どういう働き?
→ 000→001→010→011→…→111→000 とカウントアップする(またはダウン)。

何が優れてる?
→ CPUのプログラムカウンタ、タイマー、分周器など、あらゆるデジタルシステムの基盤。

同期カウンタ vs リップルカウンタ

同期カウンタリップルカウンタ(非同期)
CLK共通CLKで全FFが同期1つのFFの出力が次のCLK入力になる
状態変化同時に発生伝搬遅延が積み重なる
用途高速・高信頼性簡単なカウンタ

T-FFによる3ビットバイナリカウンタ

  • 状態系列:CBA = 000, 001, 010, 011, 100, 101, 110, 111, 000, …
  • A = クロック毎にトグル → TA = 1
  • B = A=1のときトグル → TB = A
  • C = A=B=1のときトグル → TC = BA

設計手順(T-FF)

  1. 遷移表 を書く
  2. 次状態表 を描く
  3. TQマップ(カルノー図)を描く
  4. 論理式を導出 する

ダウンカウンタ

  • 状態をデクリメントするカウンタ
  • 遷移:000→111→110→…→001→000→111…

D-FFによる設計

  • D-FFでは Q+ = D なので、次状態マップがそのままD入力マップになる
  • 例:DC = C+ = B’, DB = B+ = C+BA’, DA = A+ = A’(C+B)

11.4 Counters for Other Sequences

そもそもDon’t-Care状態とは?

何?
→ 使用しない状態のこと。電源投入時にどこに行くか不明な状態。

なぜ重要?
→ don’t-care状態からも主系列に復帰できなければ、カウンタが暴走する。

対策は?
→ don’t-care状態の次状態を明示的に指定し、Self-starting(自己開始)にする。

Don’t-Care状態を持つカウンタ

  • 電源投入時の初期状態が不定 → don’t-care状態も考慮する
  • Self-starting = don’t-care状態からも主系列に復帰できること
  • Johnson Counterはdon’t-care状態を明示的に指定して設計

4状態カウンタの設計例

  • 状態系列:000→001→010→011→000→…
  • Don’t-care:100, 101, 110, 111
  • T入力のカルノー図から導出:
    • TC = B’
    • TB = C + BA’
    • TA = C + B

カウンタ比較表

バイナリグレイコードジョンソンワンホット
FF数log₂Nlog₂NN/2N
ハザード対策できない可能不要単一状態では不要
状態デコードフル・デコードフル・デコード2入力OR/ANDORゲート

Binary Counter with Clear

  • Synchronous Clear: 9 (1001) でクリア → 次クロックで0になる
  • Asynchronous Clear: 10 (1010) でクリア → 即座に0になる
  • 4ビットカウンタで0〜9をカウント(BCDカウンタ)

Decimal Counter with Parallel Load

  • Excess-3 Codeで3〜12をカウント
  • 12 (1100) になったらLdを生成 → 0011 (3) をロード
  • Don’t-care:0, 1, 2, 13, 14, 15

11.5 Counter Design using S-R and J-K Flip-Flops

そもそも励起表とは?

何?
→ 「現在の状態Qから次状態Q+に遷移するために、FFに入力すべき値」をまとめた表。

なぜ必要?
→ カウンタ設計では「次にどんな状態にしたいか」が先に決まる。そこから逆算してFF入力を決める必要がある。

どう使う?
→ 遷移表の各行について、励起表を参照してS,R(またはJ,K)の入力値を記入する。

S-R Flip-Flopの設計手順

  1. 遷移表に励起表を参照してS,R入力列を追加
  2. 各S,Rのカルノー図を作成
  3. 論理式を導出

S-R FFの励起表

QQ+SR
000X
0110
1001
11X0
  • 例:SC = B’, RC = A, SB = C, RB = C’A, SA = A(C+B), RA = A

J-K Flip-Flopの設計手順

  • S-Rと同様だが、J=K=1のときもトグルできる
  • 一方の入力が1のとき、他方はdon’t-care (X)

J-K FFの励起表

QQ+JK
000X
011X
10X1
11X0
  • 例:JC = B’, KC = A, JB = C, KB = C’A, JA = C+B, KA = 1

11.6 Derivation of Flip-Flop Input Equations - Summary

FF種別による入力マップの作り方

FF種別Q=0 の場合Q=1 の場合
D変化なし変化なし(Q+がそのままD)
T変化なし反転(Q+をcomplement)
S-R0→1の箇所に1(残りはXで埋める)1→0の箇所に1(残りはXで埋める)
J-K変化なし反転(Q+をcomplement)
  • T-FF: Q+ ≠ Q のとき T=1
  • S-R-FF: Sはセット、Rはリセット。S=1ならR=X(don’t-care)
  • J-K-FF: S-Rと同様だが、J=K=1でトグル可能

4変数カルノー図の例

  • 次状態マップQ+からFF入力マップを派生
  • T入力マップ:Q=0 halfはコピー、Q=1 halfはcomplement
  • SR入力マップ:0→1をS=1、1→0をR=1、残りはX
  • JK入力マップ:SRと同様だが、don’t-careの扱いが異なる

まとめ

セクションそもそも内容
11.1 レジスタデータの一時記憶装置D-FF×n + 共通CLK → nビット記憶。トライステートバスで転送
11.2 シフトレジスタSerial↔パラレル変換器FFを直列接続し、CLK毎にデータをシフト。Johnson, LFSR
11.3 バイナリカウンタクロックを数える回路T-FF/D-FFで設計。遷移表→カルノー図→論理式
11.4 その他の系列特殊なカウンタDon’t-care, self-starting, カウンタ比較
11.5 S-R/J-K設計FF入力を逆算する励起表を使ってS,R,J,K入力を導出
11.6 まとめ入力マップ作成ルールFF種別による入力マップ作成ルール

覚えておくこと

  • レジスタ = 複数ビット同時記憶(共通CLK + Load)
  • シフトレジスタ = データをシフト方向に移動。Serial↔パラレル変換
  • Johnson Counter = シフトレジスタ + 逆フィードバック → 2n状態巡回
  • LFSR = XORフィードバックでM系列(擬似ランダム)を生成
  • 同期カウンタ = 全FFが同一CLKで同期
  • T-FF = 入力1でトグル、カウンタ設計の基本
  • 励起表 = FFの入力を決めるための変換表
  • Self-starting = don’t-care状態からも主系列に復帰すること