此图中的各个 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 输出)
不要放弃!当一切都到位时,您会感觉良好!