nand2俄罗斯方块。内存实现

hel*_*eet 1 memory hdl nand2tetris

我在nand2tetris课程中实现了数据存储器的实现。但我真的不明白我的实现的某些部分:

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);
}
Run Code Online (Sandbox Code Playgroud)
  1. 这里负责什么负载。我知道如果负载为 0 - 在任何情况下 Dmux4Way 的输出都将为 0 0 0 0。但我不明白在这种情况下它是如何工作的。即它如何允许不将数据加载到内存中。
  2. 至少无法理解为什么在屏幕中我们输入地址[0..12]而不是地址[0..14] - 完整地址。在我看来,我们应该使用第二个,因为屏幕内存映射位于 RAM 内存映射之后,如果我们想要请求屏幕内存映射 - 我们应该使用范围 (16 384 - 24 575) - 十进制或 (100000000000000 - 101111111111111) - 二进制。但是我们如何仅使用 13 宽度总线(地址[0..12])来表示该范围???不可能。

    因此,如果我们想表示屏幕内存映射,我们应该使用上面介绍的范围。该范围具有 15 宽度或地址[0..14],但不是地址[0..12](宽度 13)。但为什么只工作地址[0..12]而不起作用地址[0..14](完整地址)

DMux4Way(in=加载,sel=地址[13..14],a=RAM1,b=RAM2,c=scr,d=kbr);

zub*_*rgu 5

我很抱歉一开始就批评你,但你提出的问题表明你没有自己做这个练习,或者没有从头开始整个课程。

回答您的问题:
Ad.1。
您将单个位(加载位)多路分解到正确的内存部分。此后,您可以同时将输入数据提供给所有内存部分。

它比相反的方式更容易、更简洁,即将 16 位输入定向到正确的部分(RAM16K、屏幕或键盘),同时在所有部分的每个寄存器上连接并激活一个加载位。

澄清。写入数据时有 2 个可能的目的地:RAM 和屏幕。您拥有的最小的解复用器是 4 路复用器,这就是您正在使用的。当写入内存时,您需要同时提供 2 条信息:数据和目的地。您可以使用 DMux4Way16 解复用输入数据,并使用 DMux4Way 单独加载位,但这需要 2 个解复用器,我们可以做得更好。这就是这里所做的,您将数据输入定向到 RAM 和屏幕,然后仅使用一个解复用器:DMux4Way 选择 2 个可能的目的地之一,只有所选的一个将加载新数据,而另一个数据输入将被忽略。知道了这一点,您需要研究 A 指令格式:当 A 指令(或 A 寄存器中的数据)的第 14 位和第 13 位具有二进制值00或时01,目的地是 RAM。当位 14 和 13 具有二进制值 时10,表示屏幕是目的地。

当您注意到您选择这 2 位作为解复用器的选择时。选择 0 和 1 具有相同的含义,因此您可以对它们进行或运算并将输出作为负载馈送到 RAM。选择 2 意味着屏幕将加载新值,因此加载位将移至此处。选择 3 从未使用过,因此我们不关心它 - 多路分配器的输出d将不会连接到任何地方。我们利用解复用器的功能:选定的输出将具有值 1,而所有其他输出将产生 0。这意味着只会加载 1 个内存目标。
广告2。
屏幕是独立的设备,与这里的RAM、ROM或键盘存储设备无关。您,也只有您,才能赋予比特对于该特定设备的含义。为了回答你的问题,当你在屏幕上寻址某些寄存器时,你在它自己的内部地址空间中寻址它。在其内部地址空间中,第一个地址将为 0,但从整个内存来看,它将为 16384。您的工作就是进行此转换。在这种特殊情况下,屏幕存储设备的大小不需要使用 14 位地址总线,13 位就足够了。在这种情况下,第 14 位意味着什么?它不会增加任何价值。而且,你是Screen的用户而不是设计者,你只是看并遵循它的界面描述。

希望它能回答您的问题,如果没有,我强烈建议您返回并更仔细地学习课程中之前与硬件相关的章节。