首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nand2Tetris-从RAM芯片获得寄存器

Nand2Tetris-从RAM芯片获得寄存器
EN

Stack Overflow用户
提问于 2022-10-16 18:42:25
回答 1查看 35关注 0票数 0

我最近完成了本课程相关教科书的第三章:计算的要素,第二版。

虽然我能够实现本章中描述的所有芯片,但我仍然试图了解RAM芯片到底是如何工作的。我想我从理论上理解它们(例如,一个Ram4K芯片存储了一组8 RAM512芯片,它本身就是一组8 RAM64芯片)。

我不确定的是实际使用芯片。例如,假设我尝试使用以下代码从RAM16K输出一个寄存器,给出一个地址:

代码语言:javascript
复制
    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,为什么这个代码没有错误呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-16 19:46:57

我已经有一段时间没有上过这门课了,所以请原谅下面的任何小错误。

每个RAM芯片(无论大小)都由一组较小的芯片组成。如果您正在实现一个16K芯片与4K子芯片,那么他们将有4个。

因此,您可以使用输入地址的2位来选择您需要处理的子芯片,其余的12位将发送到所有子芯片上。只要有一组2和一组12,如何划分这些位并不重要。

具体来说,两个选择位用于将加载信号路由到一个子芯片(即:使用DMux4Way),因此负载只影响一个子芯片,而且它们还用于选择使用哪一个子芯片输出(即Mux4Way16)。

当我这么做的时候,我发现做事情的最简单的方法总是使用最不重要的位作为选择位。例如,我的RAM64芯片使用地址0..2作为选择位,并将地址3..5传递给RAM8子芯片。

让你困惑的是,在这类电路中,所有的子芯片都被激活了。它只是使用select位来决定哪个子芯片的输出传递给输出,并且作为一个过滤器来决定哪个子芯片可能执行一个负载。

俗话说,“海龟(或公羊薯片)一直往下走。”

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74089816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档