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 のとき、データ保持(シフトしない)
- 立ち下がりエッジ駆動
シフトレジスタの動作表
| Sh | L | Q3+ | Q2+ | Q1+ | Q0+ | Action |
|---|---|---|---|---|---|---|
| 0 | 0 | Q3 | Q2 | Q1 | Q0 | No change |
| 0 | 1 | D3 | D2 | D1 | D0 | Load |
| 1 | X | SI | Q3 | Q2 | Q1 | Right 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)
- 遷移表 を書く
- 次状態表 を描く
- TQマップ(カルノー図)を描く
- 論理式を導出 する
ダウンカウンタ
- 状態をデクリメントするカウンタ
- 遷移: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₂N | log₂N | N/2 | N |
| ハザード対策 | できない | 可能 | 不要 | 単一状態では不要 |
| 状態デコード | フル・デコード | フル・デコード | 2入力OR/AND | ORゲート |
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の設計手順
- 遷移表に励起表を参照してS,R入力列を追加
- 各S,Rのカルノー図を作成
- 論理式を導出
S-R FFの励起表
| Q | Q+ | S | R |
|---|---|---|---|
| 0 | 0 | 0 | X |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 0 | 1 |
| 1 | 1 | X | 0 |
- 例: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の励起表
| Q | Q+ | J | K |
|---|---|---|---|
| 0 | 0 | 0 | X |
| 0 | 1 | 1 | X |
| 1 | 0 | X | 1 |
| 1 | 1 | X | 0 |
- 例: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-R | 0→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状態からも主系列に復帰すること