今更ですがいつかやろうやろうと思っていたCPU自作に挑戦しました。
ただ実際にHWを作成するのはパーツ調達がめんどくさかったりハンダ付が苦手だったりでどうしても手が出なかったので、GUIの回路シミュレータでできないかな〜と探していたところちょうど良いものを見つけました。
それがLogisimです。
回路の0−1が一目でわかるUIと階層構造、ICライブラリがあることからこちらを選びました。
半田付けだと作業工程自体のミスとロジックのミスと切り分けるのが難しそうで、純粋にロジックと動作原理のみ勉強したかった私にとってこのチョイスは結果的に正解でした。
こちらの記事を参考にさせていただきました。
http://yoshi-s.cocolog-nifty.com/cpu/2014/08/logisim.html
デフォルトだと74系ICが入っていなかったのでライブラリを落としてきて、あとは書籍の回路図と睨めっこしながらせっせと配線をしました。(ROMは結局妥協しました。)
ラーメンタイマーを動かしている様子(GIFを圧縮したらカクカクしちゃいました)
つまづいたのは、Logisim環境構築でMACだと結局うまく動かなかったこと、283のキャリーフラグがどうやっても不定で1を出力してくれなかったこと(→内蔵のFAに変更して解決)、
74のプリセットピンが不論理じゃないことにいつまでも気づけなかったこと、くらいで作業自体は2日くらいで完了しました。
いや〜完成させると達成感がありますね。やってよかったです。
CPUの動作というのは全てレジスタ間でのMOV命令に還元できるということ、操作の肝はデコーダが命令をデータセレクタへの指示ビットへ変更していること、など基本的ですがやってみないと分からない、でもものすごく大事な気づきが得られてとても勉強になりました。
おまけ
CPU自作の方法論はこんな感じで分布していそうです。
HW自作
・FPGA
・ブレッドボード
・プリント基盤
SW自作
・VHDL
・回路シミュレータ(GUI)
・エミュレータ
さらにおまけ
TD4はクロックの立ち上がりで命令フェッチ、デコード、演算、書き戻し、プログラムカウンタインクリメントを全て行うようです。つまり1サイクル(クロック)で1命令。
ただ大抵のCPUアーキテクチャの本には1命令を4サイクルに分けてパイプライン処理をしていたりします。
この1命令を数サイクルに分けるというのが構造上必然的に生まれるものなのか、パイプライン処理を行えるようにデザインされているものなのかがよく分かりませんでした。
調べてみたのですが全然回答に辿り着けなかったのでこの辺りの知見をお持ちの方はコメントでひっそり教えていただけると泣いて喜びます。