当サイトの一部ページには、アフィリエイト・アドセンス・アソシエイト・プロモーション広告を掲載しています。

Amazonのアソシエイトとして、Security Akademeiaは適格販売により収入を得ています。

広告配信等の詳細については、プライバシーポリシーページに掲載しています。

消費者庁が、2023年10月1日から施行する景品表示法の規制対象(通称:ステマ規制)にならないよう、配慮して記事を作成しています。もし問題のある表現がありましたら、問い合わせページよりご連絡ください。

参考:令和5年10月1日からステルスマーケティングは景品表示法違反となります。 | 消費者庁

Calculations【Turing Complete編】

はじめに

いつもブログをご覧いただきありがとうございます。

FIRE生活中のIPUSIRONです😀

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 000bOR演算
01 000 001bNAND演算
01 000 010bNOR演算
01 000 011bAND演算
01 000 100bADD演算
01 000 101bSUB演算
01 000 110bなし
01 000 111bなし
Instructionビット列とCalculateモードでの演算内容

「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コンポーネントの入出力

左上のやや下に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ピンが備わっています。

配置されている8 Bit Registerの入出力

Calculationモードの心臓部といえるのはALUコンポーネントになります。

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:テストする

テストをパスさせてください。