フィボナッチ数列 その3

この記事はセルオートマトンによるCPU作成連載記事の21本目です。(2023/01/30)

今回は前回のフィボナッチ数列に改良を加えていきます。

ver.9

ver.9はROMを追加します。

前回までのフィボナッチ数列の回路では、処理する内容は制御回路に直接書かれていました。これをROMに移譲し、命令はバイトコードで表現するようにします。これまでの制御回路ではカウンタの値から処理内容を判定していましたが、制御回路ではバイトコードをデコードするようにします。

プログラムカウンタは命令のアドレスを表し、ROMにアドレスとして渡すようにしています。

バイトコードと処理内容の対応は次のようにしています。CPUでいう命令セットというものになります。

コード処理内容
1レジスタAにシグナルを流す
2レジスタBにシグナルを流す
3レジスタCにシグナルを流す
4出力制御0にシグナルを流す
5出力制御1にシグナルを流す
6出力制御2にシグナルを流す
252 nnnフラグレジスタが0の場合はジャンプ(ジャンプ先は次のコードの値)
253 nnnフラグレジスタが1の場合はジャンプ(ジャンプ先は次のコードの値)
254繰り上がりフラグをフラグレジスタにロード
255 nnn無条件にジャンプ(ジャンプ先は次のコードの値)

フィボナッチ数列を計算するコードは次の通りになります。ver.8の処理内容と同じです。

アドレスコード処理内容
0255 1212にジャンプ
24 5出力制御0と1にシグナルを流す
41 2 3レジスタAとBとCにシグナルを流す
74, 6出力制御0と2にシグナルを流す
9254繰り上がりフラグをフラグレジスタにロード
10253 2フラグレジスタが立っていれば2にジャンプ
123 1レジスタAとCにシグナルを流す
14254繰り上がりフラグをフラグレジスタにロード
15253 2フラグレジスタが立っていれば2にジャンプ
173 2レジスタBとCにシグナルを流す
19255 99にジャンプ

汎用的な処理ができるように書き換えてきた結果、回路が大きくなってきて、処理速度が遅くなってきました。このセルオートマトンの世界では単純に回路面積が広いほど処理速度が遅くなります。

オーバーフロー時の処理が早く見られるように233から始まるようにしています。

回路

ver.10

次のバージョンでは定数を命令の中に埋め込めるようにします。

これまでのバージョンでは、オーバーフロー時に1にリセットするときには、「1にリセット」専用回路を用意していました。これを任意の数にリセットできるようにします。数は命令の中に埋め込みます。

命令セットには次を追加しました。

コード処理内容
248 nnn固定値レジスタに特定の値をセット(値は次のコードの値)

フィボナッチ数列を計算するコードは次の通りになります。ver.9に比べ1という値をセットする処理が増えています。

アドレスコード処理内容
0255 1414にジャンプ
2248 1固定レジスタに1をセット
44 5出力制御0と1にシグナルを流す
61 2 3レジスタAとBとCにシグナルを流す
94, 6出力制御0と2にシグナルを流す
11254繰り上がりフラグをフラグレジスタにロード
12253 4フラグレジスタが立っていれば4にジャンプ
143 1レジスタAとCにシグナルを流す
16254繰り上がりフラグをフラグレジスタにロード
17253 4フラグレジスタが立っていれば4にジャンプ
193 2レジスタBとCにシグナルを流す
21255 1111にジャンプ

回路

制御回路の中央あたりがごちゃごちゃしてしまい、わけがわからなくなってきました。

連載目次に戻る