見出し画像

僕の歴代赤石CPU(NXREDJ系)

前回は、NX REDのBEの赤石CPUたちをご紹介しましたが、今回はJEの赤石CPUたちをご紹介したいと思います。


〜JE初の赤石CPU〜

僕は、2022年の最後の3ヶ月の間、371ttiさんの赤石サーバーで信号強度式のCCA(加算機)などを研究していました。
そこでぬんさんと出会いましたが、彼も僕と同じようにCPUやプログラミングに興味があったみたいだったので、彼にプログラミングなどに使えるように赤石CPUをプレゼントしたいと思い、JEで初めての赤石CPUの制作を始めました。

また、この赤石CPUは、これまで僕が作ろうとしてきた(ほとんどが失敗作)赤石CPUと比べ、構造が簡単で分かりやすいようにしたかったり、そもそも失敗作にならないようにするため簡易的な構造にしようと思い、メモリは最初から搭載・接続することは想定せずに製作していきました。

製作途中のNXREDJI

完成したかと思ったら、プログラムカウンタなどにミスが残ってて、条件分岐命令を実行した際、フラグの結果次第では条件分岐命令の次の命令は実行しない場合があるのに、条件分岐命令の次の命令を確定で実行してしまうなどの不具合が発覚しては修正を何回か繰り返しましたが、二連続で条件分岐命令を使うことができない不具合(仕様、、?)以外は、無事修正できました。

製作途中の夜のNXREDJI

なんとかMinecraft Java editionのworld editというMODを使って、ぬんさんにNXREDJIを送ることができましたが、実際になにかをプログラミングするのは難しかったみたいです。

NXREDJI
スペック
8bit
クロック周波数:0.23Hz
ALU:加減算、インクリメント、デクリメント、XNOR
アキュムレータ:無し
レジスタ:16Byte(15Byte)
I/Oポート:1ポートずつ
データキャッシュ:無し
メモリ:無し
命令キャッシュ:無し
ROM:192Byte(命令64個分)
PC:6bit
回路サイズ:66×46×44
高速化技術:無し
日付:2023年1月10日~1月16日

NXREDJIという名前は、もともとは僕がBEで作っている「NX RED」と同じの「NX RED JI」という感じにしたかったのですが、world editのschematicコマンドの名前に空白を入れることができなかったので、「NXREDJI」となりました。
NXREDJIはもともとプログラミングしやすくする目的でROMがトーチ式となっていて、その影響でROMやPCは珍しく横型となりましたが、結果的にはちゃんと動く赤石CPUが作れたので、よかったと思います。
ですが、このNXREDJIをきっかけに、JEで簡易的な赤石CPUを作るのにはまっていってしまいました。

影MODで撮影したNXREDJI

~クロック変動に挑戦~

赤石CPUの命令にはいくつか種類がありますが、実は命令によって次の命令を実行できるようになるまでにかかる時間が違うことがあります。
NXREDJIではクロック周波数は変動することがないため、一番時間がかかる命令にクロック周波数が合うように設定しています。
ですが、それは比較的時間のかからない命令を実行した際も低速のクロックで動き続けるということになり、無駄な時間が生じてしまいます。

そこで、無駄な時間を減らすためにあまり時間のかからない命令を実行したときはクロックを上げ、必要ならクロックを下げる
という制御を採用しようとしました。

イメージ
通常演算は10rtで完了し、条件分岐は50rtで完了する場合
NXREDJIは通常演算も低いクロックのままなのに対して、
NXREDJIIは必要に応じてクロックを変動させることで、無駄な時間を減らし、
同じ時間でもNXREDJIより多くの命令を実行できている

ですが、赤石CPUはALU(演算装置の一種)やPC(記憶装置の一種)などのパーツが互いに通信していて、一部分だけ見ると簡単でも全体的にみると複雑になっています。
そのため、赤石CPU全体を制御しているクロック回路の周波数を変えるというのは、すごく大変だったのを覚えています。

実際に完成した赤石CPUのクロック回路の構造は、クロック回路自体は赤石CPUのもっとも高い周波数に合わせて設定し、クロックを下げる必要があるときにクロック回路の信号を遮断することで疑似的にクロック周波数の変動を再現しました。
下の画像は実際のNXREDJIIの制御回路の一部です。
赤の部分は常に最も高いクロックで動いていますが、青の配線が必要に応じて赤のクロック回路の信号を遮断することで、黄色の矢印の部分はクロック周波数が可変します。

赤丸はクロック回路(クロック周波数は固定)
青の矢印が必要に応じてクロック回路の信号を遮断する信号

NXREDJII
スペック
8bit
クロック周波数:0.56~0.19Hz
ALU:加減算、インクリメント、デクリメント、XNOR、AND、論理右シフト、右ローテート
アキュムレータ:無し
レジスタ:16Byte(15Byte)
I/Oポート:3ポートずつ
データキャッシュ:無し
メモリ:無し
命令キャッシュ:無し
ROM:216Byte(命令64個分)
PC:6bit
回路サイズ:73,49,48
高速化技術:クロック変動
日付:?~2023年1月16日〜2023年1月27日

NXREDJII
「RPB」の裏に回路はないので、赤石CPUの回路サイズには含んでいません

NXREDJIIの制御回路は、高速化のために複雑な制御となったため、NXREDJIよりも大変でした。
ですが、今後もいろんな機能を追加したいと考えていたので、さらに制御回路は複雑になり、製作時間も製作難易度もどんどん上がっていく予感がしていました。

~8bit兼16bit~

NXREDJIIは一応完成しましたが、実は二連続で条件分岐を実行できない などの問題を引き続き抱えていました。
ですが、それは次世代のNXREDJIIIで解決しようと考えました。

NXREDJIIIは、8bitと16bitを兼用できる赤石CPUとして作ろうと思っていました。
その理由の一つに、同じ時期に371ttiさんが8bit ALUを使って疑似的に16bit CPUを作ろうとしていたからです。
彼の16bit CPUの構造は、8bitのデータを二回送ることで疑似的に16bit化していました。
そこで、僕はこれを上手く応用すれば8bitと16bitをうまく切り替えながら処理できるようになるのでは と考えました。
そこで、NXREDJIIIの開発が始まりました。

ですが、実際はそんなに簡単なものではありませんでした。。。
そして、やむを得ず16bitの機能は諦め、8bit CPUとして一応完成させました。
ですが、本来の目的の達成はできなかったので、NXREDJIIIはほぼ失敗作なのです。

NXREDJIII

スペック
8bit
クロック周波数:0.5~0.25Hz
ALU:加減算、インクリメント、デクリメント、XNOR、AND、論理右シフト、右ローテート
アキュムレータ:無し
レジスタ:16Byte(15Byte)
I/Oポート:それぞれ3ポートずつ
データキャッシュ:無し
メモリ:無し
命令キャッシュ:無し
ROM:336Byte(命令64個分)
PC:6bit
サイズ:69,50,44
高速化技術:クロック変動
日付2023年2月2日〜2月11日?

~マルチROM化~

NXREDJIIIの方法での高速化は失敗に終わってしまいました。
なので、今度は違う方法で赤石CPUを高速化させようと考えました
それが、マルチROM化です
ROMを二つにして、二つのプログラムを同時に並列処理することで、同じ時間でも倍の量の命令を捌けるようにしようと考えました。

NXREDJIVのROM

ALUやレジスタは、2rtの信号があれば演算できるので、たとえば0.5Hzで動かしているときは2rt分演算して、18rt分遊んでいるということになります。
JEなので、トーチが焼き切れないように若干の休憩時間も必要ですが、あまりにも無駄があるように感じるので、この時間も活用し演算し続けられるように、ROMを二つ使い、交互に命令を読み出し実行させました。
これによりクロック周波数は2倍になり、遊んでる時間も18rtから8rtへ減るので、無駄が減っています。
さらに、NXREDJIVのALUと配線を改良することで、これまで16rt毎にしか演算出来なかったのに対して14rt毎に演算が可能になり、さらにマルチROM化の相乗効果で最大クロック周波数は約1.4Hzまでアップしました!

NXREDJIVの各回路のレイアウト

スペック
8bit
クロック周波数:1.4~0.36Hz
ALU:加減算、インクリメント、デクリメント、XNOR、AND、論理右シフト、右ローテート
アキュムレータ:無し
レジスタ:16Byte(15Byte)
I/Oポート:それぞれ3ポートずつ
データキャッシュ:無し
メモリ:無し
命令キャッシュ:無し
ROM:208Byte×2(命令64個分×2)
PC:6bit×2
サイズ:69,49,85
高速化技術:クロック変動、極度細粒化、マルチROMシステム
日付2023年2月12日〜3月10日?

NXREDJIV

~そして、クロック周波数はJE最速の座へ~

NXREDJIVで大幅な進化を遂げたNXREDJシリーズ、実際に僕がずっと跳ね返る何かと呼んでいるテストで動かすプログラムの速度で、NXREDJIIIに倍以上の差をつけて圧勝しました。
ですが、僕はまださらに先の世界があるかもしれないことを知ってしまいました。
ある日371ttiのレッドストーンサーバーに行ったとき、彼の赤石CPUに見たことがない回路が付いていました。
それが、アキュムレータとの出会いでした。
そして、このアキュムレータを使って、NXREDJVではさらに高速化させようと考えました。
ところが、アキュムレータによってALU周辺の速度はさらに約二倍になりましたが、ROMなどの周辺の回路もその速度に耐えられるようにする必要があったため、すごく苦戦しました。
ROMとPCをつなぐ配線を極限まで低遅延化させたり、とにかく大変で、何度も作り直しました。
その結果、バージョン4でようやく完成しました。

NXREDJVの失敗作たち(左の二つだけが完成品)

また、NXREDJVもNXREDJIVと同様に2ROMを採用しました。
実は3ROM化なども考えていましたが、結果的には2ROMになりました。

NXREDJVのROM

スペック
8bit
クロック周波数:5~5.6(0.2?)Hz
ALU:加減算、インクリメント、デクリメント、XNOR、AND、論理右シフト、右ローテート
アキュムレータ:無し
レジスタ:64Byte(31Byte)
I/Oポート:それぞれ7ポートずつ
データキャッシュ:無し
メモリ:無し
命令キャッシュ:無し
ROM:248Byte×2(命令64個分×2)
PC:6bit×2
サイズ:84,62,103
高速化技術:クロック変動、極度細粒化、マルチROMシステム、アキュムレータ
日付2023年3月11日〜5月10日?

NXREDJVの内部

NXREDJ系の赤石CPUは今のところこれで全てです。
途中まで作っていたけどほぼお蔵入り状態のNXREDJVIもありますが、NXREDJVIの詳細は、完成してから公開したいと思っています(完成する確率はかなり低いから、実質的には世に出ないまま忘れられる可能性もあります())。
ですが、NXREDJVが高性能すぎるところもあるんですよね、、、
NXREDJVの性能が高すぎて、実際この時期を書いている2024年4月23日の時点ではこの赤石CPUにずっと跳ね返る何かの動作速度で勝てる赤石CPUはありません。
NX RED VIは最高10Hzで駆動可能ですが、条件分岐の速度がNXREDJVの方が圧倒的なので、実際にいろんなプログラムを動かす際はどうしてもNXREDJVのほうが早くなってしまうんですね、、、
NXREDJVIではNXREDJVを速度で超えることがほぼ絶対条件なので、この赤石CPUを超えるのがそもそも難しすぎるんです()。


この記事が気に入ったらサポートをしてみませんか?