* プラレールで動くCPU
プラレールのシミュレータ上で動く4ビットCPU。13200レールくらい。サイズは 40m x 40m くらいなので、うまく折りたためば体育館とかに入りそう。

上の方に8個並んでいるのが4ビットのプログラムカウンタと汎用レジスタ。それぞれを操作できるけど、できるのは代入とインクリメントだけ。
下に縦に並んでいるのがプログラムメモリで、8ビット単位で読み出すようになっている。その右側に命令デコーダがあるけど、代入とインクリメントだけなのですごく単純。レジスタのオーバーフローフラグによって代入をするかどうか指定できるようになってるので、一応条件付きジャンプができる。命令は8ビット固定長。Intel 4004互換にしようと思ってたけど、レールの配置の都合で変わってしまった。NOP, INC, LDM, ISZ 相当の命令が動く。
アドレスは4ビットだけど実装したメモリは32バイトだけ。無駄が多いのでもう少し面積を小さくしてメモリを増やしたい。
実際の速度で動かすと1命令の実行に1時間以上かかりそう。クロック周波数として表すなら200μHzくらい?
* プラレールでコンピュータを作りたい
月曜日に書いた通り、プラレールで遊んでたら計算機を作りたくなってタカラ・トミーのサイト見てたら「自動ターンアウトレール」という便利そうなレールがあるのに気付いた。
プラレールでコンピュータを作りたいのだけど、まずはコンピュータ上でプラレールのシミュレータを動かして論理回路をシミュレートしたい。
シミュレータを探してみたのだけど、レイアウト作成だけで動作を確認できなかったり、レールが数千~数万本の複雑なレイアウトを編集できそうなものが無かったので、ブラウザ上で動くものを作った。
GPT-5.6 Nanoだけ使う縛りで作ってみた。苦労したのはレールのベジェ曲線の扱いくらいだった。すぐ指定した座標系やスケールを無視して変な形のレールを描画しがち。それ以外はすぐ動くものが出てきたので、細かい使い勝手を色々調整しただけ。
以下は自分用のメモで、役に立つことは何も書いてないです。
プラレール論理回路
プラレールの分岐ポイントは分岐先側から列車が進入すると向きが切り替わるので、読み書きが可能なレジスタとして使える。
計算するためには、分岐の組み合わせによって0/1どちらかのレールにたどり着くようにする。
以下のようなルールを統一しておくと後々楽。
-
ゲートの入力側は切り替えポイントを使ったレジスタを置く
-
入力側から入ってポイントを切り替えた列車は専用の分岐から出てくるように
-
出力は READ 用の入り口から入った列車が 0/1 のどちらかのレールから出てくる
-
1回で状態を決められない回路はある回数READに列車を入れると必ず目的の状態になる
他にも列車を複数走らせて衝突して止まるかどうかで計算できるかもしれないと考えたけど、現実にやると脱線したり速度依存で不安定そうだったり計算過程で列車が大量に必要になるのでやめた。
NAND
まずは基本のNANDゲートだけど、これは簡単。

ちょっとずるをしていて、緑色になってるレールは切り替えポイントが固定されていて逆側から列車が進入しても状態が変わらないようになってる。
公式のレールだけで作るなら「自動ターンアウトレール」とかの分岐の切り替えを設定できる特殊なレールが必要になるのだけど、プラレールにはまったことあるなら、ポイントの黄色いパーツを外して切り替わらないようにしたり、輪ゴムとテープ等で決めた状態に固定して使ったことがある人も多いはず。(絶対欲しくなるのになんでないんだろ?)
あと、シミュレータは高架も扱えるようにしたけど、レールの衝突判定をしてないので、回路は平面で作ってしまった。
上の画像だと、各入力の書き込みに使った列車を使い捨ててる富豪的な配置をしているけど、実際には回収用の分岐から取り出して次の回路に向かわせて一つの列車だけで動かす必要がある。
値の複製
電子回路なら配線をつなぐだけで信号を分岐させることができるけど、列車は分裂しないので一筆書きで計算しないといけない。なのでNANDゲートだけだと足りない。
プラレールで計算機を作りたいと夢見た人は世の中にたくさんいるので、探せばわかりやすい説明が見つかる。
以下のリンク先の説明がとても分かりやすい。
同じ分岐ポイントから2回読み出して、自動ターンアウトレールで1回目と2回目で行き先を変えている。

内部の切り替えポイントの初期状態を注意深く設定すれば特殊なレールは無くても可能なのだけど、実行前に状態をリセットする必要があって不便なので、リンク先と同じ仕組みにした。
XOR
さっきの分岐回路とNANDがあれば何でも計算できるので、つないで不要なものを省きつつXORを作る。

半加算器
コピペしてつなげるだけ。

まだレール数は583本だけど1画面で全体を俯瞰するのはこの辺が限界。
現実のプラレールだとここからが大変だけど、今回はコピー&ペーストで並べて繋いでいけば、Nビット加算器ができる。