8指令多周期MIPS CPU
一、MIPS架构是什么?
- 当前CPU的两大架构是CISC(复杂指令集)和RISC(精简指令集)
- RISC:精简指令集处理器,Reduced Instruction Set Computer
( RISC结构简单,选取了使用频率高的简单指令,指令长度固定,多为单周期指令在功耗、体积、价格等方面有很大优势,多用于嵌入式领域) - MIPS架构:是一种采取精简指令集(RISC)的处理器架构
二、原理图
- 5个流水段分别为
IF(取指),ID(译码),EXE(执行),MEM(访存),WB(回写)。
原理图如下
三、指令设计
1:实验中有三种类型的MIPS指令,分别为R型、I型和J型:
- R(register)类型的指令从寄存器堆中读取两个源操作数,计算结果写回寄存器堆;(两个源操作寄存器,一个目的寄存器)
rd=rs+rt - I(immediate)类型的指令使用一个 16位的立即数作为一个源操作数;
(一个源操作寄存器,一个立即数(需扩展),一个目的寄存器)
rt=rs+immediate - J(jump)类型的指令使用一个 26位立即数作为跳转的目标地址(target address);
MIPS连续字地址相差4,一个地址为8位一个字节,一个字(指令长度)有4个字节。
2:指令的各个位细致划分
- Instruction[31:26]=opcode,操作码,用来区分指令;
- Instruction[ 5:0 ]=funct ,功能码用来区分指令;
- Instruction[25:21]=regardaddr,地址,从寄存器中读取数据的地址;rs
- Instruction[20:16]=regbrdaddr,地址,从寄存器中读取数据的地址;rt
- Instruction[20:16] 或 Instruction[15:11],向寄存器中写数据的地址;rt和rd
四、原理
- 多周期 CPU :将整个 CPU 的执行过程分成几个阶段,每个阶段用一个时钟去完成,然后开始下一条指令的执行,而每种指令执行时所用的时钟数不尽相同。(一条指令的执行最长五个周期,有些不需要)
- IF: PC计数器+Instruction_memory
- 根据计数器PC为Insruction的输入地址,指令存储器里取出一条指令,同时根据指令字节长度自动递增产生下一条指令所需要的指令地址。但遇到“转移地址”指令时,把控制器的“转移地址”送入PC,得到的地址做些变换(左移2位)送入PC。(为什么左移两位,例:偏移量为偏移3个字,但是地址是按照字节编码的,不执行左移会变成偏移3个字节,左移后变成12个字节,一个字为4个字节,即为3个字)
- ID:contorl 产生操作控制信号
- register 寄存器读出数据
- sign_extend 扩展
- EXE:ALU:根据操作信号,执行操作,左移
- MEM:Data_memory 访问存储器,进行写入或读出
- WB: 2选1选择器 回写 指令执行的结果或访存得到的结果 》写入目的寄存器
五、各部分功能
1.PC:拥有指向当前指令的地址和下一条指令地址。实现地址跳转。根据地址跳转的类型可将跳转分成三种,分别是a:自增4 b:j指令 c:beq和bne指令
2:Instruction_memory:读取CPU的指令并进行分析 a: 读取指令 b:读取下一条指令 c:分析指令内容(PC值为地址,读出二进制指令)
3:CPU_crtl :主要用途是接受Instruction_memory中传入的数据,同时给个数据通路端口赋值以达到选择数据输入的目的
- 输入:opcode 和 funct 。
- 输出:RegDstD:决定写入寄存器的地址rd或rt 。
- ALUSrcD:决定输入ALU的输入数SrcB是寄存器读出的regbdata还是立即数signimm(来自于INS[15:0]扩展)R或I指令。
- ALUControlD:判断ALU进行何种运算。
- BranchD:控制跳转(BranchM和zeroM一起)。
- MemWriteD:向Data_memory中读或者写。
- MemtoRegD:向Reg中写入的是ALURes或者Data_memory中读出的数据。
- RegWriteD:是否向reg中写入数据。
4:register :寄存器的读写 a:根据ctrl的数据,选择传入的数据地址(由INS提供) b:初始化 c:读和写(写不一定,但是一定读出,虽然不一定用)
(写使能由CPU_crtl 提供,一直同步到WB再传入reg,控制何时写入。MemtoRegD:向Reg中写入的是ALURes或者Data_memory中读出的数据。)
5:sign_extend:立即数最高位为符号位来扩展立即数
6:ALU:运算 beq和bne使用异或
7:data_memory:用于存储器的读写(读写使能来自ctrl,控制何时写入,只能单读或单写,地址为ALU运算结果。写数据来自reg读出数据)
8:MUX:决定回写的数据,MemtoRegD
(使能信号,在时钟上升沿同步到下一级流水,以此控制何时使能)