CPUの創り方
pre-Day 1
とりあえず本を読む
必要なもの
抵抗
1/4 Wで良い
コンデンサ
セラミックコンデンサ
応答速度は早いが容量が小さい
電解コンデンサ
応答速度は悪いが、容量が大きい
ダイオード
IC
正論理 Active-High
H=1, L=0
負論理 Active-Low
H=0. L=1
負論理の場合は、
出力に○をっつける
DIP(デュアル・インライン・パッケージ)
ICソケットが使える
Vcc
+5V側に挿す
GND
0Vマイナス側に指す
パスコン
積層セラミックコンデンサ(0.1μF)ぐらい
リードタイプ
電源から遠すぎないように供給できるためのもの
電解コンデンサ
基盤に一つ
100μF程度のパスコン
電源パターン付きユニバーサル基盤
プルアップ
プラス電源側へ引っ張り上げる回路全般
チャタリング
On/Offがバウンドして複数回入力されてしまう
オペレーションコード
イミディエイトデータ
ニーモニック
プログラムカウンタ
現在実行している命令の番地
CPUにリセットをかける=プログラムカウンタをリセットする
Dフリップフロップ
一つで1ビット記憶できる
pre-Day2
部品集め
https://gyazo.com/44a57c9326acca58374beb07fe981717
https://gyazo.com/610718b393e31a0eba88b597377d36e5
https://gyazo.com/4d98b70b2cf0cfa80f689e438d3986ba
pre-Day3
CPUの基本動作
プログラムカウンターに従って命令をメモリーから読み出す(命令フェッチ)
命令を解読(デコード)
デコード結果に従い実際の演算を行う(実行)
演算結果を格納(ストア)
Day1
NOT回路をトランジスタで作る(完成)
https://gyazo.com/6a80580e2880c92ba18c0386dde0213a
AND回路をトランジスタで作る(完成)
トランジスタ2個
https://gyazo.com/10208685ba88b8d995cef74ffe80ab41
OR回路をトランジスタで作る(完成)
トランジスタ2個
AND回路の入力を直列から並列に変えただけで行けた
https://gyazo.com/863399d0d1566681688733557b7fc1bd
https://gyazo.com/645921ea7ad5ab1563da2736642bc9eahttps://gyazo.com/5e6ee6d4ee12dd15231a184213e51c33
https://gyazo.com/eacae230e0ccb6263dcbf92ac656d10chttps://gyazo.com/2bd4fc04ed8c1247e8227260a45f64c3
Day 2
クロック回路・リセット回路
リセット回路を作る
https://gyazo.com/81dd9e1a8fd120353a9aeea96644e6f5
https://gyazo.com/3ad2f53e06d9099c1b402114240889a7
ダイオードを入れて応答を早くしたリセット回路
https://gyazo.com/b5f1a6a7729f40b157c6368c8f47d404
https://gyazo.com/12d629467701b99f9e0368737de69aa0
クロックジェネレータ
なんかうまく発振してくれない
電源とどう繋げばいいかがわからないところ
一旦おいておく
CHAPTER5 ROM
理解した。
ダイオードが死ぬほど大変そう
Chapter6 CPU
Chapter7 1ビットCPU
SRラッチ
https://gyazo.com/8ad6983a1006f08ad55f8b2be1bd398b
フリップフロップ
https://gyazo.com/940efb279f25ff7c81fb065c708cfa13
Day3
クロックジェネレータがちゃんと動いてない説があるので確認した
https://gyazo.com/5e3090a4c3438c2eb9d44fd64519a81f
D-フリップフロップとつなぎ合わせて確かに保存できることが確認できた。
試した。DIPスイッチも普通のスイッチと基本的には使い方は同じ
https://gyazo.com/cb173519c0ab31f07d42f3dcecda19e9
4つのスイッチの情報をABの入力で取り出せる
https://gyazo.com/16a1d7d0ff788a96b81ec1c686d53a91
https://gyazo.com/20def18b3341b1579c9fbc321cae2dd6
全ビットやるのは大変なので、74HC153を2つで、2ビット分だけ。これをあと2つ用意すれば、4ビット全部転送できる仕組み 結局次の足し算をするのに、4bitに対応しておく必要があるので、対応した。
加算機である74HC283を使って、上のレジスタに入力値を足し合わせてロードするところを作った が、加算がうまく続いていかない感じ。
タイミングによって、変な値が入力されてしまっているのではなかろうか
https://gyazo.com/2947e63b0ed39b15cc20537651a95b11
Day4
回路を整理して、実際にユニバーサル基板に構築していくときのイメージを作っておく
クロックジェネレータは必要なので先に作っておく。
クロックの出力は適当にジャンプワイヤで与えられるようにしておくのが良さそう
レジスタ
レジスタの回路は、ロードのボタンを付けて
クロック回路は全部つなげておいて
A−Dの入力と出力をテストしてそれぞれ正しくロードできることを確認するのが良さそう
セレクタ
74HC153の動作確認もかねて、一個のレジスタからの入力がA/BがLLの時に正しく出力されるかを確認する
セレクタのA/Bのインプットは手動で入れられるようにしておく
161のA/B/C/Dはそれぞれ全部つないじゃってOK
2個目のレジスタもつないで確認する
74HC153の各アウトプットを161のinputとして戻す
3個目のレジスタをOutput用に4このLED回路に接続する
INPUT部分を作る
インプットはC2につなぐので、セレクタのBがHでAがLになるようにした状態で、インプットしたものがレジスタに流れていく様になっているので、保持したいところのロードボタンを押す
各レジスタの中身を見たいときは、セレクタを適切に選択した後、レジスタ3にロードするようにする
ALUを導入して加算を試すのが良さそう
C0をLに固定して足し算を確かめる
Day5
ROMの方のプロト作成
いきなりLEDが爆発する事件が発生
8bitのインバータみたいなやつ
セレクタがついていて、4ビット16個を選択できる
これが売ってないので、74LS138で代用する。こっちは3ビット分しかない 74LS138にはG1とG2がある
G1がLになるとどんなときでもすべてHになる(つまり無効になる)
G2がHになるとどんなときでもすべてHになる
もともとABCDという4ビットでセレクタとしたいところなので、ABCはそのまま3ビットセレクタにつないで、DがHかLかで、2つの74LS138のどちらかを選択するようにしたい
1番目は、DがLの時、2番目はDがHの時に使うようにしたい
なので、
Dを1番目のレジスタのG2につなぐ(DがHのときは無効にする。Hのときに無効にしたい場合はG2に入れる)
Dを2番めのレジスタのG1につなぐ(DがLの時には2番目のレジスタは無効にする。Lの時に無効にする場合は、G1に入れる)
Day6
回路図考えてた。むずい・・・
後、ダイオードをアレイ型に改造するのにはんだごてデビューした。
後、μUSB電源のDip化もできた。
Day7 - 8
いよいよ本格的に基盤を組んでいくことに
まずは電源と7穴のピンソケットのみ
https://gyazo.com/7bea7cb4f1163949b5a8f5e1b2951f38
ユニバーサル基板だと配線が限られるので、事前にノートに下書きをして回路を考えてからと思っているが、一回作りはじめてみないと色々わからないので、クロックジェネレータとリセット回路から作っていくことにした。
表からパーツを挿すわけだけど、当然ハンダゴテをするときは裏返す必要があるので、表の回路と裏の回路どちらもないとこんがらがる事に気づいた。
なかなか難しい。裏の回路だけでいいかもしれない
ともあれ、パーツの位置を大枠決めたので、どんどん基盤にくっつけていく。
と思ったがクロックジェネレータがなかなか動かない。ショートしてるかどうかは、テスターで0Ωでピーとなるやつで確認して都度都度通電も確認して行くと良い。
エナメル線は、事前にハンダにくぐらせてメッキしておくとつけやすいということがわかった。
後、最初は、ガッツリ3穴ぐらいでエナメル線を貼り付けていたけど、一山でちょんとくっつく程度でもしっかり固定される事がわかったのと、そのほうがきれいに配線できるのでその方法でやっていった。
なかなかうまく動かなかったが、最後に1Hzと10Hzがきれいに動いてくれた
次の日になったが、手動クロックも完成して、ついでに、クロックが動いてることが確認できるLEDも基盤に配置した。
https://gyazo.com/9a635debfae5d1e0e7f7346d5f5bd78c
Day9
リセットボタンの作成
この辺は同じような感じでスムーズに行けた
Day10
まず最初に、レーンを間違えてICソケットを挿してしまう。
はんだ付けもしていたので、外すのに一苦労というか、つらすぎた。
ハンダ吸い取り線がとにかく吸ってくれない。
Twitterでアドバイスを貰ったところ、フラックスを塗らなきゃだめよということで、フラックスを塗ったことでスムーズに作業が進められた・・・感謝 その後狭いながらもなんとか作業をすすめるも、なんと4つのICのQA/QB/QC/QDをつないでしまう事件が起きる・・
https://gyazo.com/875200ed1e9c95e30ca161fe7c1573c0
ほんとA/B/C/Dを繋がないといけなかった・・・・
泣きそう。多分3時間分ぐらいの作業が飛んだ・・・
まぁ・・ハンダゴテ技術がだんだん向上してきてる気もするので良しとする・・・・・・
ハローワールドが切るようになったタイミングでコンパイラを作り出すみたいなもんって言われたのは確かにそうかも知れないという気持ちになってきた。
完成するんだろうかこれは・・
Day11
全部で4つのICのABCDの接続をする作業
狭い回路の中で、ハンダゴテ作業に泣きそうになりながら、投げ出しそうになりながら完遂
コツとして発見したのは、先に先端を接続しておいて先端をハンダで仮止めしておいて、ブリッジのように接続するようにすると、A - A - Aと接続するときに2回接続しなくていいし、狭いところで作業も一回になるので良い感じ。先端も心なしガチっと止まってる気がする
https://gyazo.com/31cb8982c5bd2a32b62d87cd87cc9367
というわけで、全部の接続ができたので、テストということでLEDをQA/QB/QC/QDに接続してテスト
うまく動いている様子。LOADは最初ボタンで設置していたが、線だけ出して、外のブレッドボードでテストするようにした。
https://gyazo.com/c995fa5e2b77d6da4192c1101ac45486
Day12
ダイオードアレイを作る
16個必要
足を挿す隙間がないのでくっつけてスペースを作るため
https://gyazo.com/ccc575c5a865513efe76e3610b6fed68
Day13
A/Bのセレクタは外部にボタンを置いて、ABがLのときはレジスタ1AがHのときは、レジスタ2の中身が出力されることを確認した。
配線は、VCC/GNDの線に添わせて作っておくのが良いのでは?と思っているがどうか・・・?
https://gyazo.com/4fedbdd95f31c939e945f040b114dfaf
Day14 - 15
デコーダ周りの実装完了
回路設計結構大変だったが、うまく動いた
https://gyazo.com/c99a52efc4608da61647045f12eb25aa
流石に接続が多すぎるので、事前にICとその接続周りを紙に書いて整理して、後、ブレッドボード上でもテスト実装した。
https://gyazo.com/22a57067aa7a745e8178de7e46ec841f
配線だいぶうまくなった(最初:上、最新一番下)
https://gyazo.com/5dd88ae684c28d0c855b6415c6aceab4
138LS
ABCをそれぞれ接続すると微妙にもう片方から電流が染み出してる様子・・?
https://gyazo.com/93bf9d5e26131edfe0e7b68e66752bb6