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

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

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

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

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

Conditionals【Turing Complete編】

Conditionalsステージ

Conditionalsステージのゴールは、LEGアーキテクチャーの回路をConditionモードをサポートさせることです。

Conditionモードに関係するオペコード(以降、Conditionオペコードと呼ぶ)は、次のフォーマットになっています。

追加するConditionオペコードは次の6種類です。

1バイト目オペコード処理内容
32d(=0010 0000b)IF_EQUAL引数1と引数2が一致したら、指定のアドレスにジャンプする。
33d(=0010 0001b)IF_NOT_EUQAL引数1と引数2が不一致なら、指定のアドレスにジャンプする。
34d(=0010 0010b)IF_LESS引数1が引数2より小さいなら、指定のアドレスにジャンプする。
35d(=0010 0011b)IF_LESS_OR_EQUAL引数1が引数2以下なら、指定のアドレスにジャンプする。
36d(=0010 0100b)IF_GREATER引数1が引数2より大きいなら、指定のアドレスにジャンプする。
37d(=0010 0101b)IF_GREATER_OR_EQUAL引数1が引数2以上なら、指定のアドレスにジャンプする。
今回追加するオペコード一覧

Conditionalsステージを解く

1:Conditionオペコードの解読回路を追加する

命令語の1バイト目でConditionオペコード値かどうかを識別します。

ここでEqualコンポーネントを用いるとシンプルに実装できます。

・一致⇒Equalコンポーネントを使う。

・不一致⇒EqualコンポーネントとNOTコンポーネントを使う。

・4つの大小比較⇒Less(unsigned)コンポーネントをベースにして、NOTコンポーネントを組み合わせる。ここが少し頭を使うところで2つの入力が逆になるパターンと、NOTコンポーネントを入れるかどうかで、計4パターンをカバーできる。

Equalコンポーネントの入出力
Less(unsigned)コンポーネントの入出力

具体的な回路は次のようになります。

※見切れているワイヤーがどことつながっているかは、ステップ4の全体の回路を参照してください。

2:ジャンプ処理を実装する

比較の条件式が満たせば、命令語の4バイト目に指定されたアドレスにジャンプします。

プログラムカウンターのアドレスを上書きするわけです。そのためにはIncrement/OverwriteピンをONにします。

8 Bit Counterコンポーネントの入出力

指定のConditionオペコードの条件式を満たせば、アドレスを上書きします。条件式を満たすことは、条件結果のワイヤーがONになるかどうかで判定できます。回路上、条件式を満たすときはどれか1本からON信号が出てきます。そのため、6本のワイヤーを全部つないでも問題ありません。

※あまり納得がいかないのであれば、OR回路を通しても構いません。

上書き用アドレスとして「演算操作の計算結果のバイトデータ」と「命令語の4バイト目」のどちらを使うかを切り替える必要があります。

ここでは8 Bit Muxコンポーネントで切り替えるようにします。

8 Bit Muxコンポーネントの入出力

ステップ2の内容を踏まえて、回路を修正すると次のようになります。

3:全体を見てワイヤリングをチェックする

全体の回路は次のようになります。次の箇所を重点的にチェックしてください。

・Conditionオペコードの解読回路のロジック

・プログラムカウンターのOverwrite valueピンの接続ワイヤー

・プログラムカウンターのIncrement/Overwriteピンの接続ワイヤー

4:テストする

テストにパスすると、ステージクリアになります。これでLEGアーキテクチャーの回路が完成したことになります。

デコーダーでConditionオペコード値を識別する【別解】

3 Bit decorderコンポーネントでデコードしてConditionオペコード値を識別する回路を考えてみます。

ここで紹介する別解は、デジタル回路の教育目的であり、わざわざこの回路を組む必要はありません。この回路でもテストにパスすることを納得できれば十分です。

3 Bit decoderコンポーネントの入出力

ポイントはConditionオペコード値が32d(=0001 0000b)始点であることです。例えば、33dについては、0001 0000b+0000 0001bです。3つの3 Bit decorderにより33dを特定できます。

プログラムカウンターの入力をスイッチで切り替える【別解2】

プログラムカウンターの入力を8 Bit Muxコンポーネントで切り替えていました。

代わりに8 Bit Switchコンポーネントに置き換えても動作します。ただし、8 Bit Swichコンポーネントの前に、8 Bit OR回路を配置し、その入力は「演算操作の計算結果のバイトデータ」と「命令語の4バイト目」とします。