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

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

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

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

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

Turing Complete【Turing Complete編】

2023年8月25日

Turing Completeステージ

Turing CompleteステージはCPU ARCHITECTUREセクションの最終ステージであり、ステージのゴールはCPU回路を完成させることです。

Conditionモードがまだ実装されておらず、過去にアンロックしたCONDコンポーネントを組み込むことになります。

※ここをクリアすると、コンピューターがアンロックされて、以降はPROGRAMMINGセクションに進みます。

Conditionモードを実現するCONDコンポーネント

Instructionビット列の上位2桁が11bならConditionモード

例えば、Instructionビット列が1100 0011bだった場合は、Conditionモードで処理されます。

下3桁で条件式を区別します。

Conditionモードが指定された場合は、REG 3のバイトデータを対象に条件式を満たすかを判定し、満たしたらREG 0のバイトデータをプログラムカウンターに上書きします。

Conditionモードの目的

通常プログラムカウンターはインクリメントした値を出力し、その結果プログラムメモリーを1番地ずつずらしながらバイトデータを取り出し、CPU回路(のコア部分)に送り出していきます。

Conditionモードは条件が満たされると、プログラムカウンターの値が上書きされるといいました。上書きされるということは、プログラムメモリーにおいて隣の番地ではなく、別の番地にジャンプしてバイトデータが取り出されます。つまり、プログラムは通常逐次的に処理されますが、条件によって処理が分岐して、処理先が飛ぶ場合があります。これを実現するための回路なのです。

※アセンブリ言語の世界では、比較命令と条件ジャンプ命令をセットで使います。比較命令を実行すると、フラグレジスター内の一部のフラグが切り替わります。次の条件ジャンプ命令によって、フラグの状態を見てジャンプして処理を進めるか、そのまま逐次的に処理に進めるかが決まります。

CONDコンポーネントの入出力

入力・Conditionピン・・・8ビット。Instuctionビット列。
・Inputピン・・・8ビット。(0との大小比較を比較する)対象バイトデータ。
出力・Resultピン・・・1ビット。比較結果。大小比較の条件式が真(True)ならON、それ以外ならOFF。
※常にONやOFFになるパターンもある。
CONDコンポーネントの入出力

CONDコンポーネントが内部で判定している条件式

Instructionビット列の下3桁条件式(満たせばResultからONを出力)
000b常にOFFを出力
001b「REG 3 = 0」ならONを出力
010b「REG 3 < 0」ならONを出力
011b「REG 3 ≦0」ならONを出力
100b常にONを出力
101b「REG 3 ≠ 0」ならONを出力
110b「REG 3 ≧ 0」ならONを出力
111b「REG 3 > 0」ならONを出力

※Conditionsステージの記事を読み直すと、CONDコンポーネントやConditionモードの理解を深められるはずです。

Turing Completeステージを解く

1:CONDコンポーネントの入力をワイヤリングする

REG 3の右側にCONDコンポーネントを配置します。

CONDコンポーネントはREG 3が保持するバイトデータを対象とするので、入力として受け取る必要があります。そこで、「CONDコンポーネントのInputピン」と「REG 3のAlways outputピン」をつなげます。

どういった条件で判定するのかはInstructionビット列に含まれているので、これも入力として受け取らなければなりません。ALUのInstructionピンまでInstructionビット列が届いていますので、ここからワイヤーを伸ばして、「CONDコンポーネントのConditionピン」につなげます。

※当該ステージのワイヤーとして黄色を採用しました。

2:CONDコンポーネントの出力をワイヤリングする

CONDコンポーネントの出力であるOutputピンは条件判定の結果が流れます。条件式が満たされればONが出力されますが、そのときだけ、プログラムカウンターの上書きを有効にします。

ここで、プログラムカウンターを実現している8 Bit Counterコンポーネントの入出力を見ておきます。

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

プログラムカウンターの出力は接続済みですが、入力はまだ何もつながっていません。

「プログラムカウンターのIncrement / Overwriteピン」と「CONDコンポーネントのOutputピン」を接続します。

ただし、Conditionモード以外のときは「Increment / Overwriteピン」につながるワイヤーが常にOFFになるようにします。そのためには、DECコンポーネントで制御します。DECコンポーネントの3番ピンの接続がまだであり、このピンがONになるのはConditionモードとして解読できた場合になります。

次のように8 Bit Switchコンポーネントを挟むことにしました。

プログラムカウンターのOverwrite valueピンには、上書きするためのバイトデータが入ります。

REG 0のAlways outputピンからバイトデータを持ってくるようにワイヤリングします。

3:テストする

テストに通過すると、Turing Completeコンポーネントがアンロックします。

おわりに

ここまでのクリアしてきたステージは次の通りです。

おめでとうございます!そして、お疲れ様でした!
NANDゲートからスタートしてCPUまで設計してきました。
デジタル回路の世界には慣れたでしょうか。
シミュレーター上でCPUの自作までを体験できたことになります。
デジタル回路や自作CPUに興味を持ったのであれば、実物の回路を組んでみるのもよいでしょう。実物は物理的な特性を理解する必要があり、学習すべき内容も多いですが、Turing Completeを通じてここまで到達した方であれば基礎知識は十分に習得済みなので学習のスタートダッシュはできるはずです。
次のステージからはプログラミングのセクションに入ります。