您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 交通运输 > 西安交通大学组成专题实验报告
计算机组织与结构专题实验报告MIPS单周期处理器的设计学生姓名赵荣建专业班级计算机45班学号2140505119指导教师姜欣宁完成日期2017-05-09一.实验目的根据所学的CPU组成原理,自主设计一个MIPS32位的单周期处理器。二.设计方案参照计算机组成原理教材上的MIPS32位处理器的工作原理。1.构建数据通路取指周期:a.从指令寄存器PC输出端得到地址b.送地址到指令存储器IM地址端Ac.从指令存储器IM的数据端RD得到指令d.计算下地址:通过运算器,PC+4形成下地址,送回到PC。2..MIPS寄存器集:定义了32个32位的寄存器取指令IF指令译码ID指令执行EXE存储器访问MEM结果写回WB3.MIPS三种指令格式:R-类型、I-类型和J-类型R-类型格式:*所有指令操作吗OP都是0;特定操作由funct决定。*机器语言指令中,字段分配格式如上图;前两个寄存器rs、rt是源寄存器,rd是目的寄存器。而在汇编语言格式中,第一个寄存器是目的寄存器。如:add$t0,$s4,$s5#[rd]=[rs]+[rt],[t0]=[s4]+[s5];I-类型格式:*指令含4个字段;op,rs,rt和imm*有两个寄存器操作数和一个16位立即数操作数,一些指令中,rt也可作为源寄存器。J-类型格式:*有一个26位立即数操作数,扩展后形成目的地址。4.算逻单元ALU的设计4signextendInstructionMemoryDataMemory322RegisterFile2ALUcontrol0101AddPCAdd{15~0}{5~0}R1R2W1WdataRdata1Rdata2AddrWdataData010110RegWriteBranchMemWriteMemReadMemToRegALUopALUsrcJumpALUzeroResultControl6233232323232ALU工作原理图*两级控制:通过系统控制器(Control)ALUcontrolALUopALUzeroResult6233232132FuncALUoperBA和运算器控制器(ALUControl)产生ALU的控制信号:ALUoper*ALU控制信号对照表:ALUopFunc(来自R型指令的func字段)操作ALUop1ALUop2F5F4F3F2F1F000××××××010:ADD01××××××110:SUB1×××0000010:ADD1×××0010110:SUB1×××0100000:AND1×××0101001:OR1×××1010111:SLT5.单周期数据通路的构建1)构件:PC、指令存储器、寄存器文件RF和数据存储器;2)取指令的过程:PC→IM:A/RD3)取源操作数的过程:IM:RD→RF:A1/RD1。4)立即数的符号扩展的过程:IM:RD(Instr:15:0)→SignExtend(15:0→Signimm31:0);其中Signimm15:0=Instr15:0,Signimm31:16=Instr155)存储器地址计算:6)向寄存器文件写入数据RegWrite信号被置成1,写入过程在时钟周期最后的时钟上升沿完成。7)形成PC的下地址指令占4个字节,字编址。6.单周期控制器的构建控制单元基于指令中的opcode字段(31:26)、funct字段(5:0)产生控制信号;主译码的真值表。见下图:7.完整的单周期MIPS处理器三.设计过程1.指令集设计R型指令指令序号指令译码结果(B)存储指令(H)0add$s0,$s1,$s200000010001100101000000000100000023280201sub$t0,$t1,$t200000001001010100100000000100010012a40222and$s3,$s4,$s500000010100101011001100000100100029598243or$s0,$s6,$s70000001011010111100000000010010102d780254xor$t3,$t4,$t500000001100011010101100000100110018d58265slt$t7,$t5,$t60000000110101110011110000010101001ae782a6nor$t7,$t5,$t60000000110101110011110000010011101ae782713srl$t0,$s1,$t500000010001011010100000000000010022d400214sll$t0,$s1,$t200000010001010100100000000000000022a400017inc$t0,$t60000000111000000010000000000001101c0400318dec$t0,$t50000000110100000010000000000010001a04004I型指令指令序号指令译码结果(B)存储指令(H)7lw$s0,1($t1)100011010011000000000000000000018d3000018sw$t1,1($t1)10101101001010010000000000000001ad29000110addi$t0,$t1,1001000010010100000000000000000012128000111beq$t1,$t1,10001000100101001000000000000000111290001J型指令指令序号指令译码结果(B)存储指令(H)15J1700001000000000000000000000010001080000112.MIPS32位单周期处理器结构设计CPU设计结构图如下:信号说明:a1:pc中的指令的地址送往IM去寻找指令a2:pc产生的下一条指令的地址a3:pc中指令的地址加4a4:取pc中指令的地址加4后的高六位b1:取J型指令的低26位b2:操作码字段高六位b3:第一个源操作数的寄存器地址,R型的21-25位,I型的21-25位b4:第二个源操作数的寄存器地址,R型的16-20位,I型指令的目的寄存器地址,16-20位b5:R型指令的目的寄存器地址,11-15位b6:I型指令的立即数,0-15位b7:R型指令的低六位,0-5位b8:b4和b5经二路选择器二选一b20:从IM中取出来的指令内容c1:I型指令将16位立即数扩展成32位c2:存入目的寄存器的内容c3:从源寄存器1中取出的内容c4:从源寄存器2中取出的内容c5:c1和c4二选一c6:ALU计算出的结果,也是读DM的地址c7:从DM中取出的内容c8、c9:针对不同类型的指令对进行pc值的修正的选择d1:功能选择信号e类信号:主操作控制信号,主要是各部件的读写控制信号核心模块说明:IM:按序号存放指令(共17条,其中lw指令执行了两次),在CPU启动时从0开始执行。Rf:主寄存器,存放32个32位字,存储情况见下表(十进制表示,单数行是地址序号,双数行是对应的存储值):0123456701413121110988910111213141576543210161718192021222315141312111098242526272829303176543210DM:数据存储器,存储情况见下表(十进制表示,单数行是地址序号,双数行是对应的存储值):01234567876543218910111213141587654321161718192021222387654321242526272829303187654321tRf:测试模块,用于输出指令执行结果以检验是否正确;IRf:测试模块,用于输出当前执行的指令,与tRf搭配使用。四.代码分析1.Add//完成分支指令的目标地址计算//libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityaddisPort(a:inSTD_LOGIC_VECTOR(31downto0);b:inSTD_LOGIC_VECTOR(31downto0);y:outSTD_LOGIC_VECTOR(31downto0));endadd;architectureBehavioralofaddisbeginy=a+b;-------将a和b相加赋给yendBehavioral;2.Add4//完成PC+1(采用字寻址)的计算//libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityAdd4isport(pcin:instd_logic_vector(31downto0);pcout:outstd_logic_vector(31downto0));endAdd4;architecturebehaveofAdd4isbeginprocess(pcin)beginpcout=pcin+1;---------pc值的修改endprocess;endbehave;3.ALU//主运算器//libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityaluisPort(a1,b1:inSTD_LOGIC_vector(31downto0);alucontr:inSTD_LOGIC_VECTOR(3downto0);result:bufferSTD_LOGIC_VECTOR(31downto0);zero:outSTD_LOGIC);endalu;architecturebehaveofaluis--signald1:integer;--signalc1,f1:bit_vector(31downto0);beginprocess(a1,b1,alucontr)begincasealucontriswhen0000=result=a1andb1;------and与操作when0001=result=a1orb1;-----or或操作when0010=result=a1+b1;-----add相加when0011=result=a1xorb1;-----xor异或when0100=result=a1norb1;------nor或非操作when0101=result=TO_STDLOGICVECTOR(to_bitvector(a1)sllconv_integer(b1));------Sll将a1向左移动b1数值位when0110=result=a1-b1;-----sub减法when1001=result=a1+1;------inc自增when1010=result=a1-1;-------dec自减when0111=----slt比较大小if(a1b1)thenresult=x00000001;elseresult=x00000000;endif;when1000=result=TO_STDLOGICVECTOR(to_bitvector(a1)srlconv_integer(b1));------srl算术右移whenothers=
本文标题:西安交通大学组成专题实验报告
链接地址:https://www.777doc.com/doc-1843324 .html