您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文档 > 华中科技大学HUST类MIPS单周期微处理器设计实验报告
类MIPS单周期微处理器设计实验报告专业:班级:学号:姓名:一、微处理器各模块设计addadd指令存储器地址总线指令PC4寄存器组读寄存器1地址读寄存器2地址写寄存器地址写数据寄存器1数据寄存器2数据符号扩展MUXALUMUX数据存储器数据总线数据总线地址总线左移两位+PC的高4位28位26位32位MUXMUXzero16位32位左移两位MUX指令[25:0]指令[5:0]指令[15:0]指令[15:11]指令[20:16]指令[25:21]ALU控制译码JumpBranchALUSrcMemToRegRegDstRegWriteMemWriteMemReadALUOp[1:0]01011001控制器指令[31:26]各模块的框图结构如上图所示。由图可知,该处理器包含指令存储器、数据存储器、寄存器组、ALU单元、符号数扩张、控制器、ALU控制译码以及多路复用器等。图中还忽略了一个单元:时钟信号产生器,而且以上各个部件必须在时钟信号的控制下协调工作。1.指令存储器的设计指令寄存器为ROM类型的存储器,为单一输出指令的存储器。因此其对外的接口为clk、存储器地址输入信号(指令指针)以及数据输出信号(指令)。(1)在IPwizard中配置ROM,分配128个字的存储空间,字长为32位宽。(2)选择输入具有地址寄存功能,只有当时钟上升沿有效时,才进行数据的输出。(3)配置ROM内存空间的初始化COE文件。最后单击Generate按钮生成IROM模块。2.数据存储器的设计数据存储器为RAM类型的存储器,并且需要独立的读写控制信号。因此其对外的接口输入信号为clk、we、datain、addr;输出信号为dataout。数据存储器基本建立过程同ROM的建立。3.寄存器组设计寄存器组是指令操作的主要对象,MIPS中一共有32个32位寄存器。在指令的操作过程中需要区分Rs、Rt、Rd的地址和数据,并且Rd的数据只有在寄存器写信号有效时才能写入,因此该模块的输入为clk、RegWriteAddr、RegWriteData、RegWriteEn、RsAddr、RtAddr、reset;输出信号为RsData、RtData。由于$0一直输出0,因此当RsAddr、RtAddr为0时,RsData以及RtData必须输出0,否则输出相应地址寄存器的值。另外,当RegWriteEn有效时,数据应该写入RegWriteAddr寄存器。并且每次复位时所有寄存器都清零。代码如下:moduleregFile(inputclk,inputreset,input[31:0]regWriteData,input[4:0]regWriteAddr,inputregWriteEn,output[31:0]RsData,output[31:0]RtData,input[4:0]RsAddr,input[4:0]RtAddr);reg[31:0]regs[0:31];assignRsData=(RsAddr==5'b0)?32'b0:regs[RsAddr];assignRtData=(RtAddr==5'b0)?32'b0:regs[RtAddr];integeri;always@(posedgeclk)beginif(!reset)beginif(regWriteEn==1)beginregs[regWriteAddr]=regWriteData;endendelsebeginfor(i=0;i31;i=i+1)regs[i]=0;regs[31]=32'hffffffff;endendendmodule4.ALU设计在这个简单的MIPS指令集中,微处理器支持add、sub、and、or、slt运算指令,需要利用ALU单元实现运算,同时数据存储指令sw、lw也需要ALU单元计算存储器地址,条件跳转指令beq需要ALU来比较两个寄存器是否相等。所有这些指令包含的操作为加、减、与、或小于设置5种不同的操作。该模块根据输入控制信号对输入数据进行相应的操作,并获得输出结果以及零标示,由于MIPS处理器ALU单元利用4根输入控制线的译码决定执行何种操作,因此该模块的接口为:输入:input1(32bit),input2(32bit),aluCtr(4bit)输出:zero(1bit),alluRes(32bit)代码如下:moduleALU(input[31:0]input1,input[31:0]input2,input[3:0]aluCtr,output[31:0]aluRes,outputzero);regzero;reg[31:0]aluRes;always@(input1orinput2oraluCtr)begincase(aluCtr)4'b0110:beginaluRes=input1-input2;if(aluRes==0)zero=1;elsezero=0;end4'b0010:aluRes=input1+input2;4'b0000:aluRes=input1&input2;4'b0001:aluRes=input1|input2;4'b1100:aluRes=~(input1|input2);4'b0111:beginif(input1input2)aluRes=1;enddefault:aluRes=0;endcaseendendmodule5.ALU控制设计ALU单元对应以上5种操作的编码如表所示:输入信号操作类型0000与0001或0010加0110减0111小于设置通过2位操作类型码以及6位指令功能码就可以产生ALU单元的4位控制信号。它们之间的对应关系如表所示:因此该模块的主要功能就是根据译码控制单元产生2位操作码以及6位功能码产生4位ALU控制信号,接口为:输入:aluop(2bit),funt(6bit)输出:aluctr(4bit)代码为:modulealuctr(input[1:0]ALUOp,input[5:0]funct,output[3:0]ALUCtr);reg[3:0]ALUCtr;always@(ALUOporfunct)casex({ALUOp,funct})8'b00xxxxxx:ALUCtr=4'b0010;8'b01xxxxxx:ALUCtr=4'b0110;8'b11xxxxxx:ALUCtr=4'b0000;8'b10xx0000:ALUCtr=4'b0010;8'b10xx0010:ALUCtr=4'b0110;8'b10xx0100:ALUCtr=4'b0000;8'b10xx0101:ALUCtr=4'b0001;8'b10xx1010:ALUCtr=4'b0111;endcaseendmodule6.控制器设计控制器输入为指令的opCode字段,即操作码。操作码经过主控制单元的译码,给ALUCtr、Data、Memory、Registers、Muxs等部件输出正的控制信号。微处理器在执行不同指令时,控制信号相对应的状态表如下:因此该模块的接口为:输入:opcode(6bit)输出:alusrc,memtoreg,regwrite,memread,memwrite,branch,,aluop[1:0],jmp代码为:modulectr(input[5:0]opCode,outputregDst,outputaluSrc,outputmemToReg,outputregWrite,outputmemRead,outputmemWrite,outputbranch,output[1:0]aluop,outputjmp);regregDst;regaluSrc;regmemToReg;regregWrite;regmemRead;regmemWrite;regbranch;reg[1:0]aluop;regjmp;always@(opCode)begincase(opCode)6'b000010://jmpbeginregDst=0;aluSrc=0;memToReg=0;regWrite=0;memRead=0;memWrite=0;branch=0;aluop=2'b00;jmp=1;end6'b000000://RbeginregDst=1;aluSrc=0;memToReg=0;regWrite=1;memRead=0;memWrite=0;branch=0;aluop=2'b10;jmp=0;end6'b100011://lwbeginregDst=0;aluSrc=1;memToReg=1;regWrite=1;memRead=1;memWrite=0;branch=0;aluop=2'b00;jmp=0;end6'b101011://swbeginregDst=0;aluSrc=1;memToReg=0;regWrite=0;memRead=0;memWrite=1;branch=0;aluop=2'b00;jmp=0;end6'b000100://beqbeginregDst=0;aluSrc=0;memToReg=0;regWrite=0;memRead=0;memWrite=0;branch=1;aluop=2'b01;jmp=0;end6'b001100://andibeginregDst=0;aluSrc=1;memToReg=0;regWrite=1;memRead=0;memWrite=0;branch=0;aluop=2'b11;jmp=0;enddefault:beginregDst=0;aluSrc=0;memToReg=0;regWrite=0;memRead=0;memWrite=0;branch=0;aluop=2'b00;jmp=0;endendcaseendendmodule7.符号数扩展将16位有符号扩展为32位有符号数。带符号扩展只需要在前面补足符号即可。代码为:modulesignext(input[15:0]inst,output[31:0]data);assigndata=inst[15:15]?{16'hffff,inst}:{16'h0000,inst};endmodule8.顶层模块顶层模块需要将前面多个模块实例化,通过导线以及多路复用器将各个部件连接起来,并且在时钟的控制下修改PC的值,PC是一个32位的寄存器,每个时钟沿自动增加4。多路复用器MUX直接通过三目运算符实现:AssignOUT=SEL?INPUT1:INPUT2;其中,OUT、SEL、INPUT1、INPUT2都是预先定义的信号。代码如下:moduletop(inputclkin,inputreset);reg[31:0]pc,add4;wirechoose4;wire[31:0]expand2,mux2,mux3,mux4,mux5,address,jmpaddr,inst;wire[4:0]mux1;//wireforcontrollerwirereg_dst,jmp,branch,memread,memwrite,memtoreg;wire[1:0]aluop;wirealu_src,regwrite;//wireforaluunitwirezero;wire[31:0]aluRes;//wireforaluctrwire[3:0]aluCtr;//wireformemorywire[31:0]memreaddata;//wireforregisterwire[31:0]RsData,RtData;//wireforextwire[31:0]expand;always@(negedgeclkin)beginif(!reset)beginpc=mux5;add4=pc+4;endelsebeginpc=32'b0;add4=32'h4;endendctrmainctr(.opCode(inst[31:26]),.regDst(reg_dst),.aluSrc(alu
本文标题:华中科技大学HUST类MIPS单周期微处理器设计实验报告
链接地址:https://www.777doc.com/doc-6078706 .html