![見出し画像](https://assets.st-note.com/production/uploads/images/149687987/rectangle_large_type_2_5b96a8af0056ff3fcb949778eda9c72b.png?width=1200)
NATUを作る(パート33)
HARUは失敗に終わってしまった。
だが、その悔しさをバネに、新たにNATUを作ることになった。
今回は、条件分岐が出来るようにしていきたいと思います。
制作
フラグの解放
条件分岐命令が読み出されたときは、キャリーフラグを開放する必要があります。
このフラグは、普段は遮断されています。
ですが、条件分岐にはこのキャリーフラグが必要なため、解放します。
まずは、配線を繋げました。
この配線にも、こだわりが詰まっています。
![](https://assets.st-note.com/img/1722830265160-mkd7FudmZI.png?width=1200)
その一つが、ここから見たときに、一番端まで同じ高さを保っているところです。
高さに差があるので、途中で配線を上下に繋げる必要があるのですが、横から見たときに一直線のように見せています。
![](https://assets.st-note.com/img/1722830313031-Y1RPhZH5Dk.png?width=1200)
それでは、プログラムを書き込んで、遅延調整をしていきたいと思います。
あれ?なんで二回もキャリーフラグがオンになっているんだ、、?
どこかおかしい、、、
あ、どうやら、電源の赤石ブロックを置き時に、間違えてここのPCの初期値を決める回路のリピーターの遅延を変えてしまっていたみたいです。
![](https://assets.st-note.com/img/1722830575762-bxa3iM2ciG.png?width=1200)
ここは修正しておきました。
遅延調整が終わりました!
これで、フラグの信号を取り出す作業は終わりです。
![](https://assets.st-note.com/img/1722830840686-L9JreuVdMw.png?width=1200)
PC書き換え
条件分岐で最も大事な機能が、PCを書き換えられる機能です。
条件分岐は、フラグがオンだった時に指定した値にPCを書き換えることで実現します。
それでは、まずはフラグの信号をPCに伝える配線からやっていきたいと思います。
![](https://assets.st-note.com/img/1722832302124-vGtg16pAgQ.png?width=1200)
おお!
繋がりました!
それでは、次はジャンプ先のアドレスを伝える配線を繋げていきたいと思います。
![](https://assets.st-note.com/img/1722832682923-wYyA5KKSao.png?width=1200)
とりあえず、まずは下位4bitを伝える配線を通しました。
これから、遅延を調整していきます。
ええ、かなりの時間が経ちました。
なぜなら、PCにミスが見つかったからです。
その修正に、かなりの時間がかかってしまいました。
![](https://assets.st-note.com/img/1722833793447-41Ng2t6czI.png?width=1200)
ですが、無事修正が完了し、下位4bitのジャンプを成功させることが出来ました!
下の画像が、遅延調整後のアドレスを伝える配線です。
![](https://assets.st-note.com/img/1722833998400-0SinkdHjDv.png?width=1200)
それでは、上位3bitを伝える配線も通していきたいと思います。
![](https://assets.st-note.com/img/1722835364524-UPnNYKok9y.png?width=1200)
通せました!
どうやら、6個分の命令を仮で読み出すみたいです。
レジスタデリート
レジスタデリートがやることは三つあります。
・レジスタに保存しないようにする
・仮で読み出す範囲の条件分岐を遮断する
・アキュムレータの機能を停止させる
レジスタに保存しないようにする
ができました!
![](https://assets.st-note.com/img/1722835415013-WzOER16F9X.png?width=1200)
遮断する回数を6回に調整するために、回路を多少変更しました。
次は、条件分岐を遮断させたいと思います。
できました。
レジスタのところから、配線を伸ばすだけだったので、すぐ終わりました。
![](https://assets.st-note.com/img/1722831140730-FJ9NMbNAIr.png?width=1200)
条件分岐を連続させても、問題なく遮断できました。
それでは、最後にアキュムレータの動作を制限する配線を通したいと思います。
この配線は、RDAバグの対策用の配線です。
ちなみに、対策前の状態でバグが発生するプログラムを動かしてみたところ、しっかり不具合が発生しました()
あ、今気づきました。
なぜか、どれだけ遅延を調整しても、タイミングが合わなかったんです。
![](https://assets.st-note.com/img/1722836955538-Wk82yVC15K.png?width=1200)
でも、その理由が分かりました。
フラグの信号は1rtだけど、アキュムレータは2rtだからだ!
なので、マルチスレッド対応の回路で1rtのパルスを2rtのパルスに伸ばします。
![](https://assets.st-note.com/img/1722837156741-PWKI23pn5U.png?width=1200)
![](https://assets.st-note.com/img/1722837158958-9kJIpwUQwU.png?width=1200)
この回路で、信号を伸ばしました。
いい感じの見た目だと思っています。
そして、ついに遅延が合いました!
回数調整
レジスタデリートの回数を調整したら、回路がここまで大きくなってしまいました。
![](https://assets.st-note.com/img/1722837618747-kBC3q0kmDw.png?width=1200)
いろんな関係で、遮断する回数が6回から7回になりました。
最初の一回目は条件分岐のみを遮断していて、最後の一回はレジスタ保存のみを遮断しています。
実際に動かしてみましたが、これが一番よさそうです。
最後の一回の遮断で、必要な条件分岐も遮断してしまうのではないかという疑問がありましたが、条件分岐は最初に演算命令を実行してから、その結果をもとに条件分岐する仕組みなので、問題ありませんでした。
軽くテストをしましたが、RDAバグも、その他のミスもなさそうです!
最後に
今回は、無事条件分岐の機能を取り付けることが出来ました。
仮で設置していたこの回路は、壊しておきましょう。
![](https://assets.st-note.com/img/1722839139249-sjbXeBbkjG.png?width=1200)
それでは、次回はテストプログラムをいくつか書き込んで、実行してみたいと思います。
今回は、約2時間半の作業でした。
お疲れさまでした。
それじゃあ、次回、また会いましょう