首页 > 解决方案 > D寄存器没有更新,这是为什么呢?

问题描述

要复制cpu.out下面显示的文件(尽管没有我的评论), 请使用 thiscpu.hdl,它通过了所有测试。

现在,我的问题是,在时钟周期 3+、4 和 4+。请注意,DRegise(D 寄存器)没有更新,尽管命令是“D=AD”,这是为什么呢?

|time| inM  |  instruction   |reset| outM  |writeM |addre| pc  |DRegiste|
a-instruc | store the number "12345"
|0+  |     0|0011000000111001|  0  |      0|   0   |    0|    0|      0 |
|1   |     0|0011000000111001|  0  |      0|   0   |12345|    1|      0 |

c-instru | comp: "A" | dest: "D" | jump: "no jump" | "D=A" 
|1+  |     0|1110110000010000|  0  |  12345|   0   |12345|    1|  12345 |
|2   |     0|1110110000010000|  0  |  12345|   0   |12345|    2|    |

a-instruc | "23456"
|2+  |     0|0101101110100000|  0  |     -1|   0   |12345|    2|  12345 |
|3   |     0|0101101110100000|  0  |     -1|   0   |23456|    3|  12345 |

c-instruc | comp: "A-D" | dest: "D" | jump: "no jump" | "D=A-D"
|3+  |     0|1110000111010000|  0  |  11111|   0   |23456|    3|  11111 |
|4   |     0|1110000111010000|  0  |  12345|   0   |23456|    4|  11111 |

a-instruc | "1000"                        WHY DREGISTE NOT CHANGE? v^v^
|4+  |     0|0000001111101000|  0  | -11111|   0   |23456|    4|  11111 |
|5   |     0|0000001111101000|  0  | -11111|   0   | 1000|    5|  11111 |

标签: cpucpu-architecturecpu-registersnand2tetris

解决方案


如果您的 cpu.hdl 通过了所有测试,它可能运行正常。

据我所知(我构建 CPU 已经好几年了),Dreg 正在正确更新;它在 + 周期中更新。请注意,在周期 3 中,其值为 12345,而在 3+(处理 D=AD 之后)为 11111(如您所料,为 23456-12345)。

我最好的猜测是,正在发生的事情是模拟器没有在 + 阶段更新 cpu 的输出值,但确实显示了内部状态。所以你看到 + 阶段的 Dreg 变化,但“addre”(它不是内部寄存器,它是外部地址线)仅在非 + 阶段发生变化。


推荐阅读