我在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)
至少无法理解为什么在屏幕中我们输入地址[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);