動作するCPUを作る。動作するCPUを作る。ジャンプ命令の難しさBrainfuckという言語があります。これは8つの命令で演算をこなす言語です。ポインタの指すメモリが0でないならば、対応する[の次までジャンプする8命令は3ビットで済むため非常に簡単にCPUを構成できます。この言語は比較的有名です。この8命令でチューリング完全であるため、理論的にはすべての演算を行うことが出来ます。このためいろいろなアルゴリズムが実装されています。ハノイの塔、素数計算、そして一番やってみたいのが、マンデルブロー集合計算です。そこで、目標として・旧ソ連製ゲルマニウムトランジスタでCPUを作るということを考えました。作るのは無茶なので次のように進めます。・論理設計をLogisimで行う。・Pappilioでハードウェアを再現する・ICで作る・論理ゲートをシリコントランジスタで作り、回路の最適化をする・論理ゲートをゲルマニウムトランジスタで作り、回路の最適化をする・コアメモリを作る・ゲート同士の接続をLED-CdSにする先ずは論理設計を行います。Logisimは論理回路シミュレータです。AND,OR,NOTなどの基本的な回路のほかにメモリ、DFF、入力、出力モジュールがあり、視覚的に設計できます。階層設計が出来るためかなり複雑な回路まで作れます。このCPUは大きく分けて以下のユニットに分けられます。・RAM・RAMのポインタ(カウンタ)・プログラムROM・ROMポインタ(カウンタ)・クロック分配(4ステージジョンソンカウンタ)・8ビットAdder・8ビットラッチ・ゼロフラグ・ジャンプロジック><+-,.はすべて4クロックで行うことが出来ます。ロジックの構造は決まっていて簡単です。[と]はプログラムカウンタを操作するやや複雑な操作が必要です。「ジャンプする」とはどういうことか?他の製作事例では、ジャンプアドレスをあらかじめコンパイル時に計算しておきます。この方法はメモリが潤沢にある場合には有効です。私のCPUは数少ないトランジスタとメモリで構成するつもりのため、できるだけゲート数を抑えるように考えます。ジャンプを行う場合、一種のNOP(何もしない)命令を発行して対応するカッコまでやり過ごす手法を採用しました。この時難しいのは対応するカッコを見つけることです。[]が二重、三重になっていたら、どれが対応するカッコなのかが不明になってしまいます。マンデルブロー集合計算の場合は9レベルまで必要です。そこで、NOP命令が発行されるカッコの中で[の場合は+1、[の場合は-1を数える4ビットのスタックを持っています。これが0の時に現れるカッコが対応するカッコということです。この状態で3度か4度か考えましたが、タイミングが合わずうまくいきませんでした。ファイルはこちらになります。