




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、微机原理实验报告学 号 姓 名 华中科技大学专 业 通信1301 指 导 教 师 罗杰 院(系、所) 电信学院 类MIPS单周期微处理器设计一 实验目的1. 了解微处理器的基本结构。2. 掌握哈佛结构的计算机工作原理。3. 学会设计简单的微处理器。4. 了解软件控制硬件工作的基本原理。二 实验任务利用HDL语言,基于Xilinx FPGA nexys4实验平台,设计一个能够执行以下MIPS指令集的单周期类MIPS处理器,要求完成所有支持指令的功能仿真,验证指令执行的正确性,要求编写汇编程序将本人学号的ASCII码存入RAM的连续内存区域。(1)支持基本的算术逻辑运算如add,sub,and,o
2、r,slt,andi指令(2)支持基本的内存操作如lw,sw指令(3)支持基本的程序控制如beq,j指令三 各模块实现原理1. 指令存储器设计指令存储器为ROM类型的存储器,为单一输出指令的存储器。设置一个程序计数器指针PC指向指令存储器,当时钟上升沿到来时,取出PC所指的指令,当时钟的下降沿到来时,修改PC的值,使其指向下一条要执行的指令。因此其对外的接口为clk、存储器地址输入信号(指令指针)以及数据输出信号(指令)。在本实验中调用ISE提供的IP核进行设计,设定的指令存储器大小为128字。指令存储器模块在顶层模块中被调用。输入为指令指针(PC)与时钟信号(clkin),输出为32位的机器
3、指令,并将输出的机器指令送到后续的寄存器组模块、控制器模块、立即数符号扩展模块进行相应的处理。2. 数据存储器设计数据存储器为RAM类型的存储器,并且需要独立的读写信号控制。因此其对外的接口为clk、we、datain、addr;输出信号为dataout。当时钟上升沿到来时,如果写信号(we)为真,根据addr所表示的地址找到对应的存储单元,并将输入的数据(datain)写到对应的存储单元中;如果写信号为假,则根据addr所表示的地址,将对应存储单元的数据送到输出端(dataout)。在本实验中调用ISE提供的IP核进行设计,设定的数据存储器大小为64字。数据存储器模块在顶层模块中被调用。输入
4、的时钟信号来自于顶层模块的clkin,addr信号来自于ALU单元的输出端(对基地址与偏移量执行加操作),datain来自于寄存器组的第二个数据输出端(Rtdata),而控制信号we则来自于控制器对指令的译码。输出数据dataout通过一个选择器(MUX3)决定是否写入到相应的寄存器。3. 寄存器组设计寄存器组是指令操作的主要对象,MIPS中一共有32个32位寄存器。在指令的操作过程中需要区分Rs、Rt、Rd的地址和数据,并且Rd的数据只有在寄存器写信号有效时才能够写入,因此该模块的输入为clk、RegWriteData、RegWriteAddr、RegWriteEn、RsAddr、RtAdd
5、r和reset,输出信号为RsData和RtData。由于$0一直输出0,因此当RsAddr、RtAddr为0时,RsData以及RtData必须输出0,否则输出相应地址寄存器数据。另外,当RegWriteEn信号有效时,数据应该写入RegWriteAddr寄存器,并且每次复位时所有寄存器都清零。寄存器组模块在顶层模块中被调用。clk信号来自于顶层模块的clkin,reset信号来自于顶层模块的reset,RegWriteData来自于ALU单元的运算结果输出端或者是数据存储器的输出端(通过一个选择器MUX3进行选择),RegWriteAddr、RsAddr、RtAddr来自于指令的对应位,R
6、egWriteEn来自于控制器对指令的译码。输出信号Rsdata与Rtdata则分别来自于Rsaddr与Rtaddr对应的寄存器。代码如下:module regFile( input clk, input reset, input 31:0 regWriteData, input 4:0 regWriteAddr, input regWriteEn, output 31:0 RsData, output 31:0 RtData, input 4:0 RsAddr, input 4:0 RtAddr );reg31:0 regs0:31;assign RsData = (RsAddr = 5b0
7、)?32b0:regsRsAddr;assign RtData = (RtAddr = 5b0)?32b0:regsRtAddr;integer i;always (posedge clk)beginif(!reset)beginif(regWriteEn=1)beginregsregWriteAddr=regWriteData;endendelsebeginfor(i=0;i31;i=i+1)regsi=0;regs31=32hffffffff;endendendmodule4. ALU设计在这个简单的MIPS指令集中,微处理器支持的add、sub、and、or和slt运算指令,需要利用AL
8、U单元实现运算,同时数据存储指令sw和lw也需要通过ALU单元计算存储器地址,条件跳转指令beq需要ALU来比较两个寄存器是否相等。所有这些指令包含的操作为加、减、与、或和小于设置5钟不同的操作。该模块根据输入控制信号对输入数据进行相应的操作,并获得输出结果以及零标识,由于MIPS处理器ALU单元利用4根输入控制信线的译码决定执行何种操作,于是该操作的输入接口为input1、input2和aluCtr,输出端口为zero和aluRes。ALU模块在顶层模块被调用。input1来自于寄存器组模块输出信号Rsdata,input2来自于寄存器组模块输出信号Rtdata或者是立即数符号扩展模块的输出
9、信号(通过一个选择器MUX2进行选择),aluCtr来自于aluctr模块的输出端。aluRes与zero为ALU单元的运算结果,其中zero主要用于beq指令。代码如下:module ALU( input 31:0 input1, input 31:0 input2, input 3:0 aluCtr, output 31:0 aluRes, output zero );reg zero;reg31:0 aluRes;always (input1 or input2 or aluCtr)begincase(aluCtr)4b0110:beginaluRes=input1-input2;if(
10、aluRes=0)zero=1;elsezero=0;end4b0010:aluRes=input1+input2;4b0000:aluRes=input1&input2;4b0001:aluRes=input1|input2;4b1100:aluRes=(input1|input2);4b0111:beginif(input1input2)aluRes = 1;enddefault:aluRes = 0;endcaseendendmodule5. ALU控制设计ALU单元对应的5种操作的编码。MIPS指令中具有6位操作码,如果为R型指令,进一步采用6位功能码来表示R型指令的具体操作。由于设计
11、的微处理器支持的运算类指令全部为R型指令,因此可以通过对R型指令的6位功能码编码产生ALU的4为控制信号。但是lw、sw以及beq、j型指令没有功能码,因此需要区分指令的类型。由于只有三类指令需要ALU单元,因此可以采用两位二进制码对指令的ALU操作类型进行编码。指令的ALU操作类型编码由指令译码器产生。通过2位操作类型码以及6位指令功能码就可以产生ALU单元的4位控制信号。指令2位操作码指令功能6位功能码ALU的运算ALU的控制信号LW00取字XXXXXX加0010SW00存字XXXXXX加0010BEQ01相等跳转XXXXXX减0110R型指令10加100000加0010R型指令10减10
12、0010减0110R型指令10与100100与0000R型指令10或100101或0001R型指令10小于设置101010小于设置0111ADDI11加立即数XXXXXX加0010因此该模块的主要功能就是根据译码控制单元产生的2位操作码以及6位功能码产生4位ALU控制信号,因此输入信号为aluop(2位)、funct(6位),输出信号为aluctr(4位)。ALU控制模块在顶层模块被调用。aluop来自于控制器对指令的6位opcode的译码,而funct来自于指令的后6位。module aluctr( input 1:0 ALUOp, input 5:0 funct, output 3:0 A
13、LUCtr );reg3:0 ALUCtr;always (ALUOp or funct)casex(ALUOp,funct)8b00xxxxxx:ALUCtr=4b0010;8b01xxxxxx:ALUCtr=4b0110;8b11xxxxxx:ALUCtr=4b0000;8b10xx0000:ALUCtr=4b0010;8b10xx0010:ALUCtr=4b0110;8b10xx0100:ALUCtr=4b0000;8b10xx0101:ALUCtr=4b0001;8b10xx1010:ALUCtr=4b0111;endcaseendmodule6. 控制器设计控制器输入为指令的opCo
14、de字段,即操作码。操作码经过主控制单元的译码,给ALUCtrl、Data Memory、Registers、Muxs等部件输出正确的控制信号。指令opcodeR型:add,sub,and,or,slt000000I型:lw100011I型:sw101011I型:beq000100J型:J000010I型:addi001000该模块在顶层模块中被调用,输入的opcode来自于指令的前6位,而输出信号aluSrc、MemToReg、RegWrite、MemRead、MemWrite、branch、aluop和jmp则是对6位opcode的译码。译码结果在此不做说明。代码如下:module ctr
15、( input 5:0 opCode, output regDst, output aluSrc, output memToReg, output regWrite, output memRead, output memWrite, output branch, output 1:0 aluop, output jmp );reg regDst;reg aluSrc;reg memToReg;reg regWrite;reg memRead;reg memWrite;reg branch;reg1:0 aluop;reg jmp;always (opCode)begincase(opCode)
16、6b000010:/jmpbeginregDst=0;aluSrc=0;memToReg=0;regWrite=0;memRead=0;memWrite=0;branch=0;aluop=2b00;jmp=1;end6b000000:/RbeginregDst=1;aluSrc=0;memToReg=0;regWrite=1;memRead=0;memWrite=0;branch=0;aluop=2b10;jmp=0;end6b100011:/lwbeginregDst=0;aluSrc=1;memToReg=1;regWrite=1;memRead=1;memWrite=0;branch=0
17、;aluop=2b00;jmp=0;end6b101011:/swbeginregDst=0;aluSrc=1;memToReg=0;regWrite=0;memRead=0;memWrite=1;branch=0;aluop=2b00;jmp=0;end6b000100:/beqbeginregDst=0;aluSrc=0;memToReg=0;regWrite=0;memRead=0;memWrite=0;branch=1;aluop=2b01;jmp=0;end6b001100:/andibeginregDst=0;aluSrc=1;memToReg=0;regWrite=1;memRe
18、ad=0;memWrite=0;branch=0;aluop=2b11;jmp=0;enddefault:beginregDst=0;aluSrc=0;memToReg=0;regWrite=0;memRead=0;memWrite=0;branch=0;aluop=2b00;jmp=0;endendcaseendendmodule7. 立即数符号扩展模块设计对于I型指令,将指令的低十六位作为立即数符号扩展模块的输入inst15:0,如果十六位立即数的最高位(即符号位)为1,则在inst15:15前面补16个1,如果为0,则在前面补16个0。然后将符号扩展之后的data31:0通过一个选择器(
19、即MUX2)输送到ALU单元的第二个源操作数输入端(即input2)。代码如下:module signext( input 15:0 inst, output 31:0 data );assign data=inst15:15?16hffff,inst:16h0000,inst;endmodule8. 顶层设计顶层模块需要将前面的多个模块实例化后,通过导线以及多路复用器将各个部件连接起来,并且在时钟的控制下修改PC的值,PC是一个32位的寄存器,每个时钟沿自动增加4。多路复用器MUX直接通过三目运算符实现,例如assign OUT = SEL ? INPUT1 : INPUT2;其中,OUT、
20、SEL、INPUT1和INPUT2都是预先定义的信号。代码如下:module top( input clkin, input reset );reg31:0 pc,add4;wire choose4;wire31:0 expand2,mux2,mux3,mux4,mux5,address,jmpaddr,inst;wire4:0 mux1;/wire for controllerwire reg_dst,jmp,branch,memread,memwrite,memtoreg;wire1:0 aluop;wire alu_src,regwrite;/wire for aluunitwire z
21、ero;wire31:0 aluRes;/wire for aluctrwire3:0 aluCtr;/wire for memorywire31:0 memreaddata;/wire for registerwire31:0 RsData,RtData;/wireforextwire31:0 expand;always (negedge clkin)beginif(!reset) beginpc=mux5;add4=pc+4;endelse beginpc=32b0;add4=32h4;endendctr mainctr(.opCode(inst31:26),.regDst(reg_dst
22、),.aluSrc(alu_scr),.memToReg(memtoreg),.regWrite(regwrite),.memRead(memread),.memWrite(memwrite),.branch(branch),.aluop(aluop),.jmp(jmp);ALU alu(.input1(RsData),.input2(mux2),.aluCtr(aluCtr),.zero(zero),.aluRes(aluRes);aluctr aluctr1(.ALUOp(aluop),.funct(inst5:0),.ALUCtr(aluCtr);dram dmem(.a(aluRes7
23、:2),.d(RtData),.clk(!clkin),.we(memwrite),.spo(memreaddata);irom_number imem(.a(pc8:2),.clk(clkin),.spo(inst);regFile regfile(.RsAddr(inst25:21),.RtAddr(inst20:16),.clk(!clkin),.reset(reset),.regWriteAddr(mux1),.regWriteData(mux3),.regWriteEn(regwrite),.RsData(RsData),.RtData(RtData);signext signext
24、(.inst(inst15:0),.data(expand);assign mux1=reg_dst?inst15:11:inst20:16;assign mux2=alu_scr?expand:RtData;assign mux3=memtoreg?memreaddata:aluRes;assign mux4=choose4?address:add4;assign mux5=jmp?jmpaddr:mux4;assign choose4=branch&zero;assign expand2=expand= 1; i=i-1) beginregWriteAddr = i;RsAddr=i;#P
25、ERIOD;endendEndmodule结果如下:Reset高电平下输出为0,Reset无效后,正常输入和输出数据,Reset正常工作。第一次for循环的地址范围输出数据在低电平时输出0,高电平输出0x55aaaa55,如图所示,说明数据是在时钟上升沿写入,之后输出的数据与写入的数据相同,数据都保存在了寄存器组中,工作正常。2. 控制器仿真:代码如下:如下:module ctrsim;/ Inputsreg 5:0 opCode;/ Outputswire regDst;wire aluSrc;wire memToReg;wire regWrite;wire memRead;wire mem
26、Write;wire branch;wire 1:0 aluop;wire jmp;/ Instantiate the Unit Under Test (UUT)ctr uut (.opCode(opCode), .regDst(regDst), .aluSrc(aluSrc), .memToReg(memToReg), .regWrite(regWrite), .memRead(memRead), .memWrite(memWrite), .branch(branch), .aluop(aluop), .jmp(jmp);initial begin/ Initialize InputsopCode = 0;/ Wait 100
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商业使用权合同协议
- 商场销售用工合同协议
- 模具合同三方附加协议
- 总价加激励合同协议
- 2025至2030年中国颈腰椎病治疗仪数据监测研究报告
- 2025至2030年中国自动界砖机数据监测研究报告
- 2025至2030年中国罗汉果蜜炼川贝枇杷膏数据监测研究报告
- 2025至2030年中国精密多刀自动仪表车床数据监测研究报告
- 因数中间或末尾有零的乘法能力作业试题带答案
- 四年级班主任疫情期间的情绪管理计划
- 《寻找消失的分数》期中考试分析班会课件
- 2024年注册安全工程师考试题库及参考答案【完整版】
- GB/T 38942-2020压力管道规范公用管道
- 家居建材全屋定制店面运营管理细则规定
- GB/T 27924-2011工业货架规格尺寸与额定荷载
- 大班语言《他们看见了一只猫》课件
- 毕业论文-电力变压器设计
- 消毒产品进货检查验收制度
- 单叉固定式液压升降台设计
- 《美国消费品安全改进法》的普通合格证书、纺织品服装类产
- GB∕T 40740-2021 堆焊工艺评定试验
评论
0/150
提交评论