nand2俄罗斯方块。内存实现
nand2tetris. Memory implementation
我在nand2tetris课程中实现了Data memory的实现。但是我真的不明白我实现的某些部分:
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);
}
- 这里负责什么负载。我知道如果负载为 0 - 在任何情况下,Dmux4Way 之外的内容都将为 0 0 0 0。但我不明白在那之后它是如何工作的。即它如何允许不在内存中加载数据。
至少无法理解为什么在 Screen 中我们输入地址 [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=load, sel=address[13..14], a=RAM1, b=RAM2, c=scr, d=kbr);
很抱歉一开始就批评你,但是你提出的问题表明你没有自己做这个练习或者没有从头开始整个课程。
回答您的问题:
广告 1.
您将单个位(加载位)多路分解到正确的内存部分。此后,您将输入数据同时提供给所有内存部分。
这比反过来更简单、更整洁,即将 16 位输入定向到正确的部分(RAM16K、屏幕或键盘),同时在每个寄存器上连接并激活加载位在所有部分。
澄清一下。写入数据时有 2 个可能的目的地:RAM 和屏幕。您拥有的最小多路分解器是一个 4 路多路复用器,这就是您正在使用的。写入内存时,需要同时提供两条信息:数据和目的地。
您可以使用 DMux4Way16 对输入数据进行多路分解,并使用 DMux4Way 对单个加载位进行多路分解,但这需要 2 个多路分解器,我们可以做得更好。这就是这里所做的,您将数据输入定向到 RAM 和屏幕,然后只使用一个解复用器:DMux4Way 到 select 2 个可能目的地之一,只有 selected 将加载新数据,其他数据输入将被忽略。知道了这一点,您需要研究 A-instruction 格式:当 A-instruction 的第 14 位和第 13 位(或驻留在 A-register 中的数据)的二进制值为 00
或 01
,目标是 RAM。当第 14 位和第 13 位具有二进制值 10
时,表示屏幕是目标。
当您注意到您选择这 2 位作为多路分解器的 sel 时。选择 0 和 1 具有相同的含义,因此您可以对它们进行“或”操作并将输出作为负载馈送到 RAM。选择 2 意味着 Screen 将加载一个新值,因此加载位就在那里。选择 3 从未使用过,所以我们不关心它 - 多路分解器的输出 d 不会连接到任何地方。我们利用多路分解器的特性:selected 输出的值为 1,所有其他输出结果为 0。这意味着只会加载 1 个内存目标。
广告 2.
Screen 是独立的设备,这里与 RAM、ROM 或 Keyboard 存储设备无关。你,也只有你,赋予比特对这个特定设备意味着什么的意义。要回答你的问题,当你在 Screen 中寻址某个寄存器时,你会在它自己的内部地址 space 中寻址它。在其内部地址 space 中,第一个地址将为 0,但从整个内存来看,它将为 16384。进行此转换是您的工作。在这种特殊情况下,屏幕存储设备的大小没有必要使用 14 位地址总线,13 位就足够了。在这种情况下,第 14 位意味着什么?它不会增加任何价值。另外,你是Screen的用户,不是设计者,你只看界面描述,按照界面说明操作。
希望它能回答你的问题,如果没有,我建议你回去更仔细地学习课程中以前的硬件相关章节。
我在nand2tetris课程中实现了Data memory的实现。但是我真的不明白我实现的某些部分:
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);
}
- 这里负责什么负载。我知道如果负载为 0 - 在任何情况下,Dmux4Way 之外的内容都将为 0 0 0 0。但我不明白在那之后它是如何工作的。即它如何允许不在内存中加载数据。
至少无法理解为什么在 Screen 中我们输入地址 [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=load, sel=address[13..14], a=RAM1, b=RAM2, c=scr, d=kbr);
很抱歉一开始就批评你,但是你提出的问题表明你没有自己做这个练习或者没有从头开始整个课程。
回答您的问题:
广告 1.
您将单个位(加载位)多路分解到正确的内存部分。此后,您将输入数据同时提供给所有内存部分。
这比反过来更简单、更整洁,即将 16 位输入定向到正确的部分(RAM16K、屏幕或键盘),同时在每个寄存器上连接并激活加载位在所有部分。
澄清一下。写入数据时有 2 个可能的目的地:RAM 和屏幕。您拥有的最小多路分解器是一个 4 路多路复用器,这就是您正在使用的。写入内存时,需要同时提供两条信息:数据和目的地。
您可以使用 DMux4Way16 对输入数据进行多路分解,并使用 DMux4Way 对单个加载位进行多路分解,但这需要 2 个多路分解器,我们可以做得更好。这就是这里所做的,您将数据输入定向到 RAM 和屏幕,然后只使用一个解复用器:DMux4Way 到 select 2 个可能目的地之一,只有 selected 将加载新数据,其他数据输入将被忽略。知道了这一点,您需要研究 A-instruction 格式:当 A-instruction 的第 14 位和第 13 位(或驻留在 A-register 中的数据)的二进制值为 00
或 01
,目标是 RAM。当第 14 位和第 13 位具有二进制值 10
时,表示屏幕是目标。
当您注意到您选择这 2 位作为多路分解器的 sel 时。选择 0 和 1 具有相同的含义,因此您可以对它们进行“或”操作并将输出作为负载馈送到 RAM。选择 2 意味着 Screen 将加载一个新值,因此加载位就在那里。选择 3 从未使用过,所以我们不关心它 - 多路分解器的输出 d 不会连接到任何地方。我们利用多路分解器的特性:selected 输出的值为 1,所有其他输出结果为 0。这意味着只会加载 1 个内存目标。
广告 2.
Screen 是独立的设备,这里与 RAM、ROM 或 Keyboard 存储设备无关。你,也只有你,赋予比特对这个特定设备意味着什么的意义。要回答你的问题,当你在 Screen 中寻址某个寄存器时,你会在它自己的内部地址 space 中寻址它。在其内部地址 space 中,第一个地址将为 0,但从整个内存来看,它将为 16384。进行此转换是您的工作。在这种特殊情况下,屏幕存储设备的大小没有必要使用 14 位地址总线,13 位就足够了。在这种情况下,第 14 位意味着什么?它不会增加任何价值。另外,你是Screen的用户,不是设计者,你只看界面描述,按照界面说明操作。
希望它能回答你的问题,如果没有,我建议你回去更仔细地学习课程中以前的硬件相关章节。