Calculations【Turing Complete編】
はじめに
いつもブログをご覧いただきありがとうございます。
コーストFIRE中のIPUSIRONです😀
Calculationsステージ
当ステージのゴールは、4モードのうちCopyモードとCalculateモードをサポートした回路を組むことです。
※Conditonモードに対応させるのは以降のステージになります。
Copyモード
Copyモードについては、Registersステージで対応させました。
ただし、Instrucitonの上位2桁の処理はまだでしたので、このステージで組み込む必要があります。
Calculateモード
Calculateモードについては、Arithmetic Engineステージで完成させた回路を流用します。回路の中身は考える必要はなく、ALUコンポーネントの入出力にだけ気をつけます。
REG 1とREG 2を計算対象とし、計算結果をREG 3にセットします。
どういった計算をするのは、Instructions画面で確認できます。
Instructionビット列 | 演算内容 |
---|---|
01 000 000b | OR演算 |
01 000 001b | NAND演算 |
01 000 010b | NOR演算 |
01 000 011b | AND演算 |
01 000 100b | ADD演算 |
01 000 101b | SUB演算 |
01 000 110b | なし |
01 000 111b | なし |
「3 Bit decoderコンポーネントはDisableピンを持っていることを忘れないように」というヒントが提示されました。
DisableピンはONになると、3 Bit decorderコンポーネントは機能を止めるので、全出力ビットが0になります。
Registersステージの回路はCopyモードをサポートしていますが、3 Bit decoderのDisableピンは使っていませんでした。あえて、ヒントでこのピンを忘れるなということは、Copyモード以外のときに使うことを示唆しています。
Calculationsステージを解く
1:DECコンポーネントを配置する
直前でInstruction DecoderステージでDECコンポーネントをアンロックしました。DECコンポーネントの役割は、Instructionを解読することです。解読結果、対応するワイヤーをONにします。
左上のやや下にDECコンポーネントを配置します。
そして、Instruction端子とDECコンポーネントの入力ピンをつなげます。
2:Copyモードを完成させる
引き継いだRegistersステージの回路はCopyモードを備えていましたが、Instructionビット列の上位2桁がどのような状況でもCopyモードになってしまいます。
今回のステージではInstructionビット列の上位2桁が01bのときのみ、Copyモードとして動いて欲しいのです。逆に、他のビット列の時はCopyモードとしては動いては困るわけです。
そこで、Copyモード以外のときは、上の2つの3 Bit decoderの働きを止めて、コピー処理が働かないようにします。
そのために、3Bit decoderのDisableピンを活用します。
つなげ方として2つのアプローチがあります。
・Copyモードを除くモードを認識する方法
・Copyモードを認識する方法
前者なら該当モード時にONになるワイヤーをORゲートで束ねて、その出力をDisableピンにつなげます。
後者ならCopyモード時にONになるワイヤーを反転させてから、Disableピンにつなげます。後者のアプローチの方が自然ですし、回路が単純になるので、こちらを採用します。
3:Calculationモードを実現する回路を組み込む
回路に縦に並んでいる8 Bit Registerは、自分で配置できる8 Bit Registerと若干異なります。出力にAlways outputピンが備わっています。
Calculationモードの心臓部といえるのはALUコンポーネントになります。
ALUコンポーネントの入力は3つ、出力は1つあります。今回の回路の仕様にもとづくと、次のようにつなぐべきピンが確定します。
【入力】
・Instructionピン・・・入力ピンのInstruction端子とつなげるだけ。
・Input 1・・・REG 1の出力ピン(Always outputピン側)とつなげる。
・Input 2・・・REG 2の出力ピン(Always outputピン側)とつなげる。
【出力】
・Output・・・REG 3の入力ピン(バイトデータ用)とつなげる。
このステップで注目すべき箇所は、ALUコンポーネントのOutputピンの接続先です。
REG 3の入力ピンは実質的にすべてのレジスターの入力ピンとつながっています。つまり、ALUコンポーネントのOutputピンとREG 3のピンを直結せずに、すでにあるREG 3から伸びているワイヤーの途中につなげた方がすっきりします。
また、他のレジスターに影響がないのか心配になるかもしれませんが、8 Bit RegisterのSaveピンがOFFなので問題ありません。
ただし、今回はCalculationモードのときのみ、ALUコンポーネントの出力がREG 3の入力に入るようにするため、途中に8 Bit Switchコンポーネントを配置します。このスイッチはInstructionの解読結果CalculationモードのときのみにONになるようにします。それを実現するためには「DECコンポーネントの2番目の出力ピン(Instructionピン)」と「8 Bit SwitchコンポーネントのEnableピン」をつなげます。
テストしてみると、エラーになりました。どうやらREG 3に問題があるようです。
消去法で絞り込んでいき、問題を突き止めましょう
バイトデータの入力には問題がないはずです。Loadピンは関係なさそうです。残りはSaveピンです。Calculationモードでは計算結果をREG 3に記憶させる必要がありますが、この回路では、CalculationモードでREG3が無効(SaveとLoadどちらもOFFだから)になっています。
CalculationモードにREG 3がSaveピンをONにするには、DECコンポーネントの出力から伸びている、Calculationモード用のワイヤーが使うことにします。ただし、Copyモードと兼用させるためにORゲートを通す必要があります。
4:全体を見直す
すべての配線をし終えました。全体を見直して、おかしな配線がないことをチェックしてください。
5:テストする
テストをパスさせてください。