CPUの創りかた
Last updated
Was this helpful?
Last updated
Was this helpful?
100.0 時間(退職前に使っていた時間はカウントできていない、たぶんプラス 6 時間くらい)
ここで単純化した CPU を作ることを目標にするが、基本的な動作自体は一般的な CPU と同じ
プログラムカウンターに従って、命令をメモリーから読み出す(命令フェッチ)
命令を解読(デコード)
デコード結果に従い、実際の演算を行う(実行)
演算結果を格納(ストア)
各装備
セラミックコンデンサ: 応答速度は速いが、容量は小さい
電解コンデンサ: 応答速度は悪いが、大きな容量が安価に得られる
ダイオード:「電気の一方通行」デバイス
オームの法則
E = IR(電圧 V = 電流 A * 抵抗 Ω)
P = IE(電力 W = 電流 A * 電圧 V)
LED: Light Emitted Diode。発光ダイオード
ダイオードなので電流は一方通行となる
アノードがプラス側(図だと三角形の方、足の長い方)、カソードがマイナス(図だと線の方)
電源と LED だけだと、電流が無制限になるので、抵抗もつなげればよい
汎用 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 への電源の配線の表記は省略されているので注意
電源の配線は網目のように行う。電源パターン付きのユニバーサル基板が便利
手動クロック回路: 手動で 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 にできる
ここで使うコンデンサはプラスにもマイナスにも充電されるので、無極性電解コンデンサを使用する
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)と呼ばれる
CPU の仕様
4bitCPU を作成する
レジスタ構成
演算用のレジスタは A と B の 2 つで、4bit。メモリーも兼用する
リセット直後は A・B 共に「0000」となる
プログラムカウンタも 4bit で、プログラムは最大でも 16 ステップとする
フラグは C(キャリー)のみとし、加算命令でキャリーが発生すると「1」になる
入力ポート、出力ポート共に 4bit とする
命令フォーマット
すべての命令は 8bit で構成される。上位 4bit がオペレーションコード、下位 4bit がイミディエイトデータ
TD4 の A レジスタと B レジスタは 4bit なので、それぞれフリップ・フロップ 4 つで構成される
フリップ・フロップは 74HC74 を利用する
入力に切り替えスイッチを付けて、「新しいデータをロード(書き込み)」するのか「自分自身をコピー(保持)」するのかを選択できるようにする
データ保持の方法
フリップ・フロップの出力を入力に戻す
レジスタ間のデータコピーの方法
転送元のフリップ・フロップの出力を転送先のフリップ・フロップへつなぐ
演算の方法
データを転送する途中で演算回路を経由させる
4 チャンネルのデータセレクタには 74HC153 を利用する
また、2 チャンネルデータセレクタと 4 つのフリップ・フロップが入っている 74HC161 を利用する
4bit 加算器の 74HC283 を利用する
キャリー入力がない加算器を半加算器(Half Adder)、ある加算器を全加算器(Full Adder)と呼ぶ
TD4 のプログラムカウンタに必要な機能は 2 つ
リセット信号により、ゼロにリセットされる
1 クロックの立ち上がりごとに +1(カウントアップ)される
74HC181 を流用して、ENT と ENP を H に固定することで、カウントできる
出力ポートは C レジスタに LED をぶらさげる
命令フェッチした後、実行部の動作の流れ
SELECT A 信号と SELECT B 信号を設定し、4 チャンネルデータセレクタがレジスタを選択、ALU へ送る
ALU は演算を行い、全レジスタへ演算結果を送る
LOAD0〜LOAD3 信号により、各レジスタの保持またはロードが決定される
後は次のクロックの立ち上がりを合図に実行する
命令デコーダが指示しなくてはならない信号は SELECT A / SELECT B / LOAD0〜LOAD3
全回路図の記載あり
通電しなくても確認できること
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: ラーメンタイマー
8bit 化 / ALU の強化 / CPLD など / 既製品の CPU をいじってみる