nand2tetris CPU.cmp 第17行问题; outM/(RAM[A]) 使用 MD=D-1 指令递减两次;

Posted

技术标签:

【中文标题】nand2tetris CPU.cmp 第17行问题; outM/(RAM[A]) 使用 MD=D-1 指令递减两次;【英文标题】:nand2tetris CPU.cmp line 17 problem; outM/(RAM[A]) decrements twice with MD=D-1 instruction; 【发布时间】:2019-08-13 15:27:05 【问题描述】:

我正在尝试处理 CPU.cmp 文件,写出指令,看看 CPU.cmp 中写的内容是否有意义。

在第 17 行(时间 8)

|time| inM  |  instruction   |reset| outM  |writeM |addre| pc  |DRegiste|
|6+  |     0|0000001111101001|  0  |*******|   0   | 1000|    6|  11111 |a @1001
|7   |     0|0000001111101001|  0  |*******|   0   | 1001|    7|  11111 |a
|7+  |     0|1110001110011000|  0  |  11110|   1   | 1001|    7|  11110 |c MD = D-1; null
|8   |     0|1110001110011000|  0  |  11109|   1   | 1001|    8|  11110 |c

如您所见,D 寄存器的值从(十进制)11111 减 1 到 11110,而 outM 的值反映了这一点。但是,然后 outM 再次递减到 11109。为什么要这样做?该指令为 MD = D-1,因此它应该将 D reg 递减一次,并将值存储在两个位置。 RAM[A] 和 D 的值不同是如何发生的?

我希望它们是一样的......

【问题讨论】:

您,先生,在您的 CPU 中放了一个错误,所以要么自己找到它,要么展示您的工作并寻求帮助。 这是在项目提供的 CPU.cmp 文件中,而不是我的 CPU.hdl 测试输出...所以看起来有问题吗? 好吧,我误解了你,以为你的 CPU 在比较中失败了,你问为什么 .cmp 看起来像这样。 【参考方案1】:

tick 7+,CPU 必须执行指令MD=D-1,正如您已经知道的那样。

此时D=11111

指令是D-1,CPU会在内部计算这个值, 所以outM(输出总线,不是实际内存)是D-1(11110)和寄存器D = 11110。在tock 8 发生写入内存,因此 11110 保存在寄存器 A 的地址中。 CPU 仍然计算 D-1 所以 outM = 11109,完全正确的 CPU 行为,我们不使用这个值,但它代表最后一条指令的结果(仍然是 D-1)。

扩展tickstocks

tick 是时钟上的 1,它是周期的一部分,所有输出和寄存器都有时间更改和稳定其 内部 值。正在加载的寄存器会在输入更改时立即输出其不断变化的内部状态。

tock 是时钟部件开始发射其内部状态并且不会改变其内部值的部分。

这就是为什么 DRegister 与 tick 上的 outM 具有相同的值,ALU 将 D-1 作为它们的值。然后是tock,D 开始发出它的新值(d-1),ALU 计算它的新值(你看到它是 D-2)。 D 不会改变,因为在tock 相位时钟部分不会改变它们的值。

还要回答

RAM[A] 和 D 的值不同是如何发生的

他们没有,outM 和 DRegister 最终得到不同的值。 outM 没有时钟,它是 ALU 的直接输出,计算 out(D) - 1。DRegister 具有与输入相同的 ALU 输出,但由于时钟相位,它不会更新其值。

【讨论】:

“CPU 仍然计算 D-1,所以 outM = 11109,CPU 的行为完全正确”我仍然没有得到任何东西。如果 outM 线再次发生变化是完全正常的,那么为什么 Dregister 在 tock 8 处也没有变化? Dregister 不是直接由 outM 馈送的吗?我想我对蜱虫和蜱虫一无所知。获取指令时是否打勾,并在执行时打勾? 请查看更新后的答案。我仍然建议通过该项目。本课程采用了令人惊叹的增量方法,并且通过这种方式,项目几乎是不言自明的。

以上是关于nand2tetris CPU.cmp 第17行问题; outM/(RAM[A]) 使用 MD=D-1 指令递减两次;的主要内容,如果未能解决你的问题,请参考以下文章

nand2tetris实验0windows找不到文件javaw的解决办法

nand2tetris实验0windows找不到文件javaw的解决办法

Nand2tetris 中的减法实现

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

VMEmulator Nand2Tetris

尝试为 nand2tetris 构建 PC(计数器),但我在逻辑上遇到了一些问题