经过单周期CPU的洗礼,我们接下来要做的就是多周期CPU了。因为有很多单周期的代码可以复用,所以多周期写起来没有那么困难。
多周期CPU原理
多周期CPU就是指一条指令在多个时钟周期内完成,本身并不涉及多级流水线的设计,所以执行指令的性能反而不如单周期CPU。不过每一条指令在不同的时钟周期完成不同的阶段,因此执行指令的流程会更容易理解。每一条指令最多包含以下五个阶段:
- 取指令:sIF状态,读取下一条指令地址 。
- 指令译码:sID状态,读取下一条指令。
- 指令执行:sEXE状态,执行运算。
- 存储器访问:sMEM状态,读写数据存储器。
- 写回:sWB状态,写入寄存器。
多周期CPU设计
多周期CPU和单周期CPU基本框架差不多,直接复用代码并稍作调整。然后因为每一条指令需要多个时钟周期执行,所以需要记录当前阶段(即状态)以及保存各阶段数据,其中指令的读取、状态的转移、寄存器的写入和数据寄存器的刷新均由时钟信号触发,如何分配上升沿和下降沿触发是多周期CPU设计的难点。
我的设计是由状态驱动指令的执行,即所有控制信号都由当前的状态和指令操作码共同确定,这就需要严格保证在每一个阶段先转移状态再执行指令。具体来说就是在每个时钟周期的上升沿触发状态转移,然后在下降沿读指令、写寄存器、刷新数据寄存器。因为上升沿只触发状态转移,所以状态转移不会与其它任何时序逻辑发生冲突,从而保证在下降沿当前状态可以确定当前阶段。虽然下降沿同时执行各种操作,但它们互不干扰,这是因为时序逻辑模块的触发不会影响整个CPU,影响的范围