Wide Instructions【Turing Complete編】
目次
はじめに
いつもブログをご覧いただきありがとうございます。
コーストFIRE中のIPUSIRONです😀
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
↑1 | 1ビット記憶素子が8個入っています。 |
---|