CPUの創りかた
概要
本
かかった時間
100.0 時間(退職前に使っていた時間はカウントできていない、たぶんプラス 6 時間くらい)
作成メモ
コード
読書メモ
1章: はじめの一歩のその前に
ここで単純化した CPU を作ることを目標にするが、基本的な動作自体は一般的な CPU と同じ
プログラムカウンターに従って、命令をメモリーから読み出す(命令フェッチ)
命令を解読(デコード)
デコード結果に従い、実際の演算を行う(実行)
演算結果を格納(ストア)
各装備
セラミックコンデンサ: 応答速度は速いが、容量は小さい
電解コンデンサ: 応答速度は悪いが、大きな容量が安価に得られる
ダイオード:「電気の一方通行」デバイス
2章: LED
オームの法則
E = IR(電圧 V = 電流 A * 抵抗 Ω)
P = IE(電力 W = 電流 A * 電圧 V)
LED: Light Emitted Diode。発光ダイオード
ダイオードなので電流は一方通行となる
アノードがプラス側(図だと三角形の方、足の長い方)、カソードがマイナス(図だと線の方)
電源と LED だけだと、電流が無制限になるので、抵抗もつなげればよい
3章: デジタル回路の基礎の基礎
汎用 IC: 様々な論理回路に共通して必要とされる個々の機能を 1 つの小型パッケージにまとめた集積回路
専用 IC: 特定の用途に特化した集積回路
CPLD / FPGA は「回路を自由にプログラム可能なロジック IC」なので、必要な回路そのものをプログラムできる
1 と 0 の表現
電圧が高い(5V)場合を High、電圧が低い(0V)場合を Low
High に 1 を割り当てる場合を「正論理」、Low に 1 を割り当てる場合を「負論理」という
回路図上で、上にバーがある場合は負論理
74HC シリーズの場合、H は 4.4V 以上、L は 0.3V 以下
簡単な論理回路
NOT は 74HC04、OR は 74HC32、3 入力 NAND は 74HC10
DIP: Dual Inline Package。長方形のパッケージの双方の長辺に 2 列の足を配置したもの
実際の回路
使わない入力ピンは H か L に固定する
Vcc に +5V を接続すればいい
IC の近くに 0.1μF 程度の積層セラミックコンデンサを配置する
電解コンデンサには極性があるので注意。基板に 1 つ、100μF 程度の電解コンデンサを配置する
IC への電源の配線の表記は省略されているので注意
電源の配線は網目のように行う。電源パターン付きのユニバーサル基板が便利
4章: リセットとクロック回路
手動クロック回路: 手動で H と L を出力する回路
プルアップ抵抗
スイッチを切り替える時に、一瞬だけ CLOCK 信号は GND にも 5V にもつながっていない状態(オープン)になる
すると電圧が不定になってしまうので、これを防ぐために、CLOCK 信号を抵抗で 5V(Vcc)につないでおく
このような抵抗を「プルアップ抵抗」という。逆に低い電位で保っておく抵抗を「プルダウン抵抗」という
チャタリングの問題
スイッチが接触する瞬間は、激しくバウンドが起きる。このバウンドを「チャタリング」という
スイッチはバウンドした回数だけ、入力されたと認識してしまうため、対応が必要
これに対応するのが CR のフィルタ(C がコンデンサ、R が抵抗)。回路の応答を遅くすることで解決する
デジタル IC では中途半端な電圧(0V は L、5V は H だが、2V とか 3V の場合)でも H か L に判定される
ゆっくり電圧が上昇する場合は、出力が不安定になる
デジタル IC の中でも中途半端な電圧を扱えるものがいて、それが 74HC14 シュミットトリガ・インバーター
リセット回路
ここでは L でリセットがかかる仕様とする(電源を ON にしたら、一時的に L を出力する回路にすればよい)
クロックジェネレータ
ここで作るクロックは 1Hz とする
抵抗を 33KΩ、コンデンサを 10μF とすると発信周期がおおよそ 1Hz となる
抵抗を 3.3KΩ にするとクロックを 10Hz にできる
ここで使うコンデンサはプラスにもマイナスにも充電されるので、無極性電解コンデンサを使用する
5章: ROM を作る
ROM というのは
ここで作る CPU はプログラムを ROM に格納する
ROM にアドレスを指定すると、データが返されるようにする
すべてのデータを一度に読み出すわけではなく、指定されたアドレスの 8bit だけ読み出す
ROM の回路
メモリーセルは DIP スイッチで代用する
プルアップ抵抗を使い、また出力側で論理反転することで、スイッチ ON で H とする
8bit 出力、アドレスは 0〜15 番地までとし、16 バイトの ROM を作る
74HC154 で 4 本の信号を 0〜15 に変換する。G1・G2 入力は両方 L に固定する
プリント基板
以下の 2 つをまとめて指す総称
絶縁体でできた板の上や内部に、導体の配線が施された(だけの)もの。電子部品が取り付けられる前の状態。プリント配線板(PWB = Printed Wiring Board)と呼ばれる
(上記の板に)電子部品がはんだ付けされ、電子回路として動作するようになったもの。プリント回路板(PCB = Printed Circuit Board)と呼ばれる
6章: CPU の設計準備
CPU の仕様
4bitCPU を作成する
レジスタ構成
演算用のレジスタは A と B の 2 つで、4bit。メモリーも兼用する
リセット直後は A・B 共に「0000」となる
プログラムカウンタも 4bit で、プログラムは最大でも 16 ステップとする
フラグは C(キャリー)のみとし、加算命令でキャリーが発生すると「1」になる
入力ポート、出力ポート共に 4bit とする
命令フォーマット
すべての命令は 8bit で構成される。上位 4bit がオペレーションコード、下位 4bit がイミディエイトデータ
7章: 1bitCPU(らしきもの)
TD4 の A レジスタと B レジスタは 4bit なので、それぞれフリップ・フロップ 4 つで構成される
フリップ・フロップは 74HC74 を利用する
入力に切り替えスイッチを付けて、「新しいデータをロード(書き込み)」するのか「自分自身をコピー(保持)」するのかを選択できるようにする
データ保持の方法
フリップ・フロップの出力を入力に戻す
レジスタ間のデータコピーの方法
転送元のフリップ・フロップの出力を転送先のフリップ・フロップへつなぐ
演算の方法
データを転送する途中で演算回路を経由させる
4 チャンネルのデータセレクタには 74HC153 を利用する
また、2 チャンネルデータセレクタと 4 つのフリップ・フロップが入っている 74HC161 を利用する
8章: ALU とプログラムカウンタ
4bit 加算器の 74HC283 を利用する
キャリー入力がない加算器を半加算器(Half Adder)、ある加算器を全加算器(Full Adder)と呼ぶ
TD4 のプログラムカウンタに必要な機能は 2 つ
リセット信号により、ゼロにリセットされる
1 クロックの立ち上がりごとに +1(カウントアップ)される
74HC181 を流用して、ENT と ENP を H に固定することで、カウントできる
出力ポートは C レジスタに LED をぶらさげる
9章: 命令デコーダ
命令フェッチした後、実行部の動作の流れ
SELECT A 信号と SELECT B 信号を設定し、4 チャンネルデータセレクタがレジスタを選択、ALU へ送る
ALU は演算を行い、全レジスタへ演算結果を送る
LOAD0〜LOAD3 信号により、各レジスタの保持またはロードが決定される
後は次のクロックの立ち上がりを合図に実行する
命令デコーダが指示しなくてはならない信号は SELECT A / SELECT B / LOAD0〜LOAD3
10章: 全回路図
全回路図の記載あり
11章: 動作確認
最初は部分的な確認
通電しなくても確認できること
IC がソケットに挿さっていない状態からスタートする。またコンセントを抜くだけでなく、電源と CPU を切り離す
一番怖いのは電源のショートなので、まず基板のどこかで +5V と GND がショートしていないか、テスターを使ってチェックする
次に配線をテスターで 1 本ずつチェックする。単なる配線をチェックするので、テスターの極性は気にしなくてもいい。正常に繋がっていればテスターは 0Ω を示すはず
電源のチェック
この時点では IC はソケットに挿さっていないはずなので IC は壊れないが、電解コンデンサは極性が間違っていると吹き飛ぶことがある
5V を通電して、特に問題(異臭・異音)がないようだったら、各 IC ソケットの電源ピンをテスターで測る
リセット回路のチェック
リセット回路の 74HC14 だけソケットに挿す
3 点の電圧を確認する
プログラムカウンタのチェック
ROM の DIP スイッチはすべて OFF にしておく
テスターですべて確認するのは大変なので、LED をぶらさげておくと簡単
LD 信号がおかしくても、深追いはせずに LD 信号と命令デコーダを一時的に切り離して H に直結し、プログラムカウンタのカウントアップ動作だけを確認する
ROM のチェック
入力 A〜D と G1、G2 が正しいか
Y0〜Y15 が正しいか。これで 74HC154 の入力と出力が確認できる
このあとは「74HC540 の G1 と G2」「74HC154 の出力に従って、DIP スイッチの設定値が 74HC540 の入力に反映されるか」「74HC540 の入力が論理反転された信号が出力されているか」を確認する
命令デコーダのチェック
全命令について、順々に出力が正しいか確認していく
6bit の LED をぶらさげておくと楽かも
C フラグの影響はまだ確認できないので、ここだけは後で確認すれば良い
イミディエイトデータのチェック
ROM から適当なイミディエイトデータを出力させて、これが加算器の入力に届いているか確認する
加算器のチェック・加算期からレジスタへの配線
まず入力ポートの DIP スイッチの状態がデータセレクタの出力まで届いているか確認する
次に加算器の出力をチェックする。イミディエイトデータの値を変えて、加算動作を確認する
最後に加算器の出力が各レジスタに到達しているか確認する
実際に命令を実行する
プログラムの実行
サンプルプログラム 1: LED ちかちか
サンプルプログラム 2: ラーメンタイマー
もう少しまともな CPU
8bit 化 / ALU の強化 / CPLD など / 既製品の CPU をいじってみる
Last updated