多周期MIPS微处理器设计一、实验目的(1)、熟悉MIPS指令系统。
(2)、掌握MIPS多周期微处理器的工作原理和实现方法。
(3)、掌握控制器的微程序设计方法。
(4)、掌握MIPS多周期微处理器的测试方法。
(5)、了解用软件实现数字系统设计的方法。
二、实验任务设计一个32位MIPS多周期微处理器,具体的要求如下:1、至少运行下列的6类32条MIPS指令。
(1)、算术逻辑指令:ADD、ADDU、SUB、SUBU、ADDI、ADDIU。
(2)、逻辑运算指令:AND、OR、NOR、XOR、ANDI、ORI、XORI、SLT、SLTU、SLTI、SLTIU。
(3)、位移指令:SLL、SLLV、SRL、SRLV、SRA。
(4)、条件分支指令:BEQ、BNE、BGEZ、BGTZ、BLEZ、BLTZ。
(5)、无条件跳转指令:J、JR。
(6)、数据传送指令:LW、SW。
2、在XUP Virtex-2 Pro开发系统中实现该32位MIPS多周期微处理器,要求运行速度(CPU 工作时钟)大于25MHz。
三、实验设备1、装有ISE、Modelsim SE和Chipscope Pro软件的计算机。
2、XUP Virtex-2 pro开发系统一套。
3、SVGA显示器一台。
四、MIPS指令简介MIPS指令集具有以下特点:1、简单的LOAD/STORE结构:所有的计算机类型的指令均从寄存器堆中读取数据并把结果写入寄存器堆中,只有LOAD和STORE指令访问存储器。
2、易于流水线CPU的设计:MIPS指令集的指令格式非常规整,所有的指令均为32位,而且指令操作码在固定的位置上。
3、易于编译器的开发:一般来讲,编译器在编译高级语言程序时,很难用到复杂的指令,MIPS指令的寻址方式非常的简单,每条指令的操作也非常简单。
MIPS系统的寄存器结构采用标准的32位寄存器堆,共32个寄存器,标号为0-31。
其中第0号寄存器永远为常数0。
CPU所支持的MIPS指令格式一共有3种,分别为R、I、J。
R类型的指令从寄存器堆中读出两个源操作数,计算结果写回到寄存器堆;I类型的指令使用一共16为立即数作为源操作数;J类型的指令使用一共26位立即数作为跳转的目标地址(target address)。
MIPS的指令格式如图1所示,指令格式中OP(operation)是指令操作码;RS(register sourse)是源操作数的寄存器号;RD(register destination)是目标寄存器号;RT(register target)可以既是源寄存器号,又可以使目标寄存器号,由具体位置决定;FUNCT(function)可以被认为是扩展的操作码;SA(shift amount)由移位指令使用,定义移位位数。
I型中的Immediate是16为立即数。
立即数型算术逻辑运算指令、数据传输指令和条件分支指令均采用这种形式。
在立即数型算术逻辑运算指令、数据传送指令中,Immediate进行符号扩展至32位;而在条件分支指令中,Immediate先进行符号扩展至32位再左移2位。
在J形指令中26为target由JUMP指令使用,用于产生跳转的目标地址。
下面通过表格简单介绍本实验使用的MIPS核心指令。
表1列出了本实验使用到的MIPS指令的格式和OP、FUNCT等简要信息。
五、实验原理以及相应Verilog HDL代码图2所示为可实现上述指令的多周期MIPS微处理器的原理框图,根据功能将其分划分为控制单元(cunit)、执行单元(eunit)、指令单元(iunit)以及存储单元(munit)四大模块。
控制单元(cunit)是多周期微处理器的核心,控制微处理器取指令、指令译码和指令执行等工作。
主要由指令译码器控制器(outputs control)、算术逻辑运算控制器(ALU control)两个子模块组成。
执行单元(eunit)主要由寄存器堆(registers)和算术逻辑单元(ALU)两个子模块组成。
其中寄存器是微处理器最基本的元素,MIPS系统的寄存器堆由32个32位寄存器组成;而ALU则是微处理器的主要功能部件,执行加、减、比较等算术运算和与、或、或非、异或等逻辑运算。
这里需要说明的是,图2所示的原理框图中未画出ANDI、ORI、XORI三条指令所需的16位立即数“0扩展”至32位立即数电路,设计时可以将“0扩展”电路功能放在ALU内部完成。
图 2多周期CPU框图指令单元(iunit)的作用是决定下一条指令的地址(PC值)。
存储单元(munit)由存储器(memory)、指令寄存器(instruction register)和存储数据寄存器(memory data register)组成。
1、控制单元(cunit)的设计。
控制单元模块主要作用是通过机器码解析出指令,并根据解析结果控制数据通道工作流程。
控制模块的接口信息如表2所示。
1)、Outputs Control控制器的设计Outputs Control控制器的主要作用是取出指令,并根据指令确定各个控制信号的值。
首先对指令进行分类。
(1)、R型指令。
根据操作数来源可分为R_type1、R_type2和JR三类。
其中,R_type1指令中的两个操作数为寄存器rs、rt;R_type2为三个移位指令,操作数为指令中的sa字段和寄存器rt;JR指令只有一个操作数rs。
根据各指令执行的特点,本实验设计时,将各指令进行了分类:R_type1:包括指令ADD、ADDU、SUB、SUBU、AND、OR、NOR、XOR 、SLT、SLTU、SLLV、SRLV、SRAV。
R_type2:包括指令SLL、SRL、SRA。
JR_type:包括指令JR。
(2)、J型指令。
J_type:包括指令J。
(3)、立即数指令。
I_type:包括指令ADDI、ADDIU、ANDI、ORI、XORI、SLTI、SLTIU。
(4)、分支指令。
Branch:包括指令BEQ、BNE、BGEZ、BGTZ、BLEZ、BLTZ。
(5)、数据传输指令。
LW:包括指令LW。
SW:包括指令SW。
MIPS指令的执行步骤不尽相同。
分支和跳转指令需要3个周期,R型指令和立即数指令需要4个周期,数据传送指令需要4-5个周期。
表3列出了各类指令执行步骤。
从原理框图(图2)我们可以看出,整个CPU中,一共有13组控制信号,○1、RegDst,决定目标寄存器是rt还是rd。
RegDst=0时,rt为目标寄存器。
RegDst=1时,rd为目标寄存器。
○2、RegWrite,决定是否对寄存器(registers)进行写操作。
RegWrite有效时,将数据写入指定的寄存器中。
○3、MemWrite,决定是否对存储器(memory)进行写操作。
MemWrite有效时,将数据写入存储器指定的位置。
○4、MemRead,决定是否对存储器(memory)进行读操作。
MemRead有效时,读取存储器指定位置的数据。
○5、MemtoReg,决定写入寄存器(registers)的数据来自ALUOut还是MDR。
MemtoReg=0时,数据来自ALU。
MemtoReg=1时,数据来自存储器。
✧以上5组控制信号与单周期MIPS CPU中的各个信号一致。
○6、IorD,.决定存储器地址由PC还是ALUOut提供。
IorD=0时,存储器地址来自于PC。
IorD=1时,存储器地址来自于ALU。
○7、IRWrite,决定是否对指令寄存器(IR)进行写操作。
IRWrite有效时,将指令写入指令寄存器中。
○8、PCWrite,决定是否对PC寄存器进行写操作。
PCWrite有效时,对PC寄存器进行写操作;源由PCSource决定。
○9、PCWriteCond在Zero有效的前提下,决定是否对PC寄存器进行写操作。
PCWrite有效时,同时Zero亦有效,对PC寄存器进行写操作。
✧以上9组控制信号均为1位控制信号,而以下4组信号均为2位控制信号。
○10、ALUSrcA,决定ALU第一操作数来源。
ALUSrcA=00时,ALU第一操作数来源于PC。
ALUSrcA=01时,ALU第一操作数来源于寄存器A。
ALUSrcA=10时,ALU第一操作数来源于0扩展的5○11、ALUSrcB,决定ALU第二操作数来源。
ALUSrcB=00时,ALU第二操作数来源于寄存器B。
ALUSrcB=01时,ALU第二操作数为常数“4”。
ALUSrcB=10时,ALU第二操作数来源于符号扩展的16位Imm。
ALUSrcB=11时,ALU第二操作数来源于符号扩展后左移两位的16位Imm。
○12、ALUOp,决定ALU的操作。
ALUOp=00时,ALU进行加操作。
ALUOp=01时,由指令中的op及rt决定。
ALUOp=10时,由指令中的funct决定。
ALUOp=11时,由指令中的op决定。
○13、PCSource,决定写入PC寄存器的来源。
PCSource=00时,写入值为下一条指令的地址PC+4。
PCSource=01时,写入值为ALU计算出的分支地址。
PCSource=10时,写入值为跳转地址。
根据表3所示的指令的执行步骤与指令功能,可以画出Output Control模块的有限状态机图,如图3所示。
从图3中我们可以看出,除了第一周期和第二周期对所有的指令都一样外,在其它周期,不同指令的操作不同,因此控制信号也可能不同:第1周期----取指操作过程:①IR<= Memory[PC];②PC=PC+4设置控制信号:①MemRead有效;②IRWrite有效;③IorD=0;④ALUSrcA=00;⑤ALUSrcB=01;⑥ALUOp=00;⑦PCSource=00;⑧PCWrite有效。
第2周期----指令译码和读取寄存器操作过程:①A <= IR[25:21] B<= IR[20:16];②ALUOut <= PC+ (sign-extend(IR[15:0])<<2)设置控制信号:①ALUSrcA=00;②ALUSrcB=11;③ALUOp=00。
第3周期----指令执行、存储地址的计算或分支的完成在这一周期内CPU的具体操作取决于不同类型的指令。
我们将本实验需要实现的指令分成六类来讨论:I. 存储器访问指令(LW、SW)II. R型指令(除移位指令)— R_type1、JR_typeIII. 移位指令— R_type2Ⅳ. I型指令— I_typeⅤ. 跳转指令— J_typeⅥ. 分支指令— BranchI. 存储器访问指令(LW、SW)操作过程:ALUOut <= A + (sign-extend(IR[15:0]))设置控制信号:①ALUSrcA=01;②ALUSrcB=10;③ALUOp=00II. R型指令(除移位指令)操作过程:ALUOut <= A op B设置控制信号:①ALUSrcA=01;②ALUSrcB=00;③ALUOp=10III. 移位指令操作过程:ALUOut <= B op (zero-extend(IR[10:6]))设置控制信号:①ALUSrcA=10;②ALUSrcB=00;③ALUOp=10Ⅳ. I型指令操作过程:ALUOut <= A op (sign-extend(IR[15:0]))设置控制信号:①ALUSrcA=01;②ALUSrcB=10;③ALUOp=11Ⅴ. 跳转指令操作过程:PC<= { PC[31:28], IR[25:0], 2’b00 }设置控制信号:①PCWrite有效;②PCSource=10Ⅵ. 分支指令操作过程:if ( condition==1 ) PC<= ALUOut分支条件成立时设置控制信号:①ALUSrcA=01;②ALUSrcB=00;③ALUOp=01;④PCSource=01;⑤PCWriteCond有效第4周期----存储器的访问、R型/I型指令的完成。