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

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

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

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

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

Virtual Memory【NandGame編】

はじめに

いつもブログをご覧いただきありがとうございます。

FIRE生活中のIPUSIRONです😀

IPUSIRONのプロフィールを見る

Virtual Memoryレベル

Virtual Memoryレベルのゴールは、仮想メモリーの回路を実装することです。

NandGameの仮想メモリーは次の仕組みで実現するものとします。

・入力アドレスとして、16ビット幅のアドレスAとPCがある。

・入力アドレスの15ビット目は、Mの中からどの3ビット列を抽出するかを決定する。

・入力アドレスの最上位ビット(15ビット目)は捨てられ、代わりに抽出した3ビット列を前置して、18ビットのアドレスに拡張する。

・リードオンリーフラグ(readonly-flag)は、データを保存できるか否かを決定する。アドレスAのみに適用される。

リードオンリーフラグが0の場合、stフラグをファルを使うことでデータを通常通り保存できる。対して、1の場合、stフラグは無視される。

入力アドレスその15ビット目Mから前置するビット列セグメントMのリードオンリーフラグ
PC00~2ビット目
PC14~6ビット目
A08~10ビット目11ビット目
A112~14ビット目15ビット目

Virtual Memoryレベルを解く

1:キャンバスの中央にram 18コンポーネントを配置します。

簡単なワイヤリングだけしておきます。

※なぜかこれだけの回路でもテストにパスしてしまいます。preview版だからでしょうか。

2:入力アドレスAの処理を実装する

Aの15ビット目によって、Mから3ビット列を取ってくる位置が変わります。3ビットセレクターがあればよいですが、そんなものは用意されていません。1ビットセレクターを3つ並べてもよいのですが、16ビットセレクターしか用意されていません。

16ビットを使ってもよいのですが、bundlerコンポーネントやsplitterコンポーネントを使う必要になり、キャンバス上で無駄にスペースを使ってしまいます。さらに、見た目の問題だけに留まらず、回路内に使っていないNANDゲート等が増えてしまいます。

そこで、"select 1″という名称のカスタムコンポーネントを使い、当該レベルで使うことにします。

入力アドレスA(16ビット値)に3ビット列を付与して、ram 18コンポーネントのAdピン(18ビット値)に与えます。

[1]「Aの15ビット目が0」⇒「Mの8~10ビット目を抽出」⇒この3ビット列を先頭に付与

[2]「Aの15ビット目が1」⇒「Mの12~14ビット目を抽出」⇒この3ビット列を先頭に付与

PCピンは入力アドレスPC用なので、ここでは扱いません。

残っているのはstピンです。

入力アドレスAの15ビット目で、Mのどのビット目をリードオンリーフラグとして扱うのかを決めます。Aの15ビット目が0ならMの11ビット目、そうでないならMの15ビット目になります。

※この対応については当該レベルの仕様の表を参照してください。

リードオンリーフラグが1なら書き込み不可、0なら書き込み可です。NOTで反転してから、入力のst端子とANDを取り、それをram 18コンポーネントのstピンに与えればよいのです。

3:入力アドレスPCの処理を実装する

PCについてもAと同様に考えます。リードオンリーフラグを考える必要がない分、楽かもしれません。

入力アドレスPC(16ビット値)に3ビット列を付与して、ram 18コンポーネントのPCピン(18ビット値)に与えます。

[1]「PCの15ビット目が0」⇒「Mの0~2ビット目を抽出」⇒この3ビット列を先頭に付与

[2]「PCの15ビット目が1」⇒「Mの4~6ビット目を抽出」⇒この3ビット列を先頭に付与

4:テストする

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