計(jì)算機(jī)組成與結(jié)構(gòu)——CPU課程設(shè)計(jì)報(bào)告_第1頁(yè)
計(jì)算機(jī)組成與結(jié)構(gòu)——CPU課程設(shè)計(jì)報(bào)告_第2頁(yè)
計(jì)算機(jī)組成與結(jié)構(gòu)——CPU課程設(shè)計(jì)報(bào)告_第3頁(yè)
計(jì)算機(jī)組成與結(jié)構(gòu)——CPU課程設(shè)計(jì)報(bào)告_第4頁(yè)
計(jì)算機(jī)組成與結(jié)構(gòu)——CPU課程設(shè)計(jì)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、.面向?qū)ο蟪绦蛟O(shè)計(jì)課程設(shè)計(jì) CPU設(shè)計(jì)與仿真課程設(shè)計(jì)報(bào)告學(xué) 號(hào): 2012 班級(jí)序號(hào): 姓 名: 指導(dǎo)教師: 成 績(jī): dida信息工程學(xué)院2012年 6 月實(shí)習(xí)題目一【需求規(guī)格說(shuō)明】一、題目:以下文件:sim.cpp,computer.h,computer.cpp,proj1.cppandproj1.h組成了MIPS仿真器的一個(gè)框架.通過在文件proj1.cpp中增加代碼來(lái)完成整個(gè)程序。你的仿真器必須能仿真以下MIPS機(jī)器指令: addu Rdest, Rsrc1, Rsrc2 addiu Rdest, Rsrc1, imm subu Rdest, Rsrc1, Rsrc2 sll Rdes

2、t, 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)二、問題描述:題目已經(jīng)給出程序代碼的基本框架,我們只需要在pro

3、j1.cpp中實(shí)現(xiàn)反匯編函數(shù)和指令仿真函數(shù),在兩個(gè)函數(shù)中完成以上指令。我們需要參考o(jì)pcode和func的值對(duì)應(yīng)表,通過分情況討論,區(qū)分并實(shí)現(xiàn)指令。三、問題分析:我們要真正理解并解決問題,我們必須大概看懂現(xiàn)成的代碼框架,參考o(jì)pcode與func和指令的對(duì)應(yīng)表,根據(jù)對(duì)應(yīng)數(shù)值使用if,else語(yǔ)句和switch分支實(shí)現(xiàn)區(qū)分實(shí)現(xiàn)指令?!舅惴ㄔO(shè)計(jì)】(1)設(shè)計(jì)思想:1、分割指令:使用移位運(yùn)算的方法實(shí)現(xiàn)分割指令,如:opcode=instr26;rs=(instr27;2、提取符號(hào)位:也是使用移位運(yùn)算取立即數(shù)的最高位,若s=1,則執(zhí)行“immediate - = 65536;”216 = 65536。當(dāng)

4、最高位為1時(shí),即立即數(shù)為負(fù),可是此時(shí)立即數(shù)由補(bǔ)碼轉(zhuǎn)化成十進(jìn)制數(shù)并不是負(fù)數(shù),所以需要執(zhí)行此立即數(shù)減2的16次方得到一個(gè)正確的負(fù)數(shù)。3、反匯編顯示轉(zhuǎn)化后指令:使用C語(yǔ)言的表示法sprintf_s(ch, addu $%d ,$%d,$%d,rd,rs,rt );printf(ch);4、指令仿真實(shí)現(xiàn):一方面是pc的變化,另一方面是寄存器和內(nèi)存的值變化,另外由*changedReg和*changedMem記錄變化情況。若無(wú)變化,則賦(-1)值如下:(1)mips-pc=mips-pc+4;(2)mips-registersrd=mips-registersrt+mips-registersrs;(3

5、)if (rd=0)*changedReg=-1;else*changedReg=rd;*changedMem=-1;(2)設(shè)計(jì)表示:1、分割指令:/從底層數(shù)據(jù)分割指令opcode=instr26;rs=(instr27;rt=(instr27;rd=(instr27;shamt=(instr27;funct=(instr26;immediate=(instr16;target_addr=(instr6;2、立即數(shù)處理:s=immediate15;/s=1,即符號(hào)位為1,立即數(shù)為負(fù)數(shù)if (s=1)immediate-=65536;3、指令分情況實(shí)現(xiàn),使用do_instruction()包含反

6、匯編函數(shù)實(shí)現(xiàn)和指令仿真函數(shù)內(nèi)容。利用 pc 是否為零判斷情況/比較指令char ch50;/R格式if (opcode=0)switch(funct)case 33: /addu/pc ! = 0 -被反匯編函數(shù)調(diào)用if (pc!=0)sprintf_s(ch, addu $%d ,$%d,$%d,rd,rs,rt );printf(ch);/pc = 0 -被指令仿真函數(shù)調(diào)用elsemips-pc=mips-pc+4;mips-registersrd=mips-registersrt+mips-registersrs;if (rd=0)*changedReg=-1;else*changedR

7、eg=rd;*changedMem=-1;break;4、在反匯編函數(shù)中調(diào)用do_instruction()函數(shù):do_instruction(instr,0,pc);在指令仿真函數(shù)中調(diào)用do_instruction()函數(shù):do_instruction(instr,mips,0,changedReg,changedMem);【調(diào)試報(bào)告】1、R格式的jr指令的實(shí)現(xiàn):需要把寄存器中的地址賦予pc,寄存器和內(nèi)存均無(wú)變化。2、R格式的srl指令:移位運(yùn)算取shamt段數(shù)據(jù)進(jìn)行移位即可。我本來(lái)還打算循環(huán)乘shamt個(gè)2,忘記了簡(jiǎn)單的移位運(yùn)算。3、J格式的指令jump指令的pc由來(lái):New PC = P

8、C31.28, target address, 00 所以,需要將原pc+4再進(jìn)行移位運(yùn)算取pc高四位再與目標(biāo)地址相加,對(duì)于是否需要加4的問題,經(jīng)過我的思考,覺得需要加四,因?yàn)榇藭r(shí)傳入的pc是上一條指令執(zhí)行時(shí)的pc,即又是控制當(dāng)前指令的輸出的pc(原理:指令執(zhí)行時(shí)的當(dāng)前pc存儲(chǔ)下一條指令的地址)。故需要加四。另外,對(duì)語(yǔ)言的輸出的表示法不清楚,剛開始時(shí)不知道有次用法。4、I格式的bne:當(dāng)rs寄存器的值不等于rt寄存器的值時(shí),執(zhí)行pc+4+立即數(shù)*45、I格式的lw指令:lw從內(nèi)存中取數(shù)據(jù),數(shù)據(jù)所在地址就是rs寄存器存放的地址相對(duì)起始地址的差值【附錄】#include stdafx.h#incl

9、ude proj1.h#include computer.husing namespace std;/指令處理函數(shù):do_instruction(),合理利用重復(fù)代碼,在反匯編函數(shù)和指令仿真函數(shù)中調(diào)用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;/符號(hào)位int s;/從底層數(shù)據(jù)分割指令o

10、pcode=instr26;rs=(instr27;rt=(instr27;rd=(instr27;shamt=(instr27;funct=(instr26;immediate=(instr16;target_addr=(instr6;s=immediate15;/s=1,即符號(hào)位為1,立即數(shù)為負(fù)數(shù)if (s=1)/*immediate=(immediate17;*/ /方法1/*immediate=immediate%32768-32768;*/ /方法2immediate-=65536;/方法3:當(dāng)立即數(shù)首位為1時(shí),即把立即數(shù) - 216/比較指令char ch50;/R格式if (op

11、code=0)switch(funct)case 33: /addu/pc !=0-被反匯編函數(shù)調(diào)用if (pc!=0)sprintf_s(ch, addu $%d ,$%d,$%d,rd,rs,rt );printf(ch);/pc =0-被指令仿真函數(shù)調(diào)用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

12、(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=mip

13、s-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=-

14、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(c

15、h);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)*

16、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: /bnei

17、f (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);

18、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

19、(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: /l

20、uiif (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!=

21、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, uns

22、igned 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);實(shí)習(xí)題目二【需求規(guī)格說(shuō)明】需要使用Logisim來(lái)創(chuàng)建一個(gè)16-位單時(shí)鐘周期CPU.15-12111098765432

23、100rsrtrdparty 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 = $rt8ju

24、mp addressjump9rsrtoffsetbeq10rsrtoffsetbneR-Type Instructionsfunctmeaning0or: $rd = $rs | $rt1and: $rd = $rs & $rt2add: $rd = $rs + $rt3sub: $rd = $rs - $rt4sllv: $rd = $rs $rt6srav: $rd = $rs $rt7slt: $rd = ($rs $rt使用多個(gè)分位器組合實(shí)現(xiàn)移位運(yùn)算,最后由$rt寄存器中的值的后4位選擇移位數(shù)。若$rt寄存器中的值的高12位不為零,則移位數(shù)大于16位,即移位后結(jié)果為零。剛開始時(shí)不知道

25、如何判斷移位數(shù),同學(xué)認(rèn)為移位數(shù)應(yīng)該為shamt部分的值,但最后我還是根據(jù)題目要求實(shí)現(xiàn)判斷移位數(shù)。至于如何實(shí)現(xiàn),在參考其他材料后,我才知道可以使用多個(gè)或運(yùn)算元件實(shí)現(xiàn)判斷高12位是否為零。5、addi的實(shí)現(xiàn):輸出的結(jié)果為補(bǔ)碼。修改后,可判斷是否溢出6、jump指令的實(shí)現(xiàn):取當(dāng)前pc的高四位,新的pc=(當(dāng)前pc高四位)+target_adresss7、beq指令的實(shí)現(xiàn):當(dāng)$rs=$rt時(shí),即busA busB=0時(shí)執(zhí)行跳轉(zhuǎn)。8、跳轉(zhuǎn)比較器:因?yàn)槊恳粋€(gè)ALUstr值對(duì)應(yīng)一種運(yùn)算,所以與d,e,f比較,若其中一個(gè)相等則輸出非零值。否則輸出零。(這里必須輸出零,否則會(huì)導(dǎo)致輸出隨機(jī)數(shù),以致cpu運(yùn)行停止)9、加減法判斷溢出:注意:實(shí)現(xiàn)能判斷溢出的加法需要使用兩個(gè)加法器,一位的最高位加法器和15位的低位加法器,由高位加法器的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論