はじめに
4 年ほど前に「CPU の創りかた」という本を買いました。当時、まだ営業として働いていましたが、コンピューターサイエンスの基礎を勉強しようと思い、いくつか調べてこの本を買いました。
しかし当時は、買った本を読んでも内容を理解できず、そのまま放置していました。今回エンジニアとして働き始めて 1 年経ち、久々に読んだところ、
内容が理解できるようになっていたので、実際に IC チップで実装してみました。
CPU の基本構成
以下は、本書の構成順に沿って、今回作成した CPU の基本構成をまとめたものです。
1. クロック & リセット
- クロック
- リセット
2. ROM
- Arduino UNO R4 minima を使って、ROM を代用
3. レジスタ
- 汎用レジスタ
- プログラムカウンタ
4. I / O
- LEDとトグルスイッチによる入出力
5. ALU
- 加算器
6. 命令デコーダ
- 命令デコーダ
実装の詳細
使用したパーツ
以下パーツを秋葉原の秋月商店に実際に行って可能な限り揃え、不足したパーツは樫木総業の EC にて購入しました。
- Arduino UNO R4 minima
- IC チップ
- 74HC14 x 1: シュミットトリガー・インバーター
- 74HC163 x 4: 4 ビット同期カウンタ
- 74HC153 x 2: 4 ビットマルチプレクサ
- 74HC283 x 1: 4 ビット全加算器
- 74HC74 x 1: D フリップフロップ
- 74HC32 x 1: 2 入力 OR ゲート
- 74HC10 x 1: 3 入力 NAND ゲート
- 抵抗 (まとめ買いのため、個数記載ない)
- 100Ω
- 1kΩ
- 3.3kΩ
- 10kΩ
- 33kΩ
- 100kΩ
- コンデンサ (まとめ買いのため、個数記載ない)
- 10μF
- 100μF
- そのほか
- バレッドボード
- バレッドボード用ジャンパーワイヤー
- 自励式ブザー
- タクトスイッチ
- トグルスイッチ
得られた知見
- CPU の基本動作の理解
- 理論では理解していた、ロジック IC の動作を実際に確認できた。
- フリップフロップを使って、データを保存する仕組みを理解できた。
- CPU の基本的な全体像の理解
- クロックの役割
- クロックの信号を受け取り、その信号の周期に従って、フリップフロップなどの IC 回路の動作を制御する。
- リセットの役割
- リセット信号を受け取り、IC 回路の出力をリセットする。
- レジスタの役割
- フリップフロップとデータセレクタを使って、データを保存する方法。
- データセレクタの役割
- データセレクタは、データを選択的に読み取るための回路。フリップフロップ 1 つで 1 ビットのデータを保存する。データセレクタは、フリップフロップの出力を受け取るが、命令デコーダによって選択されたフリップフロップからのデータのみを出力する。
- プログラムカウンタの役割
- プログラムカウンタは、プログラムの実行順序を管理する。 カウンタは読み取る ROM のアドレスとなる。
- 命令デコーダの役割
- 命令デコーダは、命令コードの入力からデータセレクタやフリップフロップのロード信号を出力する。
- ALU
- 今回は全加算器を利用。命令デコーダに沿ってセレクタから出力された結果を使って、演算を行う。
- ROM
- 4 ビットのアドレスパスを受け取り、そのアドレスに対応するデータ(命令コードと Immediate データ)を 8 ビット出力する。
- クロックの役割
- 基礎の電子回路の仕組みやデバッグの方法
- 実際にテスターを使った回路のデバッグの難しさ
- 中学理科レベルの電気の知識
Arduino UNO R4 minima での実装
今回、Arduino UNO R4 minima は ROM として利用しています。
今回の ROM の役割は、4 ビットのアドレスパスを受け取り、そのアドレスに対応するデータ(命令コードと Immediate データ)を 8 ビット出力することです。
利用したコードは Github にて公開しています。
https://github.com/ZawaPaP/CPU-
まとめ
実際の IC チップを使用した CPU の実装は、基礎の理論と実践の両方を学ぶことができる貴重な経験でした。これまで、Nand2Tetris などで基礎の CPU の仕組みを学んでいたのですが、実際に自分で作ってみると、
どのような回路を作ればよいか、どのように回路を組み立てればよいか、といったことを改めて復習し、理顔を深めることができました。
参考資料
CPU の創りかたは有名な本のため、さまざまな人が実装しています。インターネット上の記事を色々と参考にさせていただきました。