我已经尝试阅读这本书,但我不确定该怎么做。有人有想法吗?
1 回答
因此,在解决这些问题时,最好将数据路径放在您面前并写下寄存器传输语言,您逐步解决这些问题,这有点令人生畏,但是遵循您所学的所有数字逻辑是你是一个海盗,数据路径是你的藏宝图。
为此,您只需按照图中的电线进行操作。我正在使用这个我确定在 Patt/Patel 教科书中https://i.ytimg.com/vi/PeWbyffnkZ4/maxresdefault.jpg
内存[PC + SEXT(IR[8:0])] = SR
时钟周期 1
因此,您需要做的第一件事是 SEXT(IR[8:0]) 那么数据路径中的符号扩展器在哪里,而 IR 在哪里。如果您查看 ADDR2MUX,您会发现它有 4 个输入,每个输入来自 IR,一个为 0。所以 ADDR2MUX=IR[8:0]
接下来,我们需要将 PC 添加到其中。所以 ADDR2MUX 的输出将是 SEXT(IR[8:0]) 所以接下来我们需要将 PC 添加到该输出。我们看到 ADDR2MUX 的输出馈入加法器。所以好的,我们需要用 PC 设置另一个加法器。ADDR1MUX 具有来自寄存器文件和 PC 的输入。所以ADDR1MUX=PC
这两个输入都进入加法器,现在该加法器的输出有 PC + SEXT(IR[8:0])
接下来我们需要存储到内存中,我们要存储的地址是PC + SEXT(IR[8:0]),我们要存储的是SR。那么我们该怎么做呢?为了与内存接口,我们需要将地址放在 MAR(内存地址寄存器)中,并将我们想要存储的数据存储在 MDR 中。所以让我们先做 MAR 步骤。所以我们需要将加法器的结果放入MAR。我们唯一能走的路就是MARMUX。所以MARMUX=ADDER。我们还需要对 MARMUX 进行门控以将其输出到总线上。所以GateMARMUX。
MARMUX 的值现在已输出到总线上,因此我们要将其锁存到 MAR 中,因此LDMAR。
我们现在需要一个新的时钟周期,因为我们需要等待值锁存到寄存器中,这发生在新时钟周期的开始。
时钟周期 1 信号- ADDR2MUX=IR[8:0]、ADDR1MUX=PC、MARMUX=ADDER、GateMARMUX、LDMAR
时钟周期 2
现在让源寄存器进入 MDR。查看图表,我们需要从寄存器文件到 BUS 的路径才能将其放入 MDR。实际上有两种方法可以做到这一点,一种通过 ADDR1MUX,另一种通过 ALU。
我将 ALU 路径作为其稍微正确的路径。
首先我们需要让 SR1 成为指令的源寄存器,所以SR1MUX=[11:9]
指令中的源寄存器现在从 SR1 输出的寄存器文件中出来,这馈送到 ALU。所以我们必须选择 ALU 执行的操作,ALUK=PASSA。PASSA 只是将 ALU 的输出作为“A”输入。
然后我们需要将 ALU 输出放在总线上,所以GateALU
现在 ALU 输出在总线上,我们想将其存储在 MDR 中,但是有一个 MUX 阻塞了该输入。 MIO.EN=0选择总线输出进入 MDR。然后我们需要将该值锁存到寄存器中,以便LDMDR
我们只是尝试将一个值加载到一个寄存器中,这样在下一个时钟周期开始之前它不会在输出中可用,所以..
时钟周期 2 信号- SR1MUX=[11:9], ALUK=PASSA, GateALU, MIO.EN=0, LDMDR
时钟周期 3
我们需要做的就是给内存一个很好的 ol kick 以将 MDR 中的值存储在 MAR 的地址中,所以... MIO.EN=1, R/W=W
时钟周期 3 信号- MIO.EN=1,R/W=W
因此,这结束了 ST 指令,它需要 3 个时钟周期,并且在每个时钟周期结束时会指示断言每个时钟周期的信号。每个时钟周期的所有这些信号都可以同时打开。