単一サイクルのデータパスにハーフワードと負荷のバイトをロード
-
24-09-2019 - |
質問
データメモリを変更することなく、単一サイクルのデータパスに負荷バイトを実装について尋ね、その溶液は以下のものでしたされています。
この問題が発生しましたaltテキストhttp://img214.imageshack.us/img214/7107/99897101。 JPG の
これは実際には非常に現実的です 質問;ほとんどのメモリシステムは、 完全に単語ベース、および個々の バイトは通常のみを取り扱っています プロセッサの内部。あなたが表示されたら 多くのコンピュータ上の「バスエラー」、この 多くの場合、プロセッサが試みたことを意味 したメモリアドレスにアクセスするには ない適切ワード境界で整列し、 メモリシステムは、例外を上げました。 とにかく、バイトアドレスの可能性があるため、 4の倍数ではない、我々は通過できません それらを直接メモリへ。しかし、我々 それでもので、任意のバイトで取得することができます 各バイトは、いくつかの中に見つけることができます 単語、およびすべてのワードアドレスです 最初の我々だから、4の倍数 やる必ず私たちが権利を取得することです 語。私たちは、高い30ビットを取る場合 アドレス(すなわち、ALUresult [31-2]) そして2つの0ビットと組み合わせます ローエンド(これは何を「左です シフト2” 単位は本当にやっている)、我々 言葉のバイトアドレスを持っています 希望のバイトが含まれています。これは ちょうどバイト自身のアドレス、丸みを帯びました 4.この変更の倍数にダウン 手段LWは今もラウンドすること アドレスは4の倍数にダウンしたが、 その非整列アドレスからのOK これでとにかくLWのために動作しないでしょう メモリユニット。 OK、今はデータを取得します バックメモリからの言葉。私たちはどのように入手できますか 我々はそれから出たいバイト?まあ、 バイトのバイト・オフセットことに注意してください ワード内だけで与えられます バイトのの下位2ビット 住所。そこで、我々は、単にそれらを使用する2 適切なバイトを選択するためのビット マルチプレクサを使用した単語のうち。注意 ビッグエンディアンのバイトの番号の使用、 MIPSに適しています。次に、我々 有する32バイトをゼロ拡張 ビット(すなわち、わずか24と組み合わせます その高い端でゼロ)、なぜなら 問題は、そうすることを指定します。実際には、 これは、のわずかな間違いでした 質問:実際には、LBU 命令バイトをゼロ拡張しますが、 ポンド、それを符号拡張します。しかたがない。 最後に、我々は拡張する必要が 1を受け入れるためにマルチプレクサMemtoReg制御 新しい入力:のためのゼロ拡張バイト ポンドのケース。 MemtoReg制御 信号は2ビットに拡大されなければなりません。ザ・ 00元の0と1のケース変化 および01は、それぞれ、我々は新しいを追加します ケース10のみの場合に使用されています ポンドのます。
私はかなり実際に、これは特に2によるALU結果はバイトアドレスを与えるだろう左シフトについて、説明を読んだ後も、どのように機能するかについて理解していない...どのようにこれは可能です??私は半分のワードをロードしたいそうならば、私は1つの左シフトを行うだろうと私は半分のワードのアドレスを得るでしょう?データメモリを変更することで、負荷バイト、負荷のハーフワードを行うには良い方法何でしょうか? (私たちは、データメモリを変更することができないことプットの制約上記の質問)
解決
原作者は、単にメモリから読み出される32ビットのデータにバイト・マルチプレクサを追加しているように見えます。このメモリは、完全な32ビット自然に整列負荷(LW命令)を可能にし、追加のバイトマルチプレクサ及びゼロ拡張は、(LBU命令)もロードバイト命令を可能にする。
ALU結果の左シフトはワードアドレスを生成する、のないのバイトアドレス、および信号ルーティングにおける2によって暗黙の右シフトを占めています。最終結果は、単にメモリに送られる前に(ゼロ)マスクさALU結果の下位2ビットです。 ALU値の2つのLSBは、ワードメモリは、任意のバイトを読み取ることができるように、ダウンストリームバイトマルチプレクサにメモリの供給されます。
ロードハーフワード(16ビット)のために示される論理には直接サポートされず、単にバイト、完全な32ビットワード。あなたは、しかし、簡単に同様のアプローチを用いて支持言葉の代わりに、バイト(あるいはその両方)にロジックをバイトアドレッシングを変更することができます。