我在 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);
}
- 负责这里的负载。我知道如果负载为 0 - Dmux4Way 在任何情况下都是 0 0 0 0。但我不明白在那之后它是如何工作的。即它如何允许不要在内存中加载数据。
至少无法理解为什么在 Screen 中我们提供 address[0..12] 而不是 address[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);