在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);
}DMux4Way(in=load,sel=address13..14,a=RAM1,b=RAM2,c=scr,d=kbr);
发布于 2018-04-09 07:18:29
我很抱歉在一开始就批评你,但是你提出的问题表明你自己没有做这个练习,或者从一开始就没有开始整个过程。
回答你的问题:
Ad.1.
您将一个位(加载位)解复用到正确的内存部分。然后,将输入数据同时输入到所有内存部分。
它比相反的方式更容易和更整洁,也就是,引导16位输入到正确的部分(RAM16K、屏幕或键盘),同时在所有部分的每个寄存器上都有一个连接和活动的加载位。
来澄清。您在编写数据时有两个可能的目的地: RAM和Screen。最小的解复用器是一个4路复用器,这就是你正在使用的。当您写入内存时,需要同时提供2条信息:数据和目的地。您可以用DMux4Way16来解复用输入数据,用DMux4Way单独使用单负载位,但这需要两个解复用器,而且我们可以做得更好。这就是这里所做的,您直接将数据输入到RAM和屏幕,然后只使用一个解复用器: DMux4Way来选择两个可能的目的地之一,只有所选的目的地将加载新的数据,而另一个数据输入将被忽略。知道了这一点,您需要学习A-指令格式:当A-指令(或驻留在A-寄存器中的数据)的第14位和第13位具有二进制值00或01__时,目标是RAM。当第14位和第13位具有二进制值10__时,这意味着屏幕是目标。
当您注意到您选择这2位作为您的解复用器的sel。选择0和1具有相同的含义,因此您可以将它们或或并将输出作为load提供给RAM。选择2意味着屏幕将加载一个新的值,所以加载位在那里。选择3从来不使用,所以我们不关心它-输出d的多路复用器将不会连接到任何地方。我们利用解复用器的特性:选择的输出值为1,所有其他输出结果为0。这意味着只有一个内存目的地将被加载。
第2章.
屏幕是独立的设备,它与RAM,ROM或键盘存储设备无关。你,也只有你,赋予了这个特定设备的意义。要回答您的问题,当您在屏幕中寻址某个寄存器时,您可以在它自己的内部地址空间中找到它。在其内部地址空间中,第一个地址将为0,但从整个内存来看,它将为16384。你的工作就是完成这个转变。在这种特殊情况下,屏幕内存设备的大小不需要使用14位地址总线,只需13位即可。在这种情况下,第14位意味着什么?它不会增加任何价值。另外,您是用户,而不是屏幕设计人员,您只需查看并遵循其界面描述。
希望它能回答你的问题,如果不是的话,我敦促你回去仔细学习以前的硬件相关章节的课程。
https://stackoverflow.com/questions/49726985
复制相似问题