取指:从指令存储器读取指令 译码:读程序寄存器 执行:计算数值或地址 访存:读或写数据 写回:写程序寄存器 更新PC:更新程序计数器
所有的指令有相同的格式,都按照6个阶段顺序执行 每一阶段的微操作,按照顺序有3-8种 每一条指令在各阶段执行时,根据指令类型按顺序执行不同的微操作
硬件单元(组合、时序逻辑)、控制逻辑、信号连接线 组合逻辑:硬件单元间传播,不用CLK,有延迟 计算逻辑(ALU、PCINC) 读逻辑( PC、CC、RF、imem、dmem) 硬件单元的时序逻辑-状态单元:都在CLK上升沿时更新。控制阻断 时钟寄存器:PC、CC、STAT的更新 随机访问存储器:RF写、dmem写
所谓CPU顺序实现SEQ:一个时钟变化,引发一个经过组合逻辑的流,从而执行整个指令 一条新指令的执行,即一个CLK是把上一条指令计算结果-状态单元更新,然后其值进行组合逻辑(新指令的计算)的传播 要控制CPU中活动的顺序,只需要用CLK控制寄存器和内存 所有6个阶段的所有步骤的状态更新同时发生(逐级延迟) 且只在时钟上升开始下一个周期时。 当前时钟/指令n结束,下一时钟/指令n+1没有到上升沿前,状态单元的数据-状态并不是本指令/时钟n执行的结果,仍然是上一时钟/指令n-1的结果 指令n的执行结果,到下一指令n+1的上升沿才更新到转状态单元
$ $ | halt |
---|---|
取指 | icode:ifun$\leftarrow$M1[PC]读指令字节 |
译码 | |
执行 | Stat$\leftarrow$HLT |
访存 | |
写回 | |
更新PC |
$ $ | nop |
---|---|
取指 | icode:ifun$\leftarrow$M1[PC]读指令字节 valP$\leftarrow$PC+1计算下一个PC |
译码 | |
执行 | |
访存 | |
写回 | |
更新PC | PC$\leftarrow$valP |
$ $ | iraddq V,rB |
---|---|
取指 | icode:ifun$\leftarrow$M1[PC]读指令字节 rA:rB$\leftarrow M_{1}$[PC+1]读寄存器字节 valC$\leftarrow M_{8}$[PC+2]读立即数8个字节 valP$\leftarrow$PC+10计算下一个PC |
译码 | valB$\leftarrow$R[rB]读操作数B |
执行 | valE$\leftarrow$valB+valC Set CC |
访存 | |
写回 | R[rB]$\leftarrow$valE |
更新PC | PC$\leftarrow$valP |
注意:execute中的运算是valB OP valA,而不是valA OP valB | |
M1[PC] 表示从PC开始的内存中读取一个字节的数据 | |
V=====valC,指令中V是加数,是ALUA的一个输入 | |
这些微操作都有现成的硬件结构,所以不需要改动状态单元,但控制逻辑需要稍微调整 |
need_valC:这个指令包括一个常数字吗? bool need_valC = icode in { IIRMOVQ,IRMMOVQ,IMRMOVQ,IJXX,ICALL };
硬件单元: 运算逻辑: ALU、PCINC、 时钟寄存器:PC、CC、STAT、 随机访问存储器:RF、IMEM、DMEM 读操作-看成组合逻辑-有地址就有输出 随机访问存储器:RF、imem/dmem可以用特殊的时钟电路来模拟 时钟寄存器:PC、CC、STAT、 写操作:需要时钟信号控制,控制阻断 RF、DMEM、PC、CC、STAT 控制逻辑:每一阶段每一步骤的微操作,在硬件上的映射 在不同硬件单元之间传送数据 操作硬件单元,使得对不同指令执行指定的微操作 组合逻辑:不需要任何时序或控制,只要输入变化了,值就通过逻辑门网络传播 时序逻辑:需要时钟信号控制,进行更新-把输入锁存到输出