1

nand2tetri講座でデータメモリ実装を実現しました。しかし、実装のいくつかの部分が本当にわかりません:

CHIP Memory {
    IN in[16], load, address[15];
    OUT out[16];

    PARTS:

    DMux4Way(in=load, sel=address[13..14], a=RAM1, b=RAM2, c=scr, d=kbr);
    Or(a=RAM1, b=RAM2, out=RAM);

    RAM16K(in=in, load=RAM, address=address[0..13], out=RAMout);
    Screen(in=in, load=scr, address=address[0..12], out=ScreenOut);
    Keyboard(out=KeyboardOut);

    Mux4Way16(a=RAMout, b=RAMout, c=ScreenOut, d=KeyboardOut, sel=address[13..14], out=out);
}
  1. ここで何をロードするかを担当します。load が 0 の場合 - いずれにしても Dmux4Way から 0 0 0 0 になることを理解しています。つまり、メモリにデータをロードしない方法です。
  2. 少なくとも、Screen で address[0..14] の代わりに address[0..12] を入力した理由は理解できません - 完全なアドレスです。私の意見では、スクリーン メモリ マップは RAM メモリ マップの後にとどまるため、秒を使用する必要があります。また、スクリーン メモリ マップを要求する場合は、範囲 (16 384 - 24 575) - 10 進数または (100000000000000 - 101111111111111) - バイナリを使用する必要があります。しかし、その範囲を 13 幅のバス (アドレス [0..12]) だけで表現するにはどうすればよいでしょうか??? それは不可能だ。

    したがって、画面のメモリ マップを表現したい場合は、上に示した範囲を使用する必要があります。そして、その範囲には15の幅またはアドレス[0..14]がありますが、アドレス[0..12]ではありません(幅13)。しかし、なぜ address[0..12] だけで機能し、address[0..14](full address) が機能しないのですか?

DMux4Way(in=ロード、sel=アドレス[13..14]、a=RAM1、b=RAM2、c=scr、d=kbr);

4

1 に答える 1

4

最初にあなたを批判して申し訳ありませんが、あなたがする質問は、あなたがこの演習を自分で行っていないか、コース全体を最初から始めていないことを示唆しています.

あなたの質問に答えるには:
Ad.1.
1 つのビット (ロード ビット) を正しいメモリ部分に逆多重化します。その後、入力データをすべてのメモリ パーツに同時にフィードします。

その逆、つまり、16 ビット入力を正しいパーツ (RAM16K、画面、またはキーボード) に向け、すべてのパーツのすべてのレジスターで接続されてアクティブなロード ビットを使用するよりも、簡単で適切です。

明確にするために。データの書き込みには、RAM と画面の 2 つの宛先があります。あなたが持っている最小のデマルチプレクサは4ウェイマルチプレクサであり、それがあなたが使用しているものです。メモリに書き込むときは、データと宛先の 2 つの情報を同時に提供する必要があります。DMux4Way16 を使用して入力データを逆多重化し、DMux4Way を使用して個別に単一のロード ビットを逆多重化することもできますが、それには 2 つのデマルチプレクサーが必要であり、それよりも優れた方法を実行できます。これがここで行われることです。データ入力を RAM と画面の両方に送信し、1 つのデマルチプレクサのみを使用します: DMux4Way を使用して、2 つの可能な宛先のいずれかを選択します。選択された 1 つだけが新しいデータでロードされ、他のデータ入力は無視されます。それを知った上で、A 命令フォーマットを学習する必要があります。A 命令 (または A レジスタにあるデータ) のビット 14 と 13 がバイナリ値00または01の場合、宛先は RAM です。ビット 14 と 13 がバイナリ値10の場合、画面が宛先であることを意味します。

これらの 2 ビットをデマルチプレクサの sel として選択していることに気付いた場合。選択 0 と 1 は同じ意味を持つため、それらを OR し、出力を RAM へのロードとしてフィードできます。選択 2 は、画面に新しい値がロードされることを意味するため、ロード ビットがそこに移動します。選択 3 は使用されないため、気にしません。デマルチプレクサの出力dはどこにも接続されません。デマルチプレクサの機能を利用します。選択された出力の値は 1 になり、他のすべての出力は結果として 0 になります。これは、1 つのメモリー宛先のみがロードされることを意味します。
Ad.2。
画面は別のデバイスです。ここでは、RAM、ROM、またはキーボード メモリ デバイスとは関係ありません。あなた、そしてあなただけが、この特定のデバイスにとって何を意味するビットに意味を与えますか。あなたの質問に答えるために、スクリーンでいくつかのレジスタをアドレス指定すると、独自の内部アドレス空間でアドレス指定されます。内部アドレス空間では最初のアドレスは 0 になりますが、メモリ全体からは 16384 になります。この移行を行うのはあなたの仕事です。この特定のケースでは、スクリーン メモリ デバイスのサイズは 14 ビット アドレス バスを使用する必要はなく、必要なのは 13 ビットだけです。この場合、14 番目のビットは何を意味しますか? 何の付加価値にもなりません。また、あなたは Screen のユーザーであり、設計者ではありません。インターフェースの説明を見てそれに従うだけです。

それがあなたの質問に答えてくれることを願っています.そうでない場合は、コースに戻って以前のハードウェア関連の章をより注意深く勉強することをお勧めします.

于 2018-04-09T07:18:29.483 に答える