
NATUを作る(パート30)
HARUは失敗に終わってしまった。
だが、その悔しさをバネに、新たにNATUを作ることになった。
今回は、I/Oポートの命令を伝える配線を繋げていきたいと思います。
I/Oポートを使った時、レジスタの命令だった部分がI/Oポートの命令に切り替わるので、その時、レジスタに命令が行かないように配線を遮断する必要があります。
というわけで、頑張っていきましょー!
制作
制御系配線
まずは、I/Oポート関連の命令が読み出されたと検知するために、専用の回路を作っていきます。

この上の画像の回路を使えば、どの命令が読み出されたかすぐにわかります。
なので、今回はこの回路を使いたいと思います。
そうなると、この配線は信号強度9まで対応すればいいということになるので、不要なリピーターは壊しておきます。
なぜ9なのかというと、ALUの最後の命令である右ローテートが信号強度9だからです。

ALU以外の命令を読み出したときも右ローテートしてしまいますが、命令セットを見た感じ、そもそもレジスタから読み出さなかったり、レジスタに保存しなかったりで、特に問題はなさそうだったので、大丈夫そうです。
これでOK

レジスタの信号は2rtなのに対し、I/Oの命令の信号は1rt
なので、信号を2rtに伸ばす必要があるのですが、2rtのリピーターを使うと、連続してI/Oの命令がきたときに、対処できません。
なので、下の画像のようにして2rt化させます。

この回路じゃないと、誤動作の原因になってしまいます。
この回路の出力を、レジスタの読み出し先を伝える配線に繋げました!

これにより、いい感じにレジスタからの出力を遮断してくれます。
あ、、やべ
間違えて、レジスタの読み出先じゃなくて、書き込み先の配線に繋げてしまっていました。
遅延が足りなかったので、もっと手前のところからレジスタの出力を遮断すべき命令か判断する回路を伸ばしました。

そして、この配線をレジスタの読み出し先を伝える配線に繋げました!
これで、今度こそいい感じに遮断できます!

まず、制御用の配線の遅延を合わせました。
アドレスの入力部に常に1を与え続けて、いい感じのタイミングでアクセスを許可できているか調べました。
無事こっちの配線の調整は終わったので、あとはアドレスの配線、、、にしようかと思いましたが、とりあえず先にアウトプットの制御用配線を通したいと思います。

無事、二本目の配線を通し終えました!
ですが、今のままだと同じ方向に同じ信号を伝える配線が二つもあって、無駄な感じがするので、出来る限り配線を減らしていきます。

やっぱり、こっちの方がいい感じだと思います。

アドレス系配線
それでは、次はアドレスの配線をしていきたいと思います!

とりあえず配線はできました。
これから、遅延調整をしていきます。

遅延調整完了!

それじゃぁ、テストしていきたいと思います!
テスト
まずは、アウトプットのテストとして、
0:0番地と0番地を足してインクリして0番地に保存
1:1番地からアウトプット
このようなプログラムを実行させたいと思います。
ちゃんと1番地のアウトプットポートから0000 0001が出力されました!

それじゃぁ、次はインプットのテストとして、
0:1番地からインプットして(レジスタの)1番地に保存
このプログラムを動かしてみたいと思います。
成功です!レジスタの1番地に0000 0110が保存されました!

それじゃぁ、最後はインプットとアウトプットを同時にテストしたいと思います。
0:0番地と0番地を足してインクリして0番地に保存
1:1番地からインプットして1番地からアウトプットして(レジスタの)1番地に保存
このプログラムを動かしてみたいと思います。
成功しました!
レジスタには0000 0110が保存され、アウトプットポートには0000 0001が出力されています!
終わり
いやぁ、今回は無事I/Oポートを機能させられてよかったです。
このNX RED VIII(ver.2)のI/Oポートは、これまでで初めての方式を採用しているので、少し心配でしたが、なんとか動いてよかったです。

ちなみに、RDAバグが残っていた設計の予定だったのがNX RED VIII(ver.1)で、RDAバグの対策版がNX RED VIII(ver.2)です。
それでは、次回はI/Oポート全体を使ってテストしていきたいと思います。
今回は、約1時間半の作業でした。
お疲れさまでした。
それじゃあ、次回、また会いましょう