Brainfuck言語で動くCPUを作る
皆様一度はCPUを作ってみたいなぁと思ったことがあるんじゃないでしょうか?
普通はそう思うと思います。一家に必ず一台オシロスコープが常備されていますか?そんなわけないでしょう、うちにはあるけど。
Brainfuckとはプログラミング言語の一種で、わずか8つの命令で構成されています。無限のメモリ、無限のテープを想定することでチューリング完全性を持つおそらく最小に近い言語です。
そこで私は考えを温めていました。Brainfuck言語で動くCPUを作ることができるのではないか。
特徴を以下に挙げます。
・わずか8つの命令(3bitで表現可能)
・アドレスジャンプなど複雑な実装をしなくてもいい
・メモリの加算は+1のみであり、演算ユニットが非常に簡単になる
・RAMさえ用意すれば単純な構成ながら8-16ビット程度の大きな拡張が簡単にできる
これらのロジックの簡素に加えて拡張性もあることから、ハードウェア実装が非常に容易になると思いました。
また、Brainfuck言語はその特徴的な簡素さから注目されており、多くのプログラミング例があります。
貧弱な計算能力から、数学的な問題を解く程度に過ぎませんが、ハノイの塔、素数計算から、複素数計算によるマンデルブロー集合まで実装されています。一部にはOS開発が行われています。
私は前からゲルマニウムトランジスタを所持しており、それによってBrainfuckのCPUロジックを作成し、マンデルブロー集合を計算させられないかと思っていました。
ロジックシミュレータであるLogisim-evolutionを用いて動作可能なBrainfuckCPUを作成しました。
そこの知見から、74シリーズのロジックICとRAMを使用してハードウェアロジックでのCPUを実現しました。この時はデコーダのタイミング計算が難しくてArduinoをデコーダ代わりとしました。(たいていの場合制御系の方が早くて複雑です)
動作できるハードウェアから逆算した結果、およそ400個のトランジスタで8ビットのCPUを構成可能であると見出したため、その実現に向けてプロジェクトを温めています。
一気にゲルマニウムトランジスタで実装するには大量の問題が出てきます。速度の遅さ(Ft=1MHz程度)、Tr節約のため、フリップフロップを2Tr構成としたいがかなりトリッキーな回路とタイミングにする必要があるなどです。
そこで、スピードが保証でき、バイポーラ構成が容易なデジタルトランジスタDTA114, DTC114(Ft=200MHz)を使用することとしました。NT金沢のイベントにて一袋分いただいたためいくらでも使えます。
目標はBrainfuckCPUをトランジスタで実装し、マンデルブロー集合を計算することです。
マンデルブロー集合のプログラムは12kword, メモリ1024word、10億ステップとされております。ワード長16ビット、クロック1MHzでおよそ1時間で計算完了する見積です。
これくらいの速度であれば展示開始時にスタートしていい所で終われます。フリップフロップなどにLEDを配置して、計算が行われている様子をイルミネーションにできたら楽しいのではと考えています。
コメント
コメントを投稿