




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精品文档一、 实验目的1. 了解微处理器的基本结构。2. 掌握哈佛结构的计算机工作原理。3. 学会设计简单的微处理器。4. 了解软件控制硬件工作的基本原理。二、 实验任务利用HDL语言,基于Xilinx FPGA nexys4实验平台,设计一个能够执行以下MIPS指令集的单周期类MIPS处理器,要求完成所有支持指令的功能仿真,验证指令执行的正确性,要求编写汇编程序将本人学号的ASCII码存入RAM的连续内存区域。(1)支持基本的算术逻辑运算如add,sub,and,or,slt,andi指令(2)支持基本的内存操作如lw,sw指令(3)支持基本的程序控制如beq,j指令三、 实验过程1、 建立工程在ISE 14.7软件中建立名为Lab1 的工程文件。芯片系列选择Artix7,具体芯片型号选择XC7A100T,封装类型选择CSG324,速度信息选择-1。2、 分模块设计1) 指令存储器ROM设计新建IP core Generator,命名为irom。设定的指令存储器大小为128字,指令存储器模块在顶层模块中被调用。输入为指令指针(PC)与时钟信号(clkin),输出为32位的机器指令,并将输出的机器指令送到后续的寄存器组模块、控制器模块、立即数符号扩展模块进行相应的处理。然后制作COE文件。先使用UltraEdit编辑代码,代码如下main:addi $2,$0,85 sw $2,0($3)addi $2,$0,50 sw $2,4($3)addi $2,$0,48 sw $2,8($3)addi $2,$0,49 sw $2,12($3)addi $2,$0,53 #sw $2,16($3)addi $2,$0,49 #sw $2,20($3)addi $2,$0,51 #sw $2,24($3)addi $2,$0,52 #sw $2,28($3)addi $2,$0,54 #sw $2,32($3)addi $2,$0,52 #sw $2,36($3)j main将其导入QtSpim中,选中机器码,加上前缀并将最后一行0x08100009修改为0x08000000,代码如下MEMORY_INITIALIZATION_RADIX=16;MEMORY_INITIALIZATION_VECTOR=20020055,ac620000,20020032,ac620004,20020030,ac620008,20020031,ac62000c,20020035,ac620010,20020031,ac620014,20020033,ac620018,20020034,ac62001c,20020036,ac620020,20020034,ac620024,08000000,保存为.coe文件,在ROM模块里调用。2) 数据存储器RAM设计新建IP core Generator,命名为dram。数据存储器为RAM类型的存储器,并且需要独立的读写信号控制。因此其对外的接口为clk、we、datain、addr;输出信号为dataout。当时钟上升沿到来时,如果写信号(we)为真,根据addr所表示的地址找到对应的存储单元,并将输入的数据(datain)写到对应的存储单元中;如果写信号为假,则根据addr所表示的地址,将对应存储单元的数据送到输出端(dataout)。在本实验中调用ISE提供的IP核进行设计,设定的数据存储器大小为64字。数据存储器模块在顶层模块中被调用。输入的时钟信号来自于顶层模块的clkin,addr信号来自于ALU单元的输出端(对基地址与偏移量执行加操作),datain来自于寄存器组的第二个数据输出端(Rtdata),而控制信号we则来自于控制器对指令的译码。输出数据dataout通过一个选择器(MUX3)决定是否写入到相应的寄存器。初始化dram值:0x55555555,在以后的仿真过程中可以用于验证是否正确调用3) 立即数符号扩展模块设计对于I型指令,将指令的低十六位作为立即数符号扩展模块的输入inst15:0,如果十六位立即数的最高位(即符号位)为1,则在inst15:15前面补16个1,如果为0,则在前面补16个0。然后将符号扩展之后的data31:0通过一个选择器(即MUX2)输送到ALU单元的第二个源操作数输入端(即input2)。代码如下:module signext( input 15:0 inst, output 31:0 data );assign data=inst15:15?16hffff,inst:16h0000,inst;endmodule4) 寄存器组模块该模块的输入为clk、RegWriteData、RegWriteAddr、RegWriteEn、RsAddr、RtAddr和reset,输出信号为RsData和RtData。由于$0一直输出0,因此当RsAddr、RtAddr为0时,RsData以及RtData必须输出0,否则输出相应地址寄存器数据。另外,当RegWriteEn信号有效时,数据应该写入RegWriteAddr寄存器,并且每次复位时所有寄存器都清零。寄存器组模块在顶层模块中被调用。clk信号来自于顶层模块的clkin,reset信号来自于顶层模块的reset,RegWriteData来自于ALU单元的运算结果输出端或者是数据存储器的输出端(通过一个选择器MUX3进行选择),RegWriteAddr、RsAddr、RtAddr来自于指令的对应位,RegWriteEn来自于控制器对指令的译码。输出信号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)?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;endendendmodule5) 控制器模块控制器输入为指令的opCode字段,即操作码。操作码经过主控制单元的译码,给ALUCtrl、Data Memory、Registers、Muxs等部件输出正确的控制信号。该模块在顶层模块中被调用,输入的opcode来自于指令的前6位,而输出信号aluSrc、MemToReg、RegWrite、MemRead、MemWrite、branch、aluop和jmp则是对6位opcode的译码。代码如下:module ctr( 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)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;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;end/6b001100:/andi6b001000:/andibeginregDst=0;aluSrc=1;memToReg=0;regWrite=1;memRead=0;memWrite=0;branch=0;/aluop=2b11;aluop=2b00;jmp=0;enddefault:beginregDst=0;aluSrc=0;memToReg=0;regWrite=0;memRead=0;memWrite=0;branch=0;aluop=2b00;jmp=0;endendcaseendendmodule6) 运算器(ALU)模块微处理器支持的add、sub、and、or和slt运算指令,需要利用ALU单元实现运算,同时数据存储指令sw和lw也需要通过ALU单元计算存储器地址,条件跳转指令beq需要ALU来比较两个寄存器是否相等。所有这些指令包含的操作为加、减、与、或和小于设置5钟不同的操作。该模块根据输入控制信号对输入数据进行相应的操作,并获得输出结果以及零标识,由于MIPS处理器ALU单元利用4根输入控制信线的译码决定执行何种操作,于是该操作的输入接口为input1、input2和aluCtr,输出端口为zero和aluRes。ALU模块在顶层模块被调用。input1来自于寄存器组模块输出信号Rsdata,input2来自于寄存器组模块输出信号Rtdata或者是立即数符号扩展模块的输出信号(通过一个选择器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(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;endcaseendendmodule7) ALU控制设计MIPS指令中具有6位操作码,如果为R型指令,进一步采用6位功能码来表示R型指令的具体操作。由于设计的微处理器支持的运算类指令全部为R型指令,因此可以通过对R型指令的6位功能码编码产生ALU的4为控制信号。但是lw、sw以及beq、j型指令没有功能码,因此需要区分指令的类型。由于只有三类指令需要ALU单元,因此可以采用两位二进制码对指令的ALU操作类型进行编码。指令的ALU操作类型编码由指令译码器产生。通过2位操作类型码以及6位指令功能码就可以产生ALU单元的4位控制信号。该模块的主要功能就是根据译码控制单元产生的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 ALUCtr );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;endcaseendmodule8) 顶层模块设计本次实验中多路复用器模块MUX以及PC模块综合在顶层模块之中,顶层模块需要将前面的多个模块实例化后,通过导线以及多路复用器将各个部件连接起来,并且在时钟的控制下修改PC的值,PC是一个32位的寄存器,每个时钟沿自动增加4。多路复用器MUX直接通过三目运算符实现,例如assign OUT = SEL ? INPUT1 : INPUT2;其中,OUT、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 zero;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),.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:2),.d(RtData),.clk(!clkin),.we(memwrite),.spo(memreaddata);irom 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(.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=expand2;assign jmpaddr=add431:28,inst25:0,2b00;assign address=pc+expand2;endmodule3、 各模块仿真1) 寄存器组仿真代码如下: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)?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=32hfff
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论