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;

我正在尝试研究 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 最终会得到不同的值?

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

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 中,相位同步部分不会改变它们的值。

还要回答

How does it happen that RAM[A] and D end up with different values

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