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)。
扩展ticks
和tocks
:
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的解决办法