# Week 4：CMOSと論理回路

## 今週のゴール

- CMOSインバーターのHigh/Lowをトランジスタ状態から説明できる。
- 論理値と物理電圧を区別できる。
- NANDだけからNOT、AND、ORを構成できる。
- 組合せ回路と順序回路の違いを説明できる。

## 1. デジタル抽象化

デジタル回路の0と1は数学的な記号ですが、実物では電圧範囲として表現されます。

```text
低い電圧範囲 → 論理0
高い電圧範囲 → 論理1
中間領域     → 保証されない
```

ノイズがあっても0と1を区別できる余裕をノイズマージンと呼びます。論理値は電圧そのものではなく、電圧を抽象化したものです。

## 2. CMOSインバーター

インバーターは入力を反転します。

```text
 VDD
  │
 pMOS
  ├── 出力 Y
 nMOS
  │
 GND

両方のゲートへ入力 A を接続
```

| 入力A | pMOS | nMOS | 出力Y |
|---:|---|---|---:|
| 0 | ON | OFF | 1 |
| 1 | OFF | ON | 0 |

入力が安定した0または1のとき、理想的にはVDDからGNDへの直流経路がありません。これがCMOSの低い静的消費電力の基本です。切り替え時には、出力容量の充放電と一時的な貫通電流で電力を使います。

動的電力のおおまかな傾向は次の式で表せます。

```text
P_dynamic ≈ α C V² f
```

`α`は切替頻度、`C`は充放電する容量、`V`は電源電圧、`f`はクロック周波数です。電圧が二乗で効くことが重要です。

## 3. 基本論理

### NOT

`Y = NOT A`。0を1へ、1を0へ反転します。

### AND

すべての入力が1のときだけ1です。

### OR

少なくとも一つの入力が1なら1です。

### NAND

ANDの結果を反転します。NANDは万能ゲートであり、NANDだけから任意の論理回路を構成できます。

## 4. NANDから作る

```text
NOT A    = NAND(A, A)
AND(A,B) = NOT(NAND(A,B))
OR(A,B)  = NAND(NOT A, NOT B)
```

最後の式はド・モルガンの法則に基づきます。

## 5. XORと半加算器

XORは二つの入力が異なるとき1です。1ビットの加算では次の関係になります。

```text
Sum   = A XOR B
Carry = A AND B
```

| A | B | Sum | Carry |
|---:|---:|---:|---:|
| 0 | 0 | 0 | 0 |
| 0 | 1 | 1 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 0 | 1 |

複数ビットの加算器は、これを発展させて作ります。CPUのALUへの最初の橋です。

## 6. 組合せ回路と順序回路

- 組合せ回路：出力は現在の入力だけで決まる。例：加算器、マルチプレクサ。
- 順序回路：内部状態を持つ。例：フリップフロップ、レジスタ、カウンター。

CPUには計算する組合せ回路と、途中結果や制御状態を保持する順序回路の両方が必要です。

## 実習

Nand2Tetris Web IDEのProject 1を使用します。

1. `Not`をNAND一つで作る。
2. `And`をNANDと作成済みNotで作る。
3. `Or`をド・モルガンの法則で作る。
4. すべての入力組合せをテストする。
5. 余力があればXorまで作る。

## 説明課題

CMOSインバーターが入力0を出力1へ変換する流れを、pMOSとnMOSの状態を含めて説明してください。

## 小テスト

1. CMOSインバーターへ0を入れると、どちらのMOSFETがオンになるか。
2. 安定状態のCMOSで静的電力が小さい基本的理由は何か。
3. NANDだけでNOTを作る接続方法を書け。
4. 1 + 1の半加算器出力SumとCarryはいくつか。
5. レジスタは組合せ回路か、順序回路か。

[解答](../answers.md#week-4)
