




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
面向对象程序设计课程设计 CPU设计与仿真课程设计报告学 号: 2012 班级序号: 姓 名: 指导教师: 成 绩: dida信息工程学院2012年 6 月实习题目一【需求规格说明】一、题目:以下文件:sim.cpp,computer.h,computer.cpp,proj1.cppandproj1.h组成了MIPS仿真器的一个框架.通过在文件proj1.cpp中增加代码来完成整个程序。你的仿真器必须能仿真以下MIPS机器指令: addu Rdest, Rsrc1, Rsrc2 addiu Rdest, Rsrc1, imm subu Rdest, Rsrc1, Rsrc2 sll Rdest, Rsrc, shamt srl Rdest, Rsrc, shamt and Rdest, Rsrc1, Rsrc2 andi Rdest, Rsrc, imm or Rdest, Rsrc1, Rsrc2 ori Rdest, Rsrc, imm lui Rdest, imm slt Rdest, Rsrc1, Rsrc2 beq Rsrc1, Rsrc2, raddr bne Rsrc1, Rsrc2, raddr j address jal address jr Rsrc lw Rdest, offset (Radd)二、问题描述:题目已经给出程序代码的基本框架,我们只需要在proj1.cpp中实现反汇编函数和指令仿真函数,在两个函数中完成以上指令。我们需要参考opcode和func的值对应表,通过分情况讨论,区分并实现指令。三、问题分析:我们要真正理解并解决问题,我们必须大概看懂现成的代码框架,参考opcode与func和指令的对应表,根据对应数值使用if,else语句和switch分支实现区分实现指令。【算法设计】(1)设计思想:1、分割指令:使用移位运算的方法实现分割指令,如:opcode=instr26;rs=(instr27;2、提取符号位:也是使用移位运算取立即数的最高位,若s=1,则执行“immediate - = 65536;”216 = 65536。当最高位为1时,即立即数为负,可是此时立即数由补码转化成十进制数并不是负数,所以需要执行此立即数减2的16次方得到一个正确的负数。3、反汇编显示转化后指令:使用C语言的表示法sprintf_s(ch, addu $%d ,$%d,$%d,rd,rs,rt );printf(ch);4、指令仿真实现:一方面是pc的变化,另一方面是寄存器和内存的值变化,另外由*changedReg和*changedMem记录变化情况。若无变化,则赋(-1)值如下:(1)mips-pc=mips-pc+4;(2)mips-registersrd=mips-registersrt+mips-registersrs;(3)if (rd=0)*changedReg=-1;else*changedReg=rd;*changedMem=-1;(2)设计表示:1、分割指令:/从底层数据分割指令opcode=instr26;rs=(instr27;rt=(instr27;rd=(instr27;shamt=(instr27;funct=(instr26;immediate=(instr16;target_addr=(instr6;2、立即数处理:s=immediate15;/s=1,即符号位为1,立即数为负数if (s=1)immediate-=65536;3、指令分情况实现,使用do_instruction()包含反汇编函数实现和指令仿真函数内容。利用 pc 是否为零判断情况/比较指令char ch50;/R格式if (opcode=0)switch(funct)case 33: /addu/pc ! = 0 -被反汇编函数调用if (pc!=0)sprintf_s(ch, addu $%d ,$%d,$%d,rd,rs,rt );printf(ch);/pc = 0 -被指令仿真函数调用elsemips-pc=mips-pc+4;mips-registersrd=mips-registersrt+mips-registersrs;if (rd=0)*changedReg=-1;else*changedReg=rd;*changedMem=-1;break;4、在反汇编函数中调用do_instruction()函数:do_instruction(instr,0,pc);在指令仿真函数中调用do_instruction()函数:do_instruction(instr,mips,0,changedReg,changedMem);【调试报告】1、R格式的jr指令的实现:需要把寄存器中的地址赋予pc,寄存器和内存均无变化。2、R格式的srl指令:移位运算取shamt段数据进行移位即可。我本来还打算循环乘shamt个2,忘记了简单的移位运算。3、J格式的指令jump指令的pc由来:New PC = PC31.28, target address, 00 所以,需要将原pc+4再进行移位运算取pc高四位再与目标地址相加,对于是否需要加4的问题,经过我的思考,觉得需要加四,因为此时传入的pc是上一条指令执行时的pc,即又是控制当前指令的输出的pc(原理:指令执行时的当前pc存储下一条指令的地址)。故需要加四。另外,对语言的输出的表示法不清楚,刚开始时不知道有次用法。4、I格式的bne:当rs寄存器的值不等于rt寄存器的值时,执行pc+4+立即数*45、I格式的lw指令:lw从内存中取数据,数据所在地址就是rs寄存器存放的地址相对起始地址的差值【附录】#include stdafx.h#include proj1.h#include computer.husing namespace std;/指令处理函数:do_instruction(),合理利用重复代码,在反汇编函数和指令仿真函数中调用void do_instruction(unsigned int instr, Computer mips=0,unsigned int pc=0, int *changedReg=0, int *changedMem=0)unsigned int opcode,rs,rt,rd,shamt,funct;int immediate,target_addr;/符号位int s;/从底层数据分割指令opcode=instr26;rs=(instr27;rt=(instr27;rd=(instr27;shamt=(instr27;funct=(instr26;immediate=(instr16;target_addr=(instr6;s=immediate15;/s=1,即符号位为1,立即数为负数if (s=1)/*immediate=(immediate17;*/ /方法1/*immediate=immediate%32768-32768;*/ /方法2immediate-=65536;/方法3:当立即数首位为1时,即把立即数 - 216/比较指令char ch50;/R格式if (opcode=0)switch(funct)case 33: /addu/pc !=0-被反汇编函数调用if (pc!=0)sprintf_s(ch, addu $%d ,$%d,$%d,rd,rs,rt );printf(ch);/pc =0-被指令仿真函数调用elsemips-pc=mips-pc+4;mips-registersrd=mips-registersrt+mips-registersrs;if (rd=0)*changedReg=-1;else*changedReg=rd;*changedMem=-1;break;case 35: /subuif (pc!=0)sprintf_s(ch, subu $%d ,$%d,$%d,rd,rs,rt );printf(ch);elsemips-pc=mips-pc+4;mips-registersrd=mips-registersrt+mips-registersrs;if (rd=0)*changedReg=-1;else*changedReg=rd;*changedMem=-1;break;case 36: /andif (pc!=0)sprintf_s(ch, and $%d ,$%d,$%d,rd,rs,rt );printf(ch);elsemips-pc=mips-pc+4;mips-registersrd=mips-registersrt & mips-registersrs;if (rd=0)*changedReg=-1;else*changedReg=rd;*changedMem=-1;break;case 37: /orif (pc!=0)sprintf_s(ch, or $%d ,$%d,$%d,rd,rs,rt );printf(ch);elsemips-pc=mips-pc+4;mips-registersrd=mips-registersrt mips-registersrs;if (rd=0)*changedReg=-1;else*changedReg=rd;*changedMem=-1;break;case 42: /sltif (pc!=0)sprintf_s(ch, slt $%d ,$%d,$%d,rd,rs,rt );printf(ch);elsemips-pc=mips-pc+4;if (mips-registersrsregistersrt)mips-registersrd=1;elsemips-registersrd=0;if (rd=0)*changedReg=-1;else*changedReg=rd;*changedMem=-1;break;case 8: /jrif (pc!=0)sprintf_s(ch, jr $%d ,rs );printf(ch);elsemips-pc = mips-registersrs;*changedReg=-1;*changedMem=-1;break;case 0: /sllif (pc!=0)sprintf_s(ch, sll $%d ,$%d,%d,rd,rt,shamt );printf(ch);else/int sll_shamt=1;/for (unsigned int i=0;ipc=mips-pc+4;mips-registersrd=mips-registersrtpc=mips-pc+4;mips-registersrd=mips-registersrtshamt;if (rd=0)*changedReg=-1;else*changedReg=rd;*changedMem=-1;break;default:cout不兼容此指令28)28)+(target_addrpc = (pc+4)28)28)+(target_addr28)28)+(target_addrpc = (pc+4)28)28)+(target_addrregistersrs=mips-registersrt)mips-pc=mips-pc+4+immediate*4;elsemips-pc=mips-pc+4;*changedReg=-1;*changedMem=-1;break;case 5: /bneif (pc!=0)pc=pc+4+immediate*4;sprintf_s(ch, bne $%d,$%d,0x%08x ,rs,rt,pc);printf(ch);elseif (mips-registersrs!=mips-registersrt)mips-pc=mips-pc+4+immediate*4;elsemips-pc=mips-pc+4;*changedReg=-1;*changedMem=-1;break;case 9: /addiuif (pc!=0)sprintf_s(ch, addiu $%d,$%d,%d ,rt,rs,immediate );printf(ch);elsemips-pc=mips-pc+4;mips-registersrt=mips-registersrs+immediate;if (rt=0)*changedReg=-1;else*changedReg=rt;*changedMem=-1;break;case 12: /andiif (pc!=0)sprintf_s(ch, andi $%d,$%d,0x%x ,rt,rs,(unsigned short)immediate);printf(ch);elsemips-pc=mips-pc+4;mips-registersrt=mips-registersrs&immediate;if (rt=0)*changedReg=-1;else*changedReg=rt;*changedMem=-1;break;case 13: /oriif (pc!=0)sprintf_s(ch, ori $%d,$%d,0x%x,rt,rs,(unsigned short)immediate);printf(ch);elsemips-pc=mips-pc+4;mips-registersrt=mips-registersrs|immediate;if (rt=0)*changedReg=-1;else*changedReg=rt;*changedMem=-1;break;case 15: /luiif (pc!=0)sprintf_s(ch, lui $%d,0x%x,rt,(unsigned short)immediate);printf(ch);elsemips-pc=mips-pc+4;mips-registersrt=immediatepc=mips-pc+4;if (rt=0)*changedReg=-1;else*changedReg=rt;mips-registersrt=mips-memory(mips-registersrs - 0x00400000 + immediate)/4;*changedMem= -1;break;case 43: /swif (pc!=0)sprintf_s(ch, sw $%d,%d($%d) ,rt,immediate, rs);printf(ch);elsemips-pc=mips-pc+4;*changedReg=-1;mips-memory(mips-registersrs - 0x00400000 + immediate)/4 = mips-registersrt;*changedMem= mips-registersrs +immediate ;break;default:cout不兼容此指令endl;exit(NULL);char * disassembled (unsigned int instr, unsigned int pc) do_instruction(instr,0,pc);return ;/指令仿真void simulateInstr (Computer mips, unsigned int instr, int *changedReg, int *changedMem) /* You replace this code by the right stuff. */do_instruction(instr,mips,0,changedReg,changedMem);实习题目二【需求规格说明】需要使用Logisim来创建一个16-位单时钟周期CPU.15-12111098765432100rsrtrdparty bits!funct参见R-type Instructions1rsrtimmediate-udisp: DISPimm = $rs2rsrtimmediate-ului: $rt = imm 83rsrtimmediate-uori: $rt = $rs | imm4rsrtimmediate-saddi: $rt = $rs + imm5rsrtimmediate-uandi: $rt = $rs & imm6rsrtimmediate-slw: $rt = MEM$rs + imm7rsrtimmediate-ssw: MEM$rs+imm = $rt8jump addressjump9rsrtoffsetbeq10rsrtoffsetbneR-Type Instructionsfunctmeaning0or: $rd = $rs | $rt1and: $rd = $rs & $rt2add: $rd = $rs + $rt3sub: $rd = $rs - $rt4sllv: $rd = $rs $rt6srav: $rd = $rs $rt7slt: $rd = ($rs $rt使用多个分位器组合实现移位运算,最后由$rt寄存器中的值的后4位选择移位数。若$rt寄存器中的值的高12位不为零,则移位数大于16位,即移位后结果为零。刚开始时不知道如何判断移位数,同学认为移位数应该为shamt部分的值,但最后我还是根据题目要求实现判断移位数。至于如何实现,在参考其他材料后,我才知道可以使用多个或运算元件实现判断高12位是否为零。5、addi的实现:输出的结果为补码。修改后,可判断是否溢出6、jump指令的实现:取当前pc的高四位,新的pc=(当前pc高四位)+target_adresss7、beq指令的实现:当$rs=$rt时,即busA busB=0时执行跳转。8、跳转比较器:因为每一个ALUstr值对应一种运算,所以与d,e,f比较,若其中一个相等则输出非零值。否则输出零。(这里必须输出零,否则会导致输出随机数,以致cpu运行停止)9、加减法判断溢出:注意:实现能判断溢出的加法需要使用两个加法器,一位的最高位加法器和15位的低位加法器,由高位加法器
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年网络商业分析与决策能力测试试卷及答案
- 2025年图书情报专业毕业生就业能力测试题及答案
- 2025年社区服务管理专业能力评估试题及答案
- 2025年农业经济与管理考试模拟试卷及答案
- 2025年临床药学研究生入学考试试题及答案
- 2025年建筑工程师资格考试理论试题及答案
- 2025年海洋科学专业入学考试卷及答案
- 英语阅读中的词汇推测技巧:高二英语教案
- 2021学年上海华二紫竹高一(下)期中英语试题及答案
- 经典名篇中的情感与思考:高中语文作文教学
- 心脏康复中医优势与模式探讨
- 工艺工程师职业生涯规划及目标
- 口腔vip服务流程
- 同声传译考试大纲
- 中国居民膳食指南(全)
- 暴发性1型糖尿病培训演示课件
- 幼儿园小班故事《贪吃的小猪》课件
- 日产轩逸说明书
- 2023年山东省淄博市中考历史试卷真题(含答案)
- 低噪声污水冷却塔施工方案
- 中央企业安全生产考核实施细则课件
评论
0/150
提交评论