architecture - 如果指令是 c 指令,在这个(nand2tetris)CPU 实现中应该发生什么?
问题描述
看到这个 CPU 实现,我完全糊涂了(这不仅仅是因为控制位没有与任何东西连接;连接这些是我的任务)。
首先让我感到困惑的是,如果即将到来的指令是一个 c 指令,那么会发生什么?假设 Mux16 将让 c 指令通过……然后指令通过 A 寄存器……你为什么要这样?!
如果我的理解是正确的,那取决于控制位,要么什么都不做(控制位(加载)为假),要么无论指令指定什么,A寄存器现在都将存储指令......
我在这里错过了什么吗?!到底是怎么回事?为什么需要该功能?
(CPU实现的来源是:link go to time 3:30)
解决方案
此图中的各个 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 输出)
不要放弃!当一切都到位时,您会感觉良好!
推荐阅读
- c - 为什么包含结构指针成员的结构编译但包含简单结构成员的结构不编译
- javascript - 函数后面的逗号后面的值(数组)在Javascript中是什么意思?(() => {}, [])
- python - 用于 Python 的 Vim 缩进
- angular - 删除选项在邮递员中按预期工作,从 Angular 应用程序触发时无法正常工作
- apache-spark - 从带有变量 Schema 的 dataFrame 列中读取 JSON
- python - 如何使我的代码循环并将以前的结果与新结果相加
- python - 从不为零的字典中打印值(Python)
- python - 如果我断开连接,Google Colab 会继续运行单元以将文件保存在已安装的驱动器中吗?
- postgresql - 是否可以每月添加每种类型的累积总和?
- openlayers - 如何在openLayers的折线中添加样式?