Mode controller【NandGame編】
はじめに
いつもブログをご覧いただきありがとうございます。
コーストFIRE中のIPUSIRONです😀
Mode controllerレベル
Mode controllerレベルのゴールは、モードコントローラーの回路を組むことです。
モードコントローラーには、1ビットのモードレジスターがあります。
- Mode=0のとき、カーネルモード(kernel mode)と呼ぶ。
- Mode=1のとき、ユーザーモード(user mode)と呼ぶ。
モードコントローラーの回路の入出力は、次のとおりです。
入力 | ・sw:モードの切り替えビット ・tt:タイマートリガー信号 ユーザーモードではモードが切り替わるが、カーネルモードでは無視される。 ※ユーザーモード時のモード切替は割り込み、カーネルモード時のモード切替はレジュームと呼ぶ。 ・cl:クロック信号 |
出力 | ・md:現在のモード ・sw:モードの変更が発生するとswから1を出力する。 ※モードの切替は、入力swやttによって起こる。どちらであっても、モードが変更されれば、出力swは1を出力する。 ・IR:割り込み(ユーザーモード時のモード切替)の原因を示す16ビット値(sw=1の場合のみ)。 01=タイマートリガー(timer trigger)・・・tt端子による「ユーザーモード⇒カーネルモード」への切替 10=スワップ(swap)・・・sw端子による「ユーザーモード⇒カーネルモード」への切替 |
Mode controllerレベルを解く
1:回路の設計方針を検討する
・モードは2種類しかないので、切替のたびにNOTゲートを通る。
・入力clはクロック信号なので、クロック信号を要するコンポーネントに接続するだけ。
・入力ttは内部的にユーザーモード(Mode=1)のときだけ、カーネルモードに切り替わる。ANDゲートを使えばよさそう。
・入力swは常にモードの切替のきっかけになる。
※実質ビットが変化するときにモードが変わる。
・出力IRにはbundlerコンポーネントを接続し、下位2ビットだけ使う。
2:用意されているコンポーネントを確認する
D-FFであるdffコンポーネントが用意されています。
モードコントローラーは内部にモードレジスターを保持する必要があります。1ビット分でよいので、これを1つのD-FFで記憶しておくことにします。
3:回路を実装する
回路の設計方針をいろいろと決めたので、簡単なところから回路を組んでみます。
入力sw=1によってモードを切り替えるので、dffコンポーネントのstピンに接続します。さらに、回路の出力にあるsw端子にも接続します。
しかし、回路の入力にあるtt端子によってもモードが切り替わることがあります。つまり、dffコンポーネントのstピンとsw端子の間にORゲートを挟みます。
そのORゲートにtt端子側から1がくるには、ユーザーモード(Mode=1)のときでなければなりません。これはANDゲートで判定できます。
ここまで判明したことを回路に組み込んでみます。
完成に近づいてきました。残りはIR端子から出力されるデータを作るだけになります。
IR端子からの出力ビット列(下位2桁のみに注目)は、次の3種類があります。
- 01b・・・タイマートリガー時。tt端子による「ユーザーモード⇒カーネルモード」への切替
- 10b・・・スワップ時。sw端子による「ユーザーモード⇒カーネルモード」への切替
- 00b・・・それ以外のとき。
タイマートリガー時とは、回路の下にあるandコンポーネントの出力が1のときです。よって、この出力ピンとbundlerコンポーネントの0ビット目がつながります。
スワップ時とは、入力sw端子が1のときです。よって、この端子とbundlerコンポーネントの1ビット目がつながります。
4:テストする
テストにパスすると、クリアになります。