0

我正在尝试处理 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 以不同的值结束是如何发生的?

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

4

1 回答 1

0

正如您已经知道的那样,CPUtick 7+必须执行指令。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 具有与 outM on 相同的值tick,ALU 将 D-1 作为它们的值。然后来tock了,D 开始发出它的新值(d-1),ALU 计算它的新值(你将其视为 D-2)。D 不会改变,因为tock同相时钟部件不会改变它们的值。

也来回答

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

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

于 2019-08-14T12:29:18.733 回答