(Nand2tetris CPU) (What/How much) 发生在每个时钟周期?

(Nand2tetris CPU) (What/How much) happens in each clock cycle?

Nand2tetrisCPU的基础上,如下图,想了解以下内容:

  1. (What/How much) 发生在每个时钟周期? (参见 IMG_1 和 IMG_2)

  2. 作为问题1的后续问题,程序计数器应该什么时候改变?


请注意,我知道时钟是什么,什么时候

IMG_1


IMG_2

Nand2Tetris 仿真掩盖了时钟的许多微妙之处。没有 tick/tock 个阶段。相反,有一个特殊的 DFF(数据 flip-flop)组件可以解决内存需求。

可视化它的方法是将组件划分为没有内部状态的组件(那些是其输入的纯函数,例如没有 DFF 构建的任何组件)。这些只是在输入改变时立即改变它们的输出状态。

DFF 基本上将其新状态计算为其输入的纯函数,但将输出该状态延迟一个周期。所以它有上一个周期状态的内部记忆。事实证明,这就是实现 tick/tock 时钟的等价物所需的全部内容。

有关这方面的更多详细信息,请参阅 https://docs.wixstatic.com/ugd/56440f_e458602dcb0c4af9aaeb7fdaa34bb2b4.pdf

DFF 将在滴答阶段“锁定”输入。然后在tock阶段输出。

假设您有一条 A 指令。在节拍阶段,A 寄存器锁存指令中的值。但是旧的 A 寄存器值仍然是输出。在 tock 阶段,A 寄存器最终输出新值。您可以在硬件模拟器中验证这一点。

我们需要滴答声的原因是电路反馈。

假设你想做 A=A+D。你已经有了 A 和 D 值。而且时钟没有滴答声:

  • A寄存器的值冲入ALU
  • D寄存器值也是如此
  • ALU输出returns到A寄存器
  • 然后我们再次从顶部开始使用新的 A 值...

...直到我们决定读取该值。因此,您无法确定执行 add ALU 指令的次数。

但是对于滴答时钟,在滴答阶段,A 值离开 A 寄存器并进入 ALU,然后 ALU 值返回到 A 寄存器。但只有在“tock”时,A 寄存器才开始输出这个新值。因此,您可以使用时钟的滴答声来确定 CPU.

的状态

而且程序计数器也是一个DFF。所以在 tick 中它会锁定一个新值(增量或跳转到的位置)。只有在滴答声中它才会输出到 ROM。

我必须使用 youtube 教程和一些电子学堆栈溢出的答案来研究触发器才能理解这一切。