首页 > 解决方案 > 如果指令是 c 指令,在这个(nand2tetris)CPU 实现中应该发生什么?

问题描述

看到这个 CPU 实现,我完全糊涂了(这不仅仅是因为控制位没有与任何东西连接;连接这些是我的任务)。

首先让我感到困惑的是,如果即将到来的指令是一个 c 指令,那么会发生什么?假设 Mux16 将让 c 指令通过……然后指令通过 A 寄存器……你为什么要这样?!

如果我的理解是正确的,那取决于控制位,要么什么都不做(控制位(加载)为假),要么无论指令指定什么,A寄存器现在都将存储指令......

我在这里错过了什么吗?!到底是怎么回事?为什么需要该功能?

在此处输入图像描述

(CPU实现的来源是:link go to time 3:30)

标签: architecturecpucpu-architecturecpu-registersnand2tetris

解决方案


此图中的各个 c 标记不引用指令中的“cccccc”位字段。它们是单比特控制线(命名法可能更清楚一点;进入 ALU 的 C 实际上是 cccccc 位!)

因此,传入的指令不只是转到第一个 Mux,它会遍及整个地方。

约定:最右位为0,最左位为15。所以jjj位为位0、1、2,ddd为3-5,cccccc为6-11,a为12等。

考虑最左边的 Mux16。它有两个输入,ALU 输出和指令本身。它需要的控制位决定指令是否是直接加载(即:指令的低15位是要加载到A寄存器中的数据)与否。

这是第 15 位。如果为 0,则为 A 指令,如果为 1,则为 C 指令。

我在实现中所做的是定义一个名为 aInstr 的控制线,如下所示:

Not(in=instruction[15],out=aInstr);

然后使用 Mux16 为 A 寄存器生成正确的输入:

Mux16(a=ALUout,b[15]=false,b[0..14]=instruction[0..14],sel=aInstr,out=AREGin);

所以如果aInstr为假,则Mux16通过ALU的输出,如果为真,则通过最左边位清零的指令。这就是在指令周期结束时馈入 A 寄存器的内容。

您必须对所有其他组件执行类似的操作。

请注意使用位域来生成 16 位输入,其中高位为 0,指令中的 15 位(多路复用器的“b”输入)。这是 HDL 的一个特性,非常方便;您还可以使用它将输出拆分为子总线,它们可以重叠!

创建 CPU 的任务基本上是弄清楚每个功能单元的输入和输出是什么,以及哪些指令/cpu 位控制它们。棘手的问题是弄清楚在特殊情况下各种输出应该是什么(比如复位以及不执行 ALU 操作时如何处理 ALU 输出)

不要放弃!当一切都到位时,您会感觉良好!


推荐阅读