首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存芯片实现(Nand2Tetris)中的无限循环问题

内存芯片实现(Nand2Tetris)中的无限循环问题
EN

Stack Overflow用户
提问于 2020-11-29 23:23:36
回答 1查看 80关注 0票数 0

我有两个几乎相同的内存芯片实现,除了一个正常工作,另一个,当我用Memory.tst在硬件模拟器中测试时,当程序要求我按下Y键时,会给出一个无限循环。

有效的实现是:

代码语言:javascript
复制
 CHIP Memory {
    IN in[16], load, address[15];
    OUT out[16];

    PARTS:
    // RAM
    // [00]0 0000 0000 0000
    // [01]1 1111 1111 1111
    // Screen
    // [10]0 0000 0000 0000
    // [10]0 1111 1111 1111
    // Keyboard
    // [11]0 0000 0000 0000
    DMux4Way(in=load, sel=address[13..14], a=ram1, b=ram2, c=loadScreen, d=ignored);
    Or(a=ram1, b=ram2, out=loadRam);
    
    RAM16K(in=in, load=loadRam, address=address[0..13], out=outRam);
    Screen(in=in, load=loadScreen, address=address[0..12], out=outScreen);

    And(a=address[13], b=address[14], out=canBeKbd);
    Or8Way(in=address[0..7], out=anyOne07);
    Or8Way(in=address[5..12], out=anyOne512);
    Or(a=anyOne07, b=anyOne512, out=anyOne012);
    Not(in=anyOne012, out=allZero012);
    And(a=canBeKbd, b=allZero012, out=isKbd);
    Keyboard(out=kdb);
    Mux16(a=false, b=kdb, sel=isKbd, out=outKbd);

    Mux4Way16(a=outRam, b=outRam, c=outScreen, d=outKbd, sel=address[13..14], out=out);
}

不起作用的实现是:

代码语言:javascript
复制
 CHIP Memory {
    IN in[16], load, address[15];
    OUT out[16];

    PARTS:
    // RAM
    // [00]0 0000 0000 0000
    // [01]1 1111 1111 1111
    // Screen
    // [10]0 0000 0000 0000
    // [10]0 1111 1111 1111
    // Keyboard
    // [11]0 0000 0000 0000
    DMux4Way(in=load, sel=address[13..14], a=ram1, b=ram2, c=loadScreen, d=canBeKbd);
    Or(a=ram1, b=ram2, out=loadRam);
    
    RAM16K(in=in, load=loadRam, address=address[0..13], out=outRam);
    Screen(in=in, load=loadScreen, address=address[0..12], out=outScreen);

    Or8Way(in=address[0..7], out=anyOne07);
    Or8Way(in=address[5..12], out=anyOne512);
    Or(a=anyOne07, b=anyOne512, out=anyOne012);
    Not(in=anyOne012, out=allZero012);
    And(a=canBeKbd, b=allZero012, out=isKbd);
    Keyboard(out=kdb);
    Mux16(a=false, b=kdb, sel=isKbd, out=outKbd);

    Mux4Way16(a=outRam, b=outRam, c=outScreen, d=outKbd, sel=address[13..14], out=out);
}

第二个实现的唯一区别是我从第一个DMux获取canBeKbd。这应该行得通,但是不行。如果有人能告诉我为什么,我会很高兴。

通过给定测试的其他实现包括:

代码语言:javascript
复制
CHIP Memory {
    IN in[16], load, address[15];
    OUT out[16];

    PARTS:
    // RAM
    // [00]0 0000 0000 0000
    // [01]1 1111 1111 1111
    // Screen
    // [10]0 0000 0000 0000
    // [10]0 1111 1111 1111
    // Keyboard
    // [11]0 0000 0000 0000
    DMux4Way(in=load, sel=address[13..14], a=ram1, b=ram2, c=loadScreen, d=loadKbd);
    Or(a=ram1, b=ram2, out=loadRam);
    
    RAM16K(in=in, load=loadRam, address=address[0..13], out=outRam);
    Screen(in=in, load=loadScreen, address=address[0..12], out=outScreen);
    Keyboard(out=outKbd);

    Mux4Way16(a=outRam, b=outRam, c=outScreen, d=outKbd, sel=address[13..14], out=out);
}

但我不能使用第三个实现,因为我不会测试所有前12位都是0。因为键盘存储器位置仅为0011 0000 0000 0000 (0x6000)。

EN

回答 1

Stack Overflow用户

发布于 2020-11-30 03:00:17

看看这两种实现之间的区别,你会想到两个问题,你应该考虑。

  1. 是DMux4Way正确生成输出d?

的实现

  1. 如果outRam、outScreen和outKbd都为false,Mux4Way16如何响应?因为乍一看,如果您为其提供的地址在0x6nnn范围内,而不是0x6000,则可能会发生这种情况。

祝好运!

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

https://stackoverflow.com/questions/65061745

复制
相关文章

相似问题

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