TJD4 vol.0 イントロダクション 汎用ロジック自作icだけで作るcpu
突然ですが,cpuを制作します.
なぜ?おもしろそうだから.
Arduinoに関するものを探していたところ,CPUの創り方という本を大学の図書館で見つけました.
読むとハードに詳しくない私でも完全に理解した気になれたので,この勢いのまま本当に動くcpuを作っちゃおう,というわけです.
スペック
みなさんここが一番気になるところだと思います.
前述のとおり,書籍「CPUの創り方」で取り扱うTD4をベースに,各種能力を実用に足る程度に補強しています.
参考までにベースのTD4,電卓用cpuとして一世を風靡したIntel 4004(1971)と比較します.
スペック
基本設計
TJD4 : 4-bit RISC(?)
TD4 : 4-bit
4004 : 4-bit
クロック周波数
TJD4 : 1命令1クロック,1Hz / 16Hz / 256Hz / 4096Hz 可変周波数
TD4 : 1命令1クロック,1Hz / 10Hz / スイッチによるステップ動作
4004 : 1命令8クロック,500,000Hz ~ 741,000Hz
レジスタ(プログラムカウンタ,フラグレジスタ含む)
TJD4 : 4ビット x7 (アキュムレータ4ビット x1,汎用レジスタ4ビット x3,フラグレジスタ4ビット x1 (Carry,Zero,Equal,Input),プログラムカウンタ4ビット x2(上位4ビット,下位4ビットで合計8ビット表現))
TD4 : 4ビット x3,1ビット x1 (アキュムレータ4ビット x1,汎用レジスタ4ビット x1,プログラムカウンタ4ビット x1,フラグレジスタ1ビット x1(Carry))
4004 : 4ビット x18,12ビット x4,1ビット x1 (アキュムレータレジスタ4ビット x1,汎用レジスタ4ビット x16,コマンドラインレジスタ4ビット x1,プログラムカウンタ12ビット x1,スタックポインタレジスタ12ビット x3,フラグレジスタ1ビット x1 (Carry))
ALU
TJD4 : 加算,減算,AND,OR,NOT,比較,スルー
TD4 : 加算のみ
4004 : TJD4の機能に加え,10進数に特化した処理が多数
ROM容量
TJD4 : 256ワード (1ワード = 10ビット)
TD4 : 16ワード (1ワード = 8ビット)
4004 : 256ワード (1ワード = 8ビット) ※Intel 4001
RAM容量
TJD4 : 16バイト (1バイト = 4ビット)
TD4 : 0バイト (レジスタをRAMと捉えると2バイト?)
4004 : 80バイト (1バイト = 4ビット) ※Intel 4002
こんな感じのcpuを作っていこうと思います(...なーんかレジスタのとこ見づらーなんて)
基本設計は4-bitRISCと書きましたが,そもそもCISC的な思想が出るような次元の話ではないので,とにかく単純な動作をしてくれるように考えました.
命令は全て1命令1クロックで動作します.パイプライン?なんすかそれ.cpuを停止させるHLT命令や一定時間待つSLEEP命令は実装しません.というかするとなると回路規模がでかくなるので...
動作周波数は4MHz(2^22Hz)の発振子をカウンタで分周しまくってそれぞれの周波数をセレクタで選択しクロック周波数とします.
16の倍数にした理由は,スリープ処理をNOPのfor文で考えたときに都合がいいからです(わかるかな?).
ALUについては74181を使用したかったのですが,no recommend for new design とかなんとかでもう入手できる状況ではないので,全加算器やら,比較器やらを繋げてお手製ALUを作る予定.
あとはプログラムカウンタを8ビット化したので,ROMが256ステップ実行可能になりました.RAMも気持ちばかりの容量ですが実装します.TD4のプログラムを触った事がある方ならわかりますが,ROMとRAMの容量がさすがになさすぎて...これがチューリング完全の代表ともいえるcpuか???という感情に苛まれます.
実用的なアルゴリズムの実装はおおかたできませんから,この改良は一番最初に思いつきました.
その他にも,命令でイミディエイト値以外を扱えるようにし,ある程度の実用性は確保しているつもりです.
つまりどーいうことなの!?
設計図,っていうんですかねー?
なんていうのか知りませんが,全体のハードウェア的性質をまとめたものがこちらになります.一部デジタルですが,基本的に思考は紙に書く性分ですので,汚い字はすいませんねー...
cpu命名「TJD4」に込めた思い
なんかずいぶんと仰々しい見出しですが,かなーり浅いです.
まず今回のベースとなったTD4,これはToriaezu Dousasuru 4bitcpuでTD4という名前になっていますが,今回のJには「実用的に」,という意味で付けたいと思います.
よって,とりあえず実用的に動作する4ビットcpuということでTJD4とします!
今後の予定と目標
とりあえず3月まで全力で走ってみようと思います.
電子工作は簡単なものにしか手を出していないので,予想以上に制作は遅れると思いますがよろしくお願いします.
一か月以上更新がなければ,,,そういうことです.
記事はある程度のまとまりが完成してから書こうと思います.
目標は今のところ円周率を導出するプログラムの実装...ですかねー?
まま,初学者が悪戦苦闘するのを楽しみにしていてください.
質問やアドバイスがあれば是非コメントしてください.