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

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

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

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

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

Wide Instructions【Turing Complete編】

2023年9月16日

Wide Instructionsステージ

Wide Instructinsステージのゴールは、次の機能を持つ回路を作ることです。

・偶数ticksでプログラム出力のバイトデータを保存する。

・奇数ticksで両方のバイト(保存のバイトデータとプログラム出力の倍とデータ)を出力する。

最初のキャンバスを見ると、左側にProgramコンポーネント(命令がたくさん格納されているのでプログラムメモリーと呼ぶ)、右側に2つのバイトデータ用の出力があります。上のOutput端子をOutput 1、下のOutput端子をOutput 2とします。

Wide Instructionsステージを解く

1:回路の設計方針を検討する

本ステージの肝は「プログラムカウンターの活用」と「ticksの偶奇の識別」の2つにあります。

・プログラムメモリーから1バイトずつデータを出力させるには、プログラムカウンターが必要。

・プログラムカウンターによって時間の概念が組み込まれるので、これをticks発生に利用する。

・ticksの偶奇を信号のON・OFFに分けると、一種のクロック信号になる。 【余談】

2:プログラムメモリーからバイトデータを取り出す回路を組み込む

プログラムカウンターから番地に相当するバイトデータが出力されますので、それをプログラムメモリーに与えるだけです。

プログラムカウンターには8 Bit Counterコンポーネントを使います。

8 Bit Counterコンポーネントとプログラムメモリーコンポーネントの入出力は次の通りです。

ただし、8 Bit Counterの下にあるIncrement byは1にしておきます。これは1増分とするためです。

ProgramコンポーネントのAddressピンに、8 Bit CounterのOutputピンを直結させます。

一気に番地を飛ぶような処理はないので、8 Bit Counterコンポーネントの入力側のOverwrite valueピンには何も接続する必要はありません。そして、カウンターは常に1増分のため、Increment/Overwriteピンは何も接続する必要はありません(常時OFFにすればよい)。

ただし、このままではプログラムメモリーがカウントアップする度に、バイトデータが出力されてしまいます。

3:奇数ticks時の処理を実現する回路を組み込む

プログラムメモリーから「0⇒1⇒2⇒3⇒・・・」と次々にインクリメントされた整数が出力されます。

奇数ticksを認識させるには、次の2つのアプローチが考えられます。

・2進数にデコードして、奇数番目のワイヤーをORで束ねる。

・2進数化して、最下位ビット(1の位)のピンがONであることをチェックする。

後者のアプローチの方が回路がすっきりしますので、こちらを採用します。

プログラムカウンターの出力を8 Bit Splitterコンポーネントで分離して、最下位ビットを取り出すだけです。奇数ticksならON、偶数ticksなら最下位ビット以外のピンがONになります。

後は8 Bit SwitchコンポーネントのEnableピンに接続します。

4:偶数ticks時の処理を実現する回路を組み込む

偶数ticksとは、いいかえれば奇数ticksでないということです。

バイトデータを記憶するためには、8 Bit Registerコンポーネント[1]1ビット記憶素子が8個入っています。を利用します。

偶数ticksのときにレジスターに保存します。そして、奇数ticks時には保存データを出力します。

ところで、8 Bit Splitterコンポーネントの1の位から伸びるワイヤーを1 Bit decoderコンポーネントにつなげます。こうすることで、偶奇でONにワイヤーを切り替えられます。偶数ticks(0を含む)なら1番目のワイヤーがON、奇数ticksなら2番目のワイヤーがONになります。

今は、偶数ticksのときにレジスターに保存したいので、SaveピンをONにすることになります。1 Bit decoderの1番目のワイヤーを、8 Bit RegisterコンポーネントのSaveピンにつなげます。

一方、奇数ticksのときはレジスターからデータと取り出すので、LoadピンをONにすることになります。1 Bit decoderの2番目のワイヤーを、8 Bit RegisterコンポーネントのLoadピンにつなげます。

つまり、ワイヤーは交差するようになります。

※交差させずにNOTコンポーネントを通すやり方もありますが、コンポーネントが増えるということは(見た目がよくても)コストが増えるわけであまり好ましくありません。

5:回路の全体を見直す

最終的な回路は、次の通りです。

6:テストする

テストにパスすると、ステージクリアになります。

1 Bit Decoderコンポーネントの代わりにNOTコンポーネントに置き換えたバージョン【別解】

References

References
1 1ビット記憶素子が8個入っています。