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)。
扩展 ticks
和 tocks
:
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 输出,但由于时钟相位,它不会更新其值。
我正在尝试研究 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)。
扩展 ticks
和 tocks
:
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 输出,但由于时钟相位,它不会更新其值。