2017年5月5日金曜日

論理回路シミュレータで8bitCPUを作ったお話

※この記事はエッセイ的な感想です

1.概要

  一昨日「logisimでTD4を再現したお話(ポエム)」を書いたときに作ったCPUは完全に『CPUの創り方』に載っていた回路をlogisimに落とし込むだけだったため,設計らしい設計はしませんでした.

  なのでGWのパワーを借りて8bit CPUを作ってみました.こちらが動作しているときの動画です.なまえは適当にTM8にしました.
  これは9!を計算するプログラムを動かしています.結果がこんな感じに出ます.
  多倍長整数みたいに10進数で計算して繰り上がりをやって~みたいな処理になっています.なので1byteにつき一桁分の情報が入ってるので上みたいな感じに9!が362880と出力されます.

  今回はRAMやROM,乗算器や除算器,マルチビットの伝送路などlogisimのパワーで殴ってみました.なので若干のブラックボックスが存在したりしてます.そのへんはおいおい勉強していく所存ですかね……

  この下にはデコーダとかを作った際の過程を適当に書いていくつもりです.回路とかアセンブラ,プログラムなどはGitHubに投げてます→ここ

2.レジスタ

  レジスタはこんな感じになってます.
  logisimに画像エクスポート機能をなんてものがあるんですね.大変便利.レジスタは8つあるのですがFは比較結果を代入する用,Gは出力用,Hはプログラムカウンタになっています.また命令デコーダを作るのがめんどくさすぎたので,EレジスタはRAMを読み書きするようのポインタになっています.

  select_a,select_bはALUに送るデータをどれにするかを決めています.inputは命令に手入力だったりイミディエイトデータだったりします.dataは演算結果です.

  レジスタの回路はlogisimで用意されていたやつです.

3.ALU

  ALUはこういう感じになっています.operationでどの演算結果を出力するかを決めています.
  乗算器や除算器はlogisimにあったやつを使ってしまったのでまた今度作りたいです.

4.デコーダー

  命令デコーダーはきつかったです(大嘘).いや,嘘ではないんですがメニューバーのProject>Analyze Circuitで真理値表を入れれば回路を勝手に作ってくれたので楽でした.その存在に気づくまでは頭を抱えましたが…….

  回路はこんな感じです.
  下の方はわりと頑張っていました.上の方は……設計をコンピューターに任せた部分とそうでない部分があったりします.かなり見づらいですが魔法の言葉「どーんいずべたーざんぱーふぇくつ!!」を積極的に叫んでいきます.

  参考までにSelect_b専用のデコーダーを貼っておきます.
  多分カルノー図書いてNOTとANDで適当に組んでORで総和を取るというアルゴリズムだと思うのですがここまできれいにできるとは……という感じです.真理値表を入れればものの数秒で作ってくれるので凄いなーという感じでした.

  余談ですがこういった数学モデルがきちんと確立している分野って人間の入り込む要素があまりないですね.そういう点で情報工学の分野は優れているし発展が早いんだろうなと思いました.早くなにかを設計するプログラムを書いて100億円ほしい!!!!!!

5.アセンブラと命令

  命令はエクセルで適当に作っていきました――がだいぶスカスカです.というのも手でデコーダーを作るつもりでいたので命令を結構少なくしました.早い段階で自動設計の存在に気づいていれば……という感じです.

  ついでにアセンブラもエクセルで作りました.ラベルをつけたりコメントアウトができたりと便利です.割りと力作.
  実はアセンブリ言語は今までさっぱりだったのですが,ここで始めてまともに使いました.始めてまともに使ったアセンブリ言語はお手製です(?).今日9!を計算するプログラムを書いた感想としては,人間の書く言語じゃないなってことぐらいですかね.早くコンパイラを作ってみたいです.

6.感想

  まさか先週『CPUの創り方』を買ったときには,1週間ここまでできるとは思いませんでした.確実に挫折するか,手を動かさずに終わるんじゃないか……と思っていました.おそらくここまでできたのは①この本がすごい,②出会えたフリーソフト(logisim)がすごい,③たぶん今まで学んできたことがいい感じに組み合わさった,の3つの要因があると思います.本の著者とフリーソフトの作者に感謝です.