Conditionals【Turing Complete編】
目次
はじめに
いつもブログをご覧いただきありがとうございます。
コーストFIRE中のIPUSIRONです😀
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パターンをカバーできる。
具体的な回路は次のようになります。
※見切れているワイヤーがどことつながっているかは、ステップ4の全体の回路を参照してください。
2:ジャンプ処理を実装する
比較の条件式が満たせば、命令語の4バイト目に指定されたアドレスにジャンプします。
プログラムカウンターのアドレスを上書きするわけです。そのためにはIncrement/OverwriteピンをONにします。
指定のConditionオペコードの条件式を満たせば、アドレスを上書きします。条件式を満たすことは、条件結果のワイヤーがONになるかどうかで判定できます。回路上、条件式を満たすときはどれか1本からON信号が出てきます。そのため、6本のワイヤーを全部つないでも問題ありません。
※あまり納得がいかないのであれば、OR回路を通しても構いません。
上書き用アドレスとして「演算操作の計算結果のバイトデータ」と「命令語の4バイト目」のどちらを使うかを切り替える必要があります。
ここでは8 Bit Muxコンポーネントで切り替えるようにします。
ステップ2の内容を踏まえて、回路を修正すると次のようになります。
3:全体を見てワイヤリングをチェックする
全体の回路は次のようになります。次の箇所を重点的にチェックしてください。
・Conditionオペコードの解読回路のロジック
・プログラムカウンターのOverwrite valueピンの接続ワイヤー
・プログラムカウンターのIncrement/Overwriteピンの接続ワイヤー
4:テストする
テストにパスすると、ステージクリアになります。これでLEGアーキテクチャーの回路が完成したことになります。
デコーダーでConditionオペコード値を識別する【別解】
3 Bit decorderコンポーネントでデコードしてConditionオペコード値を識別する回路を考えてみます。
ここで紹介する別解は、デジタル回路の教育目的であり、わざわざこの回路を組む必要はありません。この回路でもテストにパスすることを納得できれば十分です。
ポイントは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バイト目」とします。