nand2tetris - 内存芯片实现中的无限循环问题 (Nand2Tetris)
问题描述
我有两个几乎相同的内存芯片实现,除了一个可以工作,另一个,当我在硬件模拟器中使用 Memory.tst 进行测试时,当程序希望我按 Y 键时给出一个无限循环。
WORKS的实现是:
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);
}
不工作的实现是:
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。这应该有效,但它没有。我会很高兴有人能告诉我为什么。
通过给定测试的其他实现将是:
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)。
解决方案
查看两种实现之间的差异,您应该考虑两个问题。
DMux4Way 的实施是否正确产生输出 d?
如果 outRam、outScreen和outKbd 都为假,Mux4Way16 如何响应?因为乍一看,如果你给它一个 0x6nnn 范围内的地址,而不是 0x6000,就会发生这种情况。
祝你好运!
推荐阅读
- c# - 实体框架 6 App.config 文件未创建
- firebase - 如何将 Firebase 身份验证令牌用于 YouTube API 访问令牌
- ffmpeg - 是否可以在 UWP 中将 MediaTransportControls 与 FFmpegInterop 一起使用?
- reactjs - 如何在 React 应用程序中的所有 onclick 处理程序之前运行通用代码?(解决 Safari 中键单击错误)
- flutter - 文本的 OnPressed 参数问题
- python - 元流数据对象未存储在 S3 中
- airflow - apache气流:initdb vs resetdb
- python - PythonWin 在不同版本中打开不同的脚本(Python 2 & Python 3)
- go - 评估字符串(字符串到 [] 字符串)
- ios - Swift - Firebase - 订单收集