版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上类MIPS单周期微处理器设计实验报告专业:班级: 学号: 姓名: 一、 微处理器各模块设计各模块的框图结构如上图所示。由图可知,该处理器包含指令存储器、数据存储器、寄存器组、ALU单元、符号数扩张、控制器、ALU控制译码以及多路复用器等。图中还忽略了一个单元:时钟信号产生器,而且以上各个部件必须在时钟信号的控制下协调工作。1. 指令存储器的设计指令寄存器为ROM类型的存储器,为单一输出指令的存储器。因此其对外的接口为clk、存储器地址输入信号(指令指针)以及数据输出信号(指令)。(1)在IP wizard 中配置ROM,分配128个字的存储空间,字长为32位宽。(2)
2、选择输入具有地址寄存功能,只有当时钟上升沿有效时,才进行数据的输出。(3)配置ROM内存空间的初始化COE文件。最后单击Generate按钮生成IROM模块。2. 数据存储器的设计数据存储器为RAM类型的存储器,并且需要独立的读写控制信号。因此其对外的接口输入信号为clk、we、datain、addr;输出信号为dataout。数据存储器基本建立过程同ROM的建立。3. 寄存器组设计寄存器组是指令操作的主要对象,MIPS中一共有32个32位寄存器。在指令的操作过程中需要区分Rs、Rt、Rd的地址和数据,并且Rd的数据只有在寄存器写信号有效时才能写入,因此该模块的输入为clk、RegWriteA
3、ddr、RegWriteData、RegWriteEn、RsAddr、RtAddr、reset;输出信号为RsData、RtData。由于$0一直输出0,因此当RsAddr、RtAddr为0时,RsData以及RtData必须输出0,否则输出相应地址寄存器的值。另外,当RegWriteEn有效时,数据应该写入RegWriteAddr寄存器。并且每次复位时所有寄存器都清零。代码如下:module regFile( input clk, input reset, input 31:0 regWriteData, input 4:0 regWriteAddr, input regWriteEn, o
4、utput 31:0 RsData, output 31:0 RtData, input 4:0 RsAddr, input 4:0 RtAddr );reg31:0 regs0:31;assign RsData = (RsAddr = 5'b0)?32'b0:regsRsAddr;assign RtData = (RtAddr = 5'b0)?32'b0:regsRtAddr;integer i;always (posedge clk)beginif(!reset)beginif(regWriteEn=1)beginregsregWriteAddr=regWr
5、iteData;endendelsebeginfor(i=0;i<31;i=i+1)regsi=0;regs31=32'hffffffff;endendendmodule4. ALU设计在这个简单的MIPS指令集中,微处理器支持add、sub、and、or、slt运算指令,需要利用ALU单元实现运算,同时数据存储指令sw、lw也需要ALU单元计算存储器地址,条件跳转指令beq需要ALU来比较两个寄存器是否相等。所有这些指令包含的操作为加、减、与、或小于设置5种不同的操作。该模块根据输入控制信号对输入数据进行相应的操作,并获得输出结果以及零标示,由于MIPS处理器ALU单元利用4根
6、输入控制线的译码决定执行何种操作,因此该模块的接口为:输入:input1(32bit),input2(32bit),aluCtr(4bit)输出:zero(1bit),alluRes(32bit)代码如下: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)4'b0110:beginal
7、uRes=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(input1<input2)aluRes = 1;enddefault:aluRes = 0;endcaseendendmodule5. ALU控制设计ALU单元对应以上5种
8、操作的编码如表所示:输入信号操作类型0000与0001或0010加0110减0111小于设置通过2位操作类型码以及6位指令功能码就可以产生ALU单元的4位控制信号。它们之间的对应关系如表所示:因此该模块的主要功能就是根据译码控制单元产生2位操作码以及6位功能码产生4位ALU控制信号,接口为:输入:aluop(2bit),funt(6bit)输出:aluctr(4bit)代码为:module aluctr( input 1:0 ALUOp, input 5:0 funct, output 3:0 ALUCtr );reg3:0 ALUCtr;always (ALUOp or funct)case
9、x(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;endcas
10、eendmodule6. 控制器设计控制器输入为指令的opCode字段,即操作码。操作码经过主控制单元的译码,给ALUCtr、Data、Memory、Registers、Muxs等部件输出正的控制信号。微处理器在执行不同指令时,控制信号相对应的状态表如下:因此该模块的接口为:输入:opcode(6bit)输出:alusrc,memtoreg,regwrite,memread,memwrite,branch,aluop1:0,jmp代码为:module ctr( input 5:0 opCode, output regDst, output aluSrc, output memToReg, ou
11、tput 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)6'b:/jmpbeginregDst=0;aluSrc=0;memToReg=0;regWrite=0;memRead=0;me
12、mWrite=0;branch=0;aluop=2'b00;jmp=1;end6'b:/RbeginregDst=1;aluSrc=0;memToReg=0;regWrite=1;memRead=0;memWrite=0;branch=0;aluop=2'b10;jmp=0;end6'b:/lwbeginregDst=0;aluSrc=1;memToReg=1;regWrite=1;memRead=1;memWrite=0;branch=0;aluop=2'b00;jmp=0;end6'b:/swbeginregDst=0;aluSrc=1;me
13、mToReg=0;regWrite=0;memRead=0;memWrite=1;branch=0;aluop=2'b00;jmp=0;end6'b:/beqbeginregDst=0;aluSrc=0;memToReg=0;regWrite=0;memRead=0;memWrite=0;branch=1;aluop=2'b01;jmp=0;end6'b:/andibeginregDst=0;aluSrc=1;memToReg=0;regWrite=1;memRead=0;memWrite=0;branch=0;aluop=2'b11;jmp=0;end
14、default:beginregDst=0;aluSrc=0;memToReg=0;regWrite=0;memRead=0;memWrite=0;branch=0;aluop=2'b00;jmp=0;endendcaseendendmodule7. 符号数扩展将16位有符号扩展为32位有符号数。带符号扩展只需要在前面补足符号即可。代码为:module signext( input 15:0 inst, output 31:0 data );assign data=inst15:15?16'hffff,inst:16'h0000,inst;endmodule8. 顶层模
15、块顶层模块需要将前面多个模块实例化,通过导线以及多路复用器将各个部件连接起来,并且在时钟的控制下修改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
16、: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
17、(negedge clkin)beginif(!reset) beginpc=mux5;add4=pc+4;endelse beginpc=32'b0;add4=32'h4;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(
18、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_number imem(.a(pc8:2),.clk(clkin),.spo(inst);regFile regfile(.RsAddr(inst25:21),.RtAddr(
19、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 m
20、ux4=choose4?address:add4;assign mux5=jmp?jmpaddr:mux4;assign choose4=branch&zero;assign expand2=expand<<2;assign jmpaddr=add431:28,inst25:0,2'b00;assign address=pc+expand2;endmodule二、 Rom汇编程序设计下面以将本人学号U的ASCII码存入RAM的连续内存区域编写为汇编程序为例:编辑MIPS汇编源代码:采用ultraedit编辑汇编源程序代码,并保存为number.asm文件。代码如下:
21、main:andi $2,$31,85 #Usw $2,0($3)andi $2,$31,50 #2sw $2,4($3)andi $2,$31,48 #0sw $2,8($3)andi $2,$31,49 #1sw $2,12($3)andi $2,$31,53 #5sw $2,16($3)andi $2,$31,49 #1sw $2,20($3)andi $2,$31,51 #3sw $2,24($3)andi $2,$31,51 #3sw $2,28($3)andi $2,$31,52 #4sw $2,32($3)andi $2,$31,51 #3sw $2,36($3)j main获取
22、机器代码,并保存为coe文件:利用QtSpim装载number.asm,并测试功能是否正常。装载之后的用户代码段在QtSpim中的结构如附图所示:提取的用户代码对应的机器码,并把j main指令对应的机器码0x修改为0x。将上述机器指令保存在ultraedit中新的文件中,添加coe文件头描述语句,完成后的完整coe文件内容如下:MEMORY_INITIALIZATION_RADIX=16;MEMORY_INITIALIZATION_VECTOR=33e20055,ac,33e20032,ac,33e20030,ac,33e20031,ac62000c,33e20035,ac,33e20031
23、,ac,33e20033,ac,33e20033,ac62001c,33e20034,ac,33e20033,ac,将该文件保存为coe文件,即number.coe。至此,coe文件制作完成。最后,把coe文件导入irom中,如下图所示:三、 模块仿真1. 寄存器组仿真:建立仿真代码,在自动生成的激励代码基础上加入功能仿真需要的代码:reset测试、写入测试、输出测试等、完整代码如下:module regsim;/ Inputsreg clk;reg reset;reg 31:0 regWriteData;reg 4:0 regWriteAddr;reg regWriteEn;reg 4:0
24、RsAddr;reg 4:0 RtAddr;/ Outputswire 31:0 RsData;wire 31:0 RtData;/ Instantiate the Unit Under Test (UUT)regFile uut (.clk(clk), .reset(reset), .regWriteData(regWriteData), .regWriteAddr(regWriteAddr), .regWriteEn(regWriteEn), .RsData(RsData), .RtData(RtData), .RsAddr(RsAddr), .RtAddr(RtAddr);integer
25、 i;initial begin/ Initialize Inputsclk = 0;reset = 0;regWriteData = 0;regWriteAddr = 0;regWriteEn = 0;RsAddr = 0;RtAddr = 0;/ Wait 100 ns for global reset to finish#100; / Add stimulus hereregWriteData=32'h55aaaa55;regWriteEn=1;reset=1;#100;reset=0;end parameter PERIOD = 20;always beginclk = 1
26、39;b0;#(PERIOD/2) clk = 1'b1;#(PERIOD/2);endalways beginfor(i = 31; i>= 1; i=i-1) beginregWriteAddr = i;RsAddr=i;#PERIOD;endendendmodule仿真结果如下:下图可以观察到Reset为高电平状态。Reset高电平状态下输出数据为0,表示Reset有效地工作了。Reset信号无效后,正常输入和输出数据。第一次for循环的地址范围输出数据在时钟低电平时输出0,高电平输出0x55aaaa55,如下图所示,表明数据正确地在时钟上升沿写入的。之后一直输出的数据与写
27、入的数据相同,表明数据都正确地保存在寄存器组中。2. 控制器仿真:控制器仿真需要包含所有case的输入,仿真激励文件修改代码后,如下:module ctrsim;/ Inputsreg 5:0 opCode;/ Outputswire regDst;wire aluSrc;wire memToReg;wire regWrite;wire memRead;wire memWrite;wire branch;wire 1:0 aluop;wire jmp;/ Instantiate the Unit Under Test (UUT)ctr uut (.opCode(opCode), .regDst
28、(regDst), .aluSrc(aluSrc), .memToReg(memToReg), .regWrite(regWrite), .memRead(memRead), .memWrite(memWrite), .branch(branch), .aluop(aluop), .jmp(jmp);initial begin/ Initialize InputsopCode = 0;/ Wait 100 ns for global reset to finish#100; opCode=6'b;/jump#100; opCode=6'b;/R#100; opCode=6
29、9;b;/lw#100; opCode=6'b;/sw#100; opCode=6'b;endendmodule所有case下的仿真波形如图所示,将该波形图与之前的表格对吧发现功能正确。3. 顶层仿真:激励代码如下:module topsim;/ Inputsreg clkin;reg reset;/ Instantiate the Unit Under Test (UUT)top uut (.clkin(clkin), .reset(reset);initial begin/ Initialize Inputsclkin = 0;reset = 0;/ Add stimulus here#100; reset = 1; #100; reset = 0; end parameter PER
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 封装测试材料解决方案考核试卷
- 2024年度贷款担保人免责责任书及条款2篇
- 水质评价课程设计
- 《XXL公司员工职业倦怠问题研究》
- 水箱液位课程设计
- 2024年度商业地产租赁与管理合同5篇
- 热风干燥机课程设计
- 早教彩虹伞主题课程设计
- 毕业课程设计小组
- 2024年度西陵区编外人员劳动关系调整与维护合同3篇
- 2023译林版新教材高中英语必修二全册重点短语归纳小结
- 部编人教版语文六年级下册《9 浣溪沙》课件
- 扁平化春暖花开教育环保春天主题模板课件
- 吊车安全技术交底
- 《让学生看见你爱》心得体会
- Windows-Server-2012网络服务架构课件(完整版)
- GB∕T 9286-2021 色漆和清漆 划格试验
- 环境监测所需各类原始记录填写格式模板参考模板范本
- 01土地复垦适宜性评价案例
- 天津城建桩基础课程设计
- 备件的ABC分类管理规定法
评论
0/150
提交评论