数字系统设计实验流水线MIPS微处理器设计

上传人:无*** 文档编号:63395238 上传时间:2022-03-18 格式:DOC 页数:31 大小:3.04MB
返回 下载 相关 举报
数字系统设计实验流水线MIPS微处理器设计_第1页
第1页 / 共31页
数字系统设计实验流水线MIPS微处理器设计_第2页
第2页 / 共31页
数字系统设计实验流水线MIPS微处理器设计_第3页
第3页 / 共31页
点击查看更多>>
资源描述
一、实验目的(1)了解提高CPU性能的方法。(2)理解数据冒险、控制冒险的概念以及流水线冲突的解决方法。(3)掌握流水线MIPS微处理器的工作原理。(4)掌握流水线MIPS微处理器的测试方法。二、实验任务设计一个32位流水线MIPS微处理器,具体要求如下设计要求:(1)至少执行下列MIPS32指令。1 算数运算指令:ADD ADDU SUB SUBU ADDI ADDU2 逻辑运算指令:AND OR NOR XOR ANDI ORI XORI SLT SLTI SLTU SLTIU3 移位指令:SLL SLLV SRL SRLV SRA4 条件分支指令:BEQ BNE BGEZ BGTZ BLEZ BLTZ5 无条件跳转指令:J JR6 数据传输指令:LW SW7 空指令:NOP(2)在用5级流水线技术,对数据冒险实现转发或阻塞功能。(3)在XUP Vietex-II Pro开发系统中实现MIPS微处理器,要求CPU的运行速度大于25MHz.三、实验原理1.流水线MIPS CPU总体设计流水线是数字系统中一种提高系统稳定性和工作速度的方法,广泛应用在高档CPU的构建中。根据MIPS处理器指令的特点,将整体的处理过程分为取指令(IF)、指令译码、执行、存储器访问和寄存器写回五级,对应多周期CPU的五个处理阶段。如图1所示,一个指令的执行需要五个时钟周期,每个时钟周期上升沿来临时,此指令所代表的一系列数据和控制信息转移到下一级处理。图1 流水线流水作业示意图一条MIPS指令分为五个处理步骤,即五级流水线,的具体执行过程如图2所示。图2 五级流水线MIPS CPU初步原理框图流水线寄存器:为了在其它四级流水线中各条指令保持各自的值,从指令存储器中读出的指令必须保存在寄存器中。同样的方法应用到每个流水线步骤中,需要在上图中各级之间加入寄存器,如图3所示。图3.在各级分割线添加寄存器后的框图由于在流水线中,数据和控制信息将在时钟上升沿转移到下一级,所以规定流水线转移的变量命名遵守如下格式:名称_流水线级名称。例如,在ID级指令译码电路(DECODE)产生的寄存器写允许信号RegWrite在ID级、EX级、MEM级和WB级上的命名分别为RegWrite_id、RegWrite_ex、RegWrite_men和RegWrite_wb。在顶层文件中,类似的变量名称有近百个,这样的命名方式起到了很好的识别作用。1MIPS指令格式:R型指令格式 本实验需要实现的R型指令有:I)算术逻辑运算指令: ADD、ADDU、SUB、SUBU、AND、OR、NOR、 XOR 、SLT、SLTUII)移位指令:SLLV、SRLV、SRAV、SLL、SRL、SRAIII)寄存器跳转指令:JRI型指令格式本实验需要实现的I型指令有:I)存储器访问指令:LW、SWII)立即数算术逻辑运算指令:ADDI、ADDIU、ANDI、ORI、XORI、SLTI、SLTIUIII)分支指令:BEQ、BNE、BGEZ、BGTZ、BLEZ、BLTZ分支地址为:PC+4+(sign-extend(Imm)2)J型指令格式本实验需要实现的J型指令只有:无条件跳转指令:J跳转地址为:PC31:28,IR25:0,2b00特别注意:1、 寄存器跳转指令JR不是J型指令,而是R型指令,其指令格式为:跳转地址为:$ra,寄存器号为rs2、 移位指令SLL、SRL、SRA只有rt一个源操作数:3、取字指令的操作过程:rt = Memrs+sign_extend(imm) 存字指令的操作过程: Memrs+sign_extend(imm) =0)5d12BGTZ_opxxxxx5d0Z=(A0)5d13BLEZ_opxxxxx5d0Z=(A=1)5d14BLTZ_opxxxxx5d0Z=(A0)5d15R_type_opADD_functxxxxx加5d0ADDU_functxxxxxAND_functxxxxx与5d1XOR_functxxxxx异或5d2OR_functxxxxx或5d3NOR_functxxxxx或非5d4SUB_functxxxxx减5d5SUBU_functxxxxxSLT_OP_functxxxxxAB? 1:05d19SLTU_OP_functxxxxxAA5d16SLLV_functxxxxxSRL_functxxxxxBA5d18ARAV_functxxxxxADDI_opxxxxxxxxxx加5d0ADDIU_opxxxxxxxxxxANDI_opxxxxxxxxxx与5d1XORI_opxxxxxxxxxx异或5d2ORI_opxxxxxxxxxx或5d3SLTI_opxxxxxxxxxxAB? 1:05d19SLTIU_opxxxxxxxxxxAB? 1:0(无符号数)5d20SW_opxxxxxxxxxx加(计算地址)5d0LW_opxxxxxxxxxx(2) 分支检测(Branch Test)电路的设计Zero检测电路主要用于判断Branch指令的分支条件是否成立,其中BEQ、BNE两个操作数为RsData与RtData,而BGEZ、BGTZ、BLEZ和BLTZ指令则为RsData与常数0比较,所以输出信号Z的表达式为:RsData31 | (| RsData31: 0) ; ALUCode=alu _blezRsData31 ; ALUCode=alu _bltz RsData31 & (| RsData31: 0) ; ALUCode=alu _bgtzZ= RsData31; ALUCode=alu _bgez| ( RsData31: 0 RtData31: 0) ; ALUCode=alu_bne& ( RsData31: 0 RtData31: 0 ); ALUCode=alu_beq0; ALUCode=OTHER(3) 寄存器堆(Registers)子模块的设计寄存器堆由32个32位寄存器组成,这些寄存器通过寄存器号进行读写存取。寄存器堆的原理框图如下图所示。因为读取寄存器不会更改其内容,故只需提供寄存号即可读出该寄存器内容。读取端口采用数据选择器即可实现读取功能。应注意“0”号寄存器为常数0.对于往寄存器里写数据,需要目标寄存器号(WriteRegister)、待写入数据(WriteData)、写允许信号(RegWrite)三个变量。图3.13中5位二进制译码器完成地址译码,其输出控制目标寄存器的写使能信号EN,决定将数据WriteData写入哪个寄存器。在流水线CPU设计中,寄存器堆设计还应解决三阶数据相关的数据转发问题。当满足三阶数据相关条件时,寄存器具有Read after Write的特性。为实现该功能,在寄存器堆的基础上加一转发电路。如下图所示。图中转发检测电路的输出表达式为RsSel=RegWrite_wb&(RegWriteAddr_wb=0)&(RegWriteAddr_wb=RsAddr_id)RtSel=RegWrite_wb&(RegWriteAddr_wb=0)&(RegWriteAddr_wb=RtAddr_id)(4) 冒险检测功能电路(Hazard Deterctor)的设计冒险成立的条件为: 上一条指令是LW指令,即MemRead_ex=1; 在EX级的LW指令与在ID级的指令读写的是同一个寄存器,即RegWriteAddr_ex=RsAddr_id 或 RegWriteAddr_ex=RtAddr_id解决冒险的方法为: 插入一个流水线气泡Stall清空ID/EX寄存器并且阻塞流水线ID级、IF级流水线,有:Stall=(RegWriteAddr_ex=RsAddr_id)|(RegWriteAddr_ex=RtAddr_id)&MemRead_ex 保持PC寄存器和IF/ID流水线寄存器不变,有:PC_IFWrite=Stall(5) 其它单元电路的设计 Branch指令分支地址的计算电路:BranchAddr=NextPC_id+(sign-extend(Imm_id)2) JR指令跳转地址的计算电路:JRAddr=RsData_id J指令跳转地址的计算电路:Jaddr=NextPC_id31:28,IR_id25:0,2b00 符号扩展的方法针对有符号数 如果最高位(即符号位)是0,则要扩展的高位用0补齐;如果最高位是1,则用1补齐。 例: 8位的+1,表示为二进制为,扩展成16位的话,符号扩展为00001;8位的-1,表示成二进制为11111111,扩展成16位的话,符号扩展为1111111111111111 。 0扩展的方法针对无符号数 要扩展的高位用0补齐。 例:16位二进制0xFFFF, 0扩展成32位为0x0000FFFF。3、执行模块(EX)的设计执行模块主要有ALU子模块、转发电路Forwarding以及若干数据选择器组成。这行模块的接口信息如下表所示:引脚名称方向说 明RegDst_exInput决定Register回写时采用的地址(rt/rd)ALUCode_ex4:0决定ALU采用何种运算ALUSrcA_ex决定ALU的A操作数的来源(rs/Sa)ALUSrcB_ex决定ALU的B操作数的来源(rt/Imm)Imm_ex31:0立即数Sa_ex31:0移位位数RsAddr_ex4:0Rs寄存器地址,即Instruction_id25:21RtAddr_ex4:0Rt寄存器地址,即Instruction_id20:16RdAddr_ex4:0Rd寄存器地址,即Instruction_id15:11RsData_ex31:0Rs寄存器数据RtData_ex31:0Rt寄存器数据RegWriteData_wb31:0写入寄存器的数据ALUResult_mem31:0ALU输出数据RegWriteAddr_wb4:0寄存器的写地址RegWriteAddr_mem4:0RegWrite_wb寄存器写允许信号RegWrite_memRegWriteAddr_ex4:0Output寄存器的写地址ALUResult_ex31:0ALU运算结果MemWriteData_ex31:0寄存器的回写数据ALU_A31:0ALU操作数,测试时使用ALU_B31:0(1) ALU子模块的设计ALU是提供CPU基本运算能力的重要电路。ALU执行何种运算,由控制单元中的ALU控制器输出的ALUCode信号决定。ALU功能见下表:为了提高运算速度,可将各种运算同时执行,得到的运算结果由ALUCode信号进行挑选。ALU的基本结构如下图所示。1 加、减电路的设计考虑减法、比较(SLT、SLTI)均可用加法器和必要的辅助电路来实现。上图中的Binvert信号控制加减运算:Binvert=(ALUCode=alu_add)对ALU来说,它的两个操作数输入时都已经是补码形式,当要完成两个操作数的 减法时,即A补-B补,可将减法转换为加法,利用加法器来实现:A补-B补= A补+(-B补)= A补+(B补)补= A补+(B补)反+1 加法器完成的功能为:sum=A+B32Binvert+Binvert当Binvert=0时,sum=A+B0+0= A+B;当Binvert=1时,sum=A+B32b1+1= A-B;(B32b1即对B按位取反)即可完成加减运算。由于32位加法器的运算速度影响着CPU频率的高低,因此设计一个高速加法器尤 为重要,本实验采用lab7中介绍的32位进位选择加法器。2 比较电路的设计考虑对于比较运算,如果最高为不同,即A31B31,则根据A31、B31决定比较结果,但应注意有符号数和无符号数比较运算的区别。1、在有符号数比较SLT运算中,判断AB的方法为:若A为负数、B为0或正数:A31&(B31)若A、B符号相同,A-B为负:(A31B31) & sum31则 SLTResult=(A31&(B31) |( (A31B31) & sum31)2、在无符号数比较SLT运算中,判断A”。要实现算术右移应注意,被移位的对象必须定义为reg类型,但是在SRA指令,被移位的对象操作数B为输入信号,不能定义为reg类型,因此必须引入reg类型中间变量B_reg,相应的Verilog HDL语句为:reg signed 31:0 B_reg;always (B) beginB_reg = B; end引入reg类型的中间变量B_reg后,就可对B_reg进行算术右移操作。4 逻辑运算与、或、或非、异或、逻辑移位等运算较为简单,只是要注意一点,ANDI、XORI、ORI三条指令的立即数为16位无符号数,应“0扩展”为32位无符号数,在运算的同时完成“0扩展”。如:ADDI指令的运算为A&16b0,B15:0。(2) 转发电路Forwarding的设计操作数A和B由数据选择器决定,数据选择器的地址信号即为ForwardA和ForwardB。其含义如下表:地址操作数来源说明ForwardA=00RsData_ex操作数A来自寄存器堆ForwardA=01RegWriteData_wb操作数A来自二阶数据相关的转发数据ForwardA=10ALUresult_mem操作数A来自一阶数据相关的转发数据ForwardB=00RtData_ex操作数B来自寄存器堆ForwardB=01RegWriteData_wb操作数B来自二阶数据相关的转发数据ForwardB=10ALUresult_mem操作数B来自一阶数据相关的转发数据ForwardA0=RegWrite_wb&(RegWriteAddr_wb!=0) &(RegWriteAddr_mem!=RsAddr_ex) &(RegWriteAddr_wb=RsAddr_ex);ForwardA1=RegWrite_mem&(RegWriteAddr_mem!=0) &(RegWriteAddr_mem=RsAddr_ex); ForwardB0=RegWrite_wb&(RegWriteAddr_wb!=0) &(RegWriteAddr_mem!=RtAddr_ex) &(RegWriteAddr_wb=RtAddr_ex);ForwardB1=RegWrite_mem&(RegWriteAddr_mem!=0) &(RegWriteAddr_mem=RtAddr_ex);四、存储器访问MEM模块的设计数据存储器利用Xilinx Core Generator实现。考虑到FPGA的资源,数据存储器可设计为容量各为2632bit单端口RAM。由于MIPS系统的32位字地址由4 个字节组成,根据“对齐限制”要求字地址必须是4的倍数,也就是说字地址的低两位必须是0,所以字地址的低两位不接入电路。故我们设计的数据RAM的地址应该接的信号是ALUResult_mem7:2。由于Virtex-II Pro系列的FPGA只能产生带寄存器的内核RAM,所以存储器输出绕过MEM/WB流水线寄存器,直接接入WB级的数据选择器。五、流水线寄存器的设计流水线寄存器负责将流水线的各部分分开,共有IF/ID、ID/EX、EX/MEM、MEM/WB四组。根据前面的介绍可知,四组流水线寄存器要求不完全相同,因此设计也有不同考虑。(1)EX/MEM、MEM/WB两组流水线寄存器只是普通D型寄存器。(2)当流水线发生数据冒险时,需清空ID/EX流水线寄存器而插入一个气泡,因此ID/EX流水线寄存器是一个带同步清零功能的D型寄存器,清零信号为Stall。(3)当流水线发生数据冒险时,需保持IF/ID流水线寄存器不变,因此IF/ID流水线寄存器具有使能信号输入,使能信号为PC_IFWrite;当流水线发生分支冒险时,需清空IF/ID流水线寄存器,清零信号为IF_flush。因此,IF/ID流水线寄存器是一个带使能功能、同步清零功能的D型寄存器。需要注意的是,由于仿真对初始值的要求,上述寄存器都应考虑有reset信号的接入,以提供仿真时各寄存器的初值。六、顶层文件的设计按照流水线MIPS微处理器的原理框图连接各模块即可。为方便测试,可将关键变量输出,关键变量有:指令指针PC、指令码Instruction、流水线插入气泡标志Stall、分支标志JumpFlag(即JR,J,Z)、ALU输入输出(ALU_A、ALU_B、ALUResult)和数据存储器的输出MemDout_wb。五、实验代码见上传的solution六、实验设备1. 装有ISE、ModelSim SE和ChipScope Pro软件的计算机;2. XUP Virtex- Pro开发系统一套;3. SVGA显示器一台。7、 实验仿真结果与分析1.IF级仿真分析1.1顺序执行分析:起初reset信号高电平,初始PC为0。在之后的一段时间内,JR,J,Z一直都是0,0,0,没有跳转和分支指令,CPU每运行一周期,PC递增4。1.2JR跳转分析:当JR为高电平时,PC的为0x34,与JrAddr相同,完成JR跳转。1.3J跳转分析:J=1,当时钟上升沿到来时执行无条件跳转指令,PC跳到JumpAddr = 32h2c;NextPC_if=PC+4。1.4Branch分支分析:Z=1,当时钟上升沿到来时执行Branch指令,PC跳到BranchAddr = 32h4;NextPC_if=PC+4。综上, PC能够根据JR,J,Z,完成顺序执行、JR跳转、J跳转、Branch分支。2. ALU仿真分析仿真整体波形ALUCodeABALUResultoverflow验证ALUResult00000(add)1000200f000000(add)100001(and)ff0c0e1010df30ff100c00100100c001000010(xor)ff0c0e1010df30ffefd33eef0efd33eef00011(or)ff0c0e1010df30ffffdf3eff0ffdf3eff00100(nor)ff0c0e1010df30ff0020c10000020c10000101(sub)70f0c0e060f0908c160f0908c00110(andi)ff0c0e10ffffe0ff000111(xori)ff0c0e10ffffe0ffff0ceeef0ff0ceeef01000(ori)ff0c0e10ffffe0ffff0ceeff0ff0ceeff10000(sll)ffffe0fffffe0ff00fffe0ff010001(srl)ffffe0ff0ffffe0f00ffffe0f10010(sra)ffffe0fffffffe0f0fffffe0f10011(slt)ff000004700000ff010100(sltu)ff000004700000ff0分析:由仿真波形可知,设计的ALU能够完成实验所要求的算术运算和逻辑运算。3. Decode仿真分析3.1 Instruction = 32h20080042; /addi $t0,$0,42观察Instruction前六位,op=Instruction31:26=001000=ADDI_op ,因此该指令ALUCode=alu_addi=00000,此外MemWrite=0,,MemRead=0,Regwrite=1(目标寄存器为rd),MemToReg=0(用ALUResult作为输出),ALUSrcA=0,ALUSrcB=1(此时操作数B=Imm_ex)。因此译码结果完全符合ADDi操作的要求.3.2 Instruction = 32h000c4080; /sll $t0,$t4,2观察Instruction前六位,op=Instruction31:26=000000=R_type_op ,func=Instruction5:0=000000=SLL_funct。因此该指令ALUCode=alu_sll=5d16=10000,此外MemWrite=0,,MemRead=0,Regwrite=1,RegDst=1(写目标寄存器为rd),MemToReg=0(用ALUResult作为输出),ALUSrcA=1(此时操作数A=Sa_ex),ALUSrcB=0。因此译码结果完全符合SLL操作的要求.综上,验证其他控制信号均与Instruction相符合。4. Top仿真分析4.1整体波形分析:与教材表7.20测试结果仔细对照得,变量的变化情况符合要求。4.2 Zero检测电路观察Z信号可发现其满足式子RsData31 | (| RsData31: 0) ; ALUCode=alu _blezRsData31 ; ALUCode=alu _bltz RsData31 & (| RsData31: 0) ; ALUCode=alu _bgtzZ= RsData31; ALUCode=alu _bgez| ( RsData31: 0 RtData31: 0) ; ALUCode=alu_bne& ( RsData31: 0 RtData31: 0 ); ALUCode=alu_beq0; ALUCode=OTHER4.3 阻塞分析分析:Stall信号为高电平时,Instruction与PC均持续两个时钟周期,即发生了阻塞4.4 branch分支指令分析:JumpFlag=001,下一个时钟上升沿PC发生分支。具体分支地址计算如下:Imm_id=16Instruc
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 压缩资料 > 基础医学


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!