先に参考文献を書きます。僕が図書館で4ヶ月ぐらい延滞するぐらいには素晴らしい本です。ちゃんと買いもしました。
- CPUの創りかた | マイナビブックス
https://book.mynavi.jp/ec/products/detail/id=22065
締め切りが迫っているので回路図から実装します(本の順に作成しません)。Pythonで実装することになんの意味があるんだと思われるかもしれませんが。でも4bitの世界にPythonで挑むのは結構面白かったです。
primitiveなICを使ってる感じを出すためにclassを使い、そしてinstance同士をくっつけるとイイ感じに配線してるぞ〜感が出ると思うのでやる気を出すためにそんな感じの野望を抱いておきます。あと早く終わらします。
ICの野望
| |
だいたい抱いた通りに実装できました。直接IC.pins[n]をtupleに入れて代入するだけだと代入できなかったのでobjectごと渡しています。
命令Decoder
74HC10(NAND)と74HC32(OR)で構成されています。ICをPythonで書くなんてことはしたことないので楽なそうなものから消化していきます。p242の真理値表を出力するよういい感じにclassを作ってinstance同士をくっつけていきたいと思います。しっかりと実装できていれば適当に拵えたtest programで一発で確かめられますが、真理値表の項目名が昇順に並んでいないことに気付くまで手間取りました。
| |
この二つの関数のみ完全に重複しない数の組\((a, b, c)\)と\((o)\)をそれぞれ入力と出力にもち(つまり独立した)、完全に外部の出力(external)だけで完結するためExternalICと名付けたのですが多分違う意味に取られるだろうし後になって考えたら他のICも普通に外部の入力で決まったので名前決め失敗ですね。_74HC10classと_74HC32classはこのclassを継承させてfuncにNANDかORを渡すことでつくりました。
ALU
全加算機を実装してもいいのですが日付を周りそうなのでPythonの機能を使い逃げます。
| |
pin番号が昇順なのか降順なのか分からなかったのと、五桁になるのに調整するのを忘れていたのでOut of Rangeと言われ少し手間取りました。
Data Selector
眠くなってきてdata selectorが何か思い出せなかったので本を少し読み返したりして時間が掛かりました。多分\(n bit\)に対して\(log_2 n\)本必要なんだろうとも考えましたが対数を忘れてしまったので分かりません。
| |
Register
慣れてきたのでこいつが一番楽でした。
| |
Program Counter
こいつのせいで睡眠時間が30分は失われました。
二進数で数え上げをするのがダルすぎるし、clock(loop)のどこでcount upしたらいいかの勝手がわからなかったので試行錯誤する分時間を取られました。EPROMとかがあるならこれも一つのICだよねってことで(あと流石にPythonを使ってるのにROMの読み出しまで実装したら過労死してしまうので)回路図の"ROMへ"の先はすべてPythonのlistとかで実装しました。ROMの出力の昇順降順を履き違えたのも痛かったです。
| |
dataにあるのはtestに使ったのはLチカです。
Carry Flag
clockが立ち上がった時にresetされないと思うので74HC283と74HC32は直接繋いでます。時間がなくてJNC命令のtestをしていないのでまだ分かりません。
配線&debug
地獄。配線は回路図と睨めっこ。debugはtest programを走らせ、想定と違う挙動をしたら全てのICのpinの状態を出力してあるべき姿と照らし合わせます。
| |
配線は以上のように全部手打ちでtupleの山を記述していきます。半田付けよりは楽ですが明らかにbread boardの方が楽ですね。でも無極性電解Kondensatorを手に入れるのがダルすぎたので…
振り返り
制作時間は四時間でした。眠かったのでコードが雑ですね。mapとかはもっと使うべきだと思います。あとカタカナで横文字を書くのが嫌なので本文ではアルファベットで書いてみました。長いし打ちにくいので。でもテストとかは別にカタカナでもいいと思ったので所詮慣れかもしれません。ここで作った仮想TD4は文化祭で展示するかもしれません。クロックがめちゃくちゃ自由に設定できることぐらいしか本家に優っていませんが…