スリーステートバッファ
- 一つの論理回路から駆動できる次の入力には限度がある
- そのためバスドライバなどでバッファを利用
- 論理値0,1,ハイインピーダンスの三状態を取りうる
- ハイインピーダンスは回路から切り離されている状態
- Active-highとActive-Lowがある
- 横からの入力がhighで動作するかlowで動作するか
- インバーターがついている場合も
- スリーステートバッファの出力を衝突させると0と1が一緒になってしまうことがあるので、そのまま束ねるのではなくて基本的にはマルチプレクサを使うべき
- ハイインピーダンス状態を利用すると複数の出力を一つのバスに流せる(回路から切り離せるため)
- CPUのピン数には制限があるのでこのような切り替えが有効になる
- 入出力ピンとしての利用
- 双方向信号が流せる
デコーダーとエンコーダー
- デコーダー
- 特定の入力の組み合わせから一つの線をhighにする
- 入力3本に対して出力8パターンまで可能
- 出力を反転もあり
- 7442チップ
- 4-10ラインデコーダ
flowchart TD subgraph 入力 A["A (LSB)"] B["B"] C["C"] D["D (MSB)"] end subgraph "74LS42<br/>BCD to Decimal Decoder" DEC[デコーダー] end subgraph 出力 Y0["0 (active low)"] Y1["1"] Y2["2"] Y3["3"] Y4["4"] Y5["5"] Y6["6"] Y7["7"] Y8["8"] Y9["9"] end A & B & C & D --> DEC DEC --> Y0 & Y1 & Y2 & Y3 & Y4 & Y5 & Y6 & Y7 & Y8 & Y9 style DEC fill:#f9f,stroke:#333,stroke-width:2px
- 論理関数を作るにあたって、デコーダーがあるとみたいなのを直感的に表現できる
エンコーダー
- 入力を二進数にエンコードする
- 基本的に表の下半分はドントケアとする
- 電光掲示板とかの7セグみたいなイメージ
flowchart TD subgraph 入力 D0["D0 (最低優先)"] D1["D1"] D2["D2"] D3["D3"] D4["D4"] D5["D5"] D6["D6"] D7["D7 (最高優先)"] end subgraph "優先度付きエンコーダー<br/>8-to-3 Priority Encoder" ENC[エンコーダー] end subgraph 出力 A["A0 (LSB)"] B["A1"] C["A2 (MSB)"] V["V (有効)"] end D0 & D1 & D2 & D3 & D4 & D5 & D6 & D7 --> ENC ENC --> A & B & C & V style ENC fill:#bbf,stroke:#333,stroke-width:2px
優先度順位付きエンコーダーであればより大きい数字を優先する
ラッチとフリップフロップ
- 順序回路は過去の入力によって出力が変わる
- クロック周波数のそれとか
- 基本的には共通ブロックを持つもののみ扱う
状態を持つ回路
- インバーターの出力をインバーターの入力につなぐとクロック回路になる
- インバーター2つを輪っかにすると安定状態を作る
セットリセットラッチ
- NORを2つ繋いだもの
- 後側を切り替える
- 前側を切り替える
- 安定状態は2つ
flowchart LR subgraph "SR Latch (NORゲート版)" S[S] -->|S=1でセット| NOR1["NOR"] R[R] -->|R=1でリセット| NOR2["NOR"] Q[Q] -->|フィードバック| NOR2 Qbar[Q'] -->|フィードバック| NOR1 NOR1 --> Q NOR2 --> Qbar end style NOR1 fill:#bbf,stroke:#333 style NOR2 fill:#bbf,stroke:#333
- S=1, R=0 → Q=1 (セット)
- S=0, R=1 → Q=0 (リセット)
- S=0, R=0 → 保持状態
- S=1, R=1 → 禁止 (不定)
- セットとリセットを書き換えることが可能
stateDiagram-v2 direction TB classDef stable fill:#bbf,stroke:#333 classDef invalid fill:#f99,stroke:#333 Q01["Q=0, Q'=1<br/>(リセット状態)"]:::stable Q10["Q=1, Q'=0<br/>(セット状態)"]:::stable Invalid["Q=0, Q'=0 または<br/>Q=1, Q'=1 (禁止)"]:::invalid Q01 --> Q01 : S=0, R=0 (保持) Q01 --> Q10 : S=1, R=0 (セット) Q01 --> Invalid : S=1, R=1 Q10 --> Q10 : S=0, R=0 (保持) Q10 --> Q01 : S=0, R=1 (リセット) Q10 --> Invalid : S=1, R=1 Invalid --> Q01 : S=0, R=1 (リセット) Invalid --> Q10 : S=1, R=0 (セット)
- (S,R)=(0,0):現在の状態を保持
- (S,R)=(0,1):リセット(Q=0)
- (S,R)=(1,0):セット(Q=1)
- (S,R)=(1,1):禁止状態(メタステーブルになる可能性あり)
| S | R | 現在の Q | 次の Q | 次の Q’ | 動作 |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 1 | 保持 (no change) |
| 0 | 0 | 1 | 1 | 0 | 保持 (no change) |
| 0 | 1 | 0 | 0 | 1 | リセット |
| 0 | 1 | 1 | 0 | 1 | リセット |
| 1 | 0 | 0 | 1 | 0 | セット |
| 1 | 0 | 1 | 1 | 0 | セット |
| 1 | 1 | - | - | - | 禁止 (不定・競合状態) |
セットリセットラッチは
で表せる
スイッチのデバウンスなどに利用(ノイズの除去)
NORで作れるということはNANDでも作れるということ
ゲート付きのラッチ
- enableを入力に追加する
- 入力S,G,R
- 出力はP,Q
透過型ラッチ
NANDラッチ (NAND SRラッチ)
NANDゲート2つで構成される基本的なSRラッチ。
flowchart TD subgraph "NAND SR Latch" N1["NAND1"] N2["NAND2"] end S["S (Set)"] --> N1 R["R (Reset)"] --> N2 Q1["Q"] --> N2 Q2["Q'"] --> N1 N1 --> Q1 N2 --> Q2 style N1 fill:#ff9,stroke:#333 style N2 fill:#ff9,stroke:#333
真理値表 (S,R active low):
| S | R | Q | Q’ | 動作 |
|---|---|---|---|---|
| 0 | 1 | 1 | 0 | セット |
| 1 | 0 | 0 | 1 | リセット |
| 1 | 1 | - | - | 保持 |
| 0 | 0 | 1 | 1 | 禁止 (不定) |
ゲート付きラッチ (Gated SR Latch / 透過型ラッチ)
Enable (G or CLK) で入力を制御。
flowchart TD subgraph "Gated SR Latch" AND1["AND1"] AND2["AND2"] N1["NAND1"] N2["NAND2"] end S["S"] --> AND1 R["R"] --> AND2 G["G (Enable)"] --> AND1 & AND2 AND1 --> N1 AND2 --> N2 Q["Q"] --> N2 Qb["Q'"] --> N1 N1 --> Q N2 --> Qb style AND1 fill:#9f9,stroke:#333 style AND2 fill:#9f9,stroke:#333 style N1 fill:#ff9,stroke:#333 style N2 fill:#ff9,stroke:#333
真理値表 (G=1 のとき有効):
| G | S | R | 次のQ | 動作 |
|---|---|---|---|---|
| 0 | - | - | 保持 | ラッチ (変化なし) |
| 1 | 0 | 0 | 保持 | 保持 |
| 1 | 0 | 1 | 0 | リセット |
| 1 | 1 | 0 | 1 | セット |
| 1 | 1 | 1 | 不定 | 禁止 |
Dラッチ版にすると入力がDとD’になる場合が多い。