我最近完成了本课程相关教科书的第三章:计算的要素,第二版。
虽然我能够实现本章中描述的所有芯片,但我仍然试图了解RAM芯片到底是如何工作的。我想我从理论上理解它们(例如,一个Ram4K芯片存储了一组8 RAM512芯片,它本身就是一组8 RAM64芯片)。
我不确定的是实际使用芯片。例如,假设我尝试使用以下代码从RAM16K输出一个寄存器,给出一个地址:
CHIP RAM16K {
IN in[16], load, address[14];
OUT out[16];
PARTS:
Mux4Way16(a=firstRam, b=secondRam, c=thirdRam, d=fourthRam, sel=address[12..13], out=out);
And(a=load, b=load, out=shouldLoad);
DMux4Way(in=shouldLoad, sel=address[12..13], a=setRamOne, b=setRamTwo, c=setRamThree, d=setRamFour);
RAM4K(in=in, load=setRamOne, address=address[0..11], out=firstRam);
RAM4K(in=in, load=setRamTwo, address=address[0..11], out=secondRam);
RAM4K(in=in, load=setRamThree, address=address[0..11], out=thirdRam);
RAM4K(in=in, load=setRamFour, address=address[0..11], out=fourthRam);
}上面的代码是如何得到底层寄存器的?如果我正确理解芯片的描述,它应该返回一个寄存器。我可以看到,它基于一系列地址位输出一个RAM4K --它是否也通过底层的芯片递归地获得基本寄存器本身?当我们期望一个寄存器时,如果它输出一个RAM4K,为什么这个代码没有错误呢?
发布于 2022-10-16 19:46:57
我已经有一段时间没有上过这门课了,所以请原谅下面的任何小错误。
每个RAM芯片(无论大小)都由一组较小的芯片组成。如果您正在实现一个16K芯片与4K子芯片,那么他们将有4个。
因此,您可以使用输入地址的2位来选择您需要处理的子芯片,其余的12位将发送到所有子芯片上。只要有一组2和一组12,如何划分这些位并不重要。
具体来说,两个选择位用于将加载信号路由到一个子芯片(即:使用DMux4Way),因此负载只影响一个子芯片,而且它们还用于选择使用哪一个子芯片输出(即Mux4Way16)。
当我这么做的时候,我发现做事情的最简单的方法总是使用最不重要的位作为选择位。例如,我的RAM64芯片使用地址0..2作为选择位,并将地址3..5传递给RAM8子芯片。
让你困惑的是,在这类电路中,所有的子芯片都被激活了。它只是使用select位来决定哪个子芯片的输出传递给输出,并且作为一个过滤器来决定哪个子芯片可能执行一个负载。
俗话说,“海龟(或公羊薯片)一直往下走。”
https://stackoverflow.com/questions/74089816
复制相似问题