CPUを作る部品
2進数の計算から、ALU・MUX・レジスタ・PCの役割までつなぎます。

この週でできるようになること
- 2進数で整数を表し、簡単な加算ができる。
- ALU、マルチプレクサ、レジスタ、PC、RAMの役割を区別できる。
- 組合せ回路と状態保持回路がCPU内でどう協力するか説明できる。
- Nand2Tetrisで加算器とALUの信号を観察する。
まず、具体的な場面から
8 + 4 + 0 + 1 = 13。
2進数では10₂。和0と桁上がり1。
次に取る命令のアドレス100を覚えている。
見えてくること:計算・選択・記憶・命令の順番は、別の部品が担当して協力します。
ここで初めて、見えてきた関係を言葉や記号でまとめます。
MUXは入力を選ぶ回路、ALUは算術・論理演算器、レジスタは少量の値を保持する回路、PCは次命令のアドレスを保持するレジスタです。
なぜそうなる?
組合せ回路のALUは、現在の入力だけから結果を出します。過去の結果や次の命令位置を残すにはレジスタが必要です。制御回路がこれらの動きを指示します。
講義ノートで詳しく読む
元のMarkdownにある仕組み・図・用語を、順番に確認します。
1. 2進数
各桁が0または1で、右から 2⁰, 2¹, 2²... の重みを持ちます。
1101₂ = 1×8 + 1×4 + 0×2 + 1×1 = 13₁₀
4ビットの符号なし整数なら0~15を表せます。nビットなら 0 から 2ⁿ-1 です。
2の補数
多くのCPUは負数を2の補数で表します。4ビットで -3 を作るには、3 = 0011 のビットを反転して1を加えます。
0011 → 1100 → 1101
4ビット2の補数の範囲は-8~7です。加算回路を正負で共用しやすい利点があります。
2. 加算器
半加算器は2ビットを加えます。
Sum = A XOR B
Carry = A AND B
全加算器は前の桁からのCarry-inも加えます。全加算器を並べると多ビット加算器になります。単純なリップルキャリー方式では桁ごとにキャリーが伝わるため、ビット数が増えると遅延が増えます。
3. ALU
ALU(Arithmetic Logic Unit)は、制御信号に応じて入力へ演算を行います。
代表的な操作:
- 加算・減算
- AND、OR、XOR、NOT
- 左右シフト
- ゼロか、負かなどの状態判定
ALUは「計算内容を自分で決める」のではありません。命令を解読した制御回路が、どの演算を行うか指示します。
4. マルチプレクサ
複数の入力から一つを選ぶ回路です。2入力MUXなら次のように動作します。
| select | output |
|---|---|
| 0 | A |
| 1 | B |
CPU内では、ALUへ渡す値、次のPC、レジスタへ書き戻す値などを選択します。データの「交差点」に相当します。
5. フリップフロップとレジスタ
組合せ回路には過去を覚える能力がありません。フリップフロップはクロックの特定タイミングで入力を取り込み、次の更新まで保持します。
複数ビット分を並べたものがレジスタです。CPUのレジスタは、演算対象、アドレス、途中結果などを保持します。
6. プログラムカウンター
PC(Program Counter)は、次に取得する命令のアドレスを保持するレジスタです。
通常は次の命令へ進むため増加します。分岐や関数呼び出しでは、別の値が書き込まれます。
通常:PC ← PC + 命令長
分岐:PC ← 分岐先アドレス
7. RAM
RAMはアドレスを指定してデータを読み書きする記憶装置です。概念的にはレジスタを大量に並べ、アドレスデコーダーで対象を選びます。
CPU内のレジスタと外部の主記憶は、容量、速度、コストが大きく異なります。第8週で階層として扱います。
部品のつながり
命令メモリ ─→ 命令レジスタ ─→ 制御回路
│ 制御信号
レジスタ群 ─→ MUX ─→ ALU ─→ MUX ─→ レジスタ群
│
データメモリ
PC ─→ 次命令アドレス
例題で確かめる
10110₂を10進数へ直そう。
- 右から重みは1、2、4、8、16。
- 1の立った桁は16、4、2。
- 16 + 4 + 2 = 22。
答え:10110₂ = 22₁₀。
実習
Nand2Tetrisで以下を観察・作成します。
- Project 2のHalfAdderとFullAdder。
- Add16へ
000...0011と000...0101を入力する。 - ALUの制御ビットを変え、加算・AND・ゼロ出力を確認する。
- Project 3のRegisterで、loadが0のとき値が保持されることを確認する。
- PCでincrement、load、resetの優先関係を確認する。
説明課題
「ALUだけではCPUにならない」理由を、レジスタ、PC、制御回路という語を使って説明してください。
練習問題
元ノートの小テストです。まず自分で答えを考え、必要なら下の答えを開いてください。
10110₂を10進数へ変換せよ。答えと考え方を見る
16 + 4 + 2 = 22。ALUが演算内容を選ぶために受け取るものは何か。
答えと考え方を見る
opcodeを解読して作られる制御信号。
MUXの役割を一文で答えよ。
答えと考え方を見る
複数入力から、select信号に応じて一つを選ぶ。
PCは何を保持するか。
答えと考え方を見る
次に取得する命令のアドレス。
load信号が無効なレジスタは、クロック後に値をどうするか。
答えと考え方を見る
現在値を保持する。