單周期CPU實驗報告_第1頁
單周期CPU實驗報告_第2頁
單周期CPU實驗報告_第3頁
單周期CPU實驗報告_第4頁
單周期CPU實驗報告_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、北京工業(yè)大學(xué) MIPC-CPU 設(shè)計課程MIPS-CPU設(shè)計實驗報告實驗名稱:32位單周期MIPS-CPU設(shè)計姓名學(xué)號:劉 高 斯 11072205實驗日期:2014年12月19日目錄前言 MIPS簡介 - 3實驗?zāi)康?- 3第一部分 VERILOG HDL 語言實現(xiàn)部分實驗內(nèi)容 - 4試驗環(huán)境 - 4模塊簡介 - 4實驗截圖 - 5實驗感想 - 5實驗代碼 - 6第二部分 LOGISIM 語言實現(xiàn)部分實驗內(nèi)容 - 16實驗環(huán)境 - 16模塊設(shè)計 - 16試驗感想 - 23前言一、MIPS簡介MIPS是世界上很流行的一種RISC處理器。MIPS的意思“無內(nèi)部互鎖流水級的微處理器”(Microp

2、rocessor without interlocked piped stages),其機制是盡量利用軟件辦法避免流水線中的數(shù)據(jù)相關(guān)問題。它最早是在80年代初期由斯坦福(Stanford)大學(xué)Hennessy教授領(lǐng)導(dǎo)的研究小組研制出來的。MIPS公司的R系列就是在此基礎(chǔ)上開發(fā)的RISC工業(yè)產(chǎn)品的微處理器。這些系列產(chǎn)品為很多計算機公司采用構(gòu)成各種工作站和計算機系統(tǒng)。MIPS技術(shù)公司是美國著名的芯片設(shè)計公司,它采用精簡指令系統(tǒng)計算結(jié)構(gòu)(RISC)來設(shè)計芯片。和英特爾采用的復(fù)雜指令系統(tǒng)計算結(jié)構(gòu)(CISC)相比,RISC具有設(shè)計更簡單、設(shè)計周期更短等優(yōu)點,并可以應(yīng)用更多先進的技術(shù),開發(fā)更快的下一代處理

3、器。MIPS是出現(xiàn)最早的商業(yè)RISC架構(gòu)芯片之一,新的架構(gòu)集成了所有原來MIPS指令集,并增加了許多更強大的功能。MIPS處理器是八十年代中期RISC CPU設(shè)計的一大熱點。MIPS是賣的最好的RISC CPU,可以從任何地方,如Sony, Nintendo的游戲機,Cisco的路由器和SGI超級計算機,看見MIPS產(chǎn)品在銷售。目前隨著RISC體系結(jié)構(gòu)遭到x86芯片的競爭,MIPS有可能是起初RISC CPU設(shè)計中唯一的一個在本世紀(jì)盈利的。和英特爾相比,MIPS的授權(quán)費用比較低,也就為除英特爾外的大多數(shù)芯片廠商所采用。MIPS的系統(tǒng)結(jié)構(gòu)及設(shè)計理念比較先進,其指令系統(tǒng)經(jīng)過通用處理器指令體系MIP

4、S I、MIPS II、MIPS III、MIPS IV到MIPS V,嵌入式指令體系MIPS16、MIPS32到MIPS64的發(fā)展已經(jīng)十分成熟。在設(shè)計理念上MIPS強調(diào)軟硬件協(xié)同提高性能,同時簡化硬件設(shè)計。2、 實驗?zāi)康奈覀兺ㄟ^VERILOG HDL 語言和LOGISIM 語言分別用語句和圖形完成對32位MIPS-CPU的設(shè)計,通過前8周的學(xué)習(xí)我們基本掌握了MIPS的概念和原理,認(rèn)識到RISC架構(gòu)的特征和優(yōu)缺點。通過過老師的講解,了解到每一條語句的從設(shè)計到硬件實現(xiàn)的全過程。通過本次實驗我們要更加深入的理解硬件組成的結(jié)構(gòu),語句邏輯實現(xiàn)的原理。掌握硬件編程語言和硬件圖形語言編程的方法。透徹的理解

5、MIPS的特征和優(yōu)點。VERILOG HDL 語言實現(xiàn)部分實驗內(nèi)容利用VERILOG設(shè)計一種32位單周期MIPS CPU。首先設(shè)計各個子模塊,并將已做好的各個模塊進行模塊合并,實現(xiàn)單周期CPU的各項指令。實驗環(huán)境Window Xp Quartus II各個子模塊的簡單介紹此程序?qū)?shù)據(jù)通路(SingleDataLoad)設(shè)定為頂層模塊,下面的模塊包括:算術(shù)邏輯運算單元(ALU)、數(shù)據(jù)存儲器(DataStore)、數(shù)據(jù)寄存器(Registers)、取指令部件(GetCode)、總控制器(Control),通過頂層模塊對各個子模塊的調(diào)用從而實現(xiàn)了整個單周期CPU。1) 數(shù)據(jù)通路(SingleData

6、Load):進行數(shù)據(jù)的運算、讀取以及存儲功能,通過總控制器產(chǎn)生的各個控制信號,進而實現(xiàn)對數(shù)據(jù)的各項操作。2) 算術(shù)邏輯運算單元(ALU):數(shù)據(jù)通路調(diào)用此模塊,根據(jù)得到的控制信號對輸入數(shù)據(jù)進行處理,處理功能有:addu、add、or、subu、sub、sltu、slt等。3) 數(shù)據(jù)存儲器(DataStore):當(dāng)WrEn控制信號為1時,此時就將輸入數(shù)據(jù)存儲到此存儲器中,當(dāng)WrEn為0時,則根據(jù)輸入的地址,找到地址對應(yīng)的單元將單元中的數(shù)據(jù)輸出。4) 數(shù)據(jù)寄存器(Registers):在此程序中功能和實現(xiàn)基本和數(shù)據(jù)存儲器相同,但在實際CPU當(dāng)中使用的邏輯器件及獲取數(shù)據(jù)的方式還是有所區(qū)別的。5) 取指

7、令部件(GetCode):指根據(jù)PC所提供的地址從指令寄存器中取出要執(zhí)行的指令,再根據(jù)各控制信號,得出下一次要執(zhí)行的指令的地址。(總控制器(Control):總控制器通過從取指令部件獲得的指令,進而產(chǎn)生各個控制信號,并將控制信號返回個數(shù)據(jù)通路,就此實現(xiàn)各項功能。程序截圖及說明上圖為執(zhí)行下列指令產(chǎn)生的圖像:Mem0<=6'b000100,5'b00001,5'b00010,5'b00000,5'b00000,6'b000001; /beq $1,$2,1Mem4<=6'b000000,5'b00001,5'b00

8、010,5'b00100,5'b00000,6'b101011; /sltu $4,$1,$2 Mem8<=6'b000010,5'b00000,5'b00000,5'b00000,5'b00000,6'b000010; /j 2當(dāng)$1、$2所指的寄存器的值相同時,執(zhí)行上述指令,得到的圖如下:可以看出CPU跳過了第二條指令,直接執(zhí)行了第三條,而上圖執(zhí)行了第一條指令后接著執(zhí)行第二條,最后才執(zhí)行第三條指令,區(qū)別就在于第一幅圖表示的是$1、$2中的值不相等所執(zhí)行的情況,第二幅圖表示的是$1、$2中的值相等的情況,由此可以得

9、知測試正確。實驗收獲及感想VERILOG 語句將二進制元器件的原理整合到類匯編語言上,通過這次實驗我從理解上從這語言本身理解到邏輯與函數(shù)不分家的道理,每一條連線和與、非、或都是一個個對應(yīng)的函數(shù)。任一個復(fù)雜的CPU 都是從一條條簡單的邏輯一條一條實現(xiàn)的。任何一條語句都是通過不同的函數(shù)和賦值分分合合直到被執(zhí)行完畢。實驗代碼:數(shù)據(jù)通路(SingleDataLoad)module SingleDataLoad(clk,RegWr,RegDst,ExtOp,ALUSrc,Branch,Jump,MemtoReg,MemWr,ALUctr);input clk;/input31:0 Instruction

10、;output RegWr,RegDst,ExtOp,ALUSrc,Branch,Jump,MemtoReg,MemWr;output2:0 ALUctr;wire RegWr,RegDst,ExtOp,ALUSrc,Branch,Jump,MemtoReg,MemWr;wire2:0 ALUctr;wire 31:0 Instruction;wire 4:0 Rd,Rt,Rs;wire 5:0 op,func;wire4:0 Rx;wire P1,P2,Zero,Overflow;wire 31:0 busW,busA,busB,out1,dataout,busB1,busBo;wire 1

11、5:0 imm16;Control con(Instruction,RegWr,ExtOp,ALUSrc,ALUctr,Branch,Jump,RegDst,MemtoReg,MemWr);assign op=Instruction31:26;assign func=Instruction5:0;assign Rs=Instruction25:21;assign Rt=Instruction20:16;assign Rd=Instruction15:11;assign imm16=Instruction15:0;assign P1=P2&RegWr;MUX2 mux2(RegDst,R

12、t,Rd,Rx);assign busB1=16imm1615 & ExtOp,imm1615:0;MUX2TO1 mux1(ALUSrc,busB,busB1,busBo);Registers Reg(clk,busW,P1,Rx,Rs,Rt,busA,busB);ALU alu(busA,busBo,ALUctr,out1,Overflow,Zero);assign P2=!Overflow;DataStore datas(clk,busB,out14:0,MemWr,dataout);MUX2TO1 mux3(MemtoReg,out1,dataout,busW);GetCode

13、 get(Branch,Zero,Jump,clk,Instruction);endmodule module MUX2TO1(op,X,Y,Z);input op;input 31:0 X,Y;output31:0 Z;reg 31:0 Z;always(op)beginif(op=1)Z=Y;elseZ=X;endendmodulemodule MUX2(op,x,y,z);input op;input 4:0 x,y;output4:0 z;reg 4:0 z;always(op)beginif(op=1)z=y;elsez=x;endendmodule算數(shù)邏輯運算單元(ALU)modu

14、le ALU(A,B,ALUctr,Result,Overflow,Zero); parameter n=32; input n-1:0 A,B; input 2:0 ALUctr; output n-1:0 Result; output Overflow,Zero; wire Zero,Overflow; wire n-1:0 Result; wire SUBctr,OVctr,SIGctr; wire 1:0 OPctr; wire n-1:0 H,M,N,Add_Result; wire K,G,I,Add_Sign,Add_Overflow,Add_carry; assign SUBc

15、tr=ALUctr2; assign OVctr=!ALUctr1 & ALUctr0; assign SIGctr=ALUctr0; assign OPctr1=ALUctr2 & ALUctr1; assign OPctr0=!ALUctr2 & ALUctr1 &!ALUctr0; assign H=BnSUBctr; assign M=A|B; Adderk nbit_add(SUBctr,A,H,Add_carry,Add_Sign,Add_Result,Zero); /,Add_Overflow assign Add_Overflow= An-1 &

16、amp; Hn-1 & !Add_Resultn-1 | !An-1 & !Hn-1 & Add_Resultn-1; assign K=SUBctr Add_carry; assign I=Add_Sign Add_Overflow; assign Overflow=OVctr & Add_Overflow; IMUX2to1 YN(K,I,SIGctr,G); IMUX2to1 yn(0,1,G,N); MUX3to1 nbit_Result(Add_Result,M,N,OPctr,Result);endmodulemodule Adderk (Cin,

17、X, Y,Add_carry,Add_sign,Add_result,Zero); /Add_Overflow, parameter k = 32; input k-1:0 X, Y; input Cin; output k-1:0 Add_result; output Add_carry,Add_sign,Zero; /,Add_Overflow reg k-1:0 Add_result; reg Add_carry,Zero,Add_sign; /,Add_Overflow always(X or Y or Cin) beginAdd_carry, Add_result = X + Y +

18、 Cin; if(Add_result=0)Zero=1;elseZero=0;if(Add_result31=1)Add_sign=1;elseAdd_sign=0; endendmodulemodule MUX3to1 (V,W,U,Selm,F); parameter k = 32; input k-1:0 V,W,U; input 1:0 Selm; output k-1:0 F; reg k-1:0 F; always (V or W or U or Selm) case(Selm) 2'b00: F <= V; 2'b01: F <= W; 2'

19、b10: F<=U; endcase endmodule module IMUX2to1 (V,W,SIGctr,Less); input31:0 V,W; input SIGctr; output31:0 Less; reg31:0 Less; always (V or W or SIGctr) if (SIGctr = 0) Less <= V; else Less <= W;Endmodule數(shù)據(jù)存儲器(DataStore):module DataStore(clk,DataIn,Adr,WrEn,Out);input 31:0 DataIn;input 4:0 Adr

20、;input WrEn,clk;output 31:0 Out;reg 31:0 Out;reg 31:0 Store 31:0;always(negedge clk)beginif(WrEn=1)StoreAdr=DataIn;endalways(Adr or WrEn)if(WrEn=0)Out=StoreAdr;endmodule數(shù)據(jù)寄存器(Registers):module Registers(clk,busW,wr,Rw,Ra,Rb,busA,busB);input 31:0 busW;input clk,wr;input 4:0 Rw,Ra,Rb;output 31:0 busA,

21、busB;reg 31:0 busA,busB;reg 31:0 Regist 31:0;always(negedge clk)beginRegist1=32'd25; Regist2=32'd25;if(wr=0)RegistRw=busW;endalways(Ra or Rb or wr)beginif(wr=1)beginbusA=RegistRa;busB=RegistRb;endendendmodule取指令部件(GetCode):module GetCode(Branch,Zero,Jump,clk,Instruction);input Zero,Branch,Ju

22、mp,clk;output31:0 Instruction;reg29:0 PC=25;wire29:0 M,M2;wire 4:0 addmem;wire K;reg reset=1;assign addmem=PC2:0,2'b00;wire29:0 O1,O2,O3,O4;wire15:0 imm16;instruct InsMem(addmem,Instruction);always(negedge clk)begin if (reset=1)beginPC <=0;reset<=0;end elsebegin PC <= O4;endendassign im

23、m16=Instruction15:0;assign M=PC;assign K=Zero & Branch;Adder adder1(M,1,O1);assign M1=14imm1615,imm1615:0;Adder adder2(O1,M1,O2);MUX2T1 mux1(K,O1,O2,O3);assign M2=M29:26,Instruction25:0;MUX2T1 mux2(Jump,O3,M2,O4);endmodulemodule Adder(M,N,O);input29:0 M;input29:0 N;output29:0 O;wire29:0 M,N,O;as

24、sign O=M+N;endmodule module MUX2T1(op,X,Y,Z);input op;input 29:0 X,Y;output29:0 Z;reg 29:0 Z;always(op)beginif(op=1)Z=Y;elseZ=X;endendmodulemodule instruct(addr,inst); input 4:0 addr; output 31:0 inst; reg 31:0 inst;/ Declare the RAM variable reg 31:0 Mem 31:0;/ write instruction: add 3<=(1)+(2),

25、sub 6<=(4)-(5),jump 0 always (*)begin/Mem0<=6'b000000,5'b00001,5'b00010,5'b00011,5'b00000,6'b100000; /add $3,$1,$2/ Mem4<=6'b000000,5'b00011,5'b00001,5'b00100,5'b00000,6'b100010; /sub $4,$3,$1/ Mem0<=6'b000000,5'b00001,5'b00010,

26、5'b00011,5'b00000,6'b101010; /slt $3,$1,$2/ Mem4<=6'b000000,5'b00011,5'b00001,5'b00100,5'b00000,6'b100011; /subu $4,$3,$1/ Mem0<=6'b000000,5'b00001,5'b00010,5'b00011,5'b00000,6'b101010; /slt $3,$1,$2/ Mem4<=6'b000000,5'b000

27、01,5'b00010,5'b00100,5'b00000,6'b101011; /sltu $4,$1,$2/Mem0<=6'b001101,5'b00001,5'b00011,5'b10000,5'b00000,6'b000101; /ori $3,$1,32773/ Mem4<=6'b001001,5'b00010,5'b00100,5'b00000,5'b00000,6'b001000; /addiu $4,$2, 8/ Mem4<=6

28、9;b001001,5'b00010,5'b00100,5'b11111,5'b11111,6'b111000; /addiu $4,$2, -8/ Mem0<=6'b101011,5'b00001,5'b00011,5'b00000,5'b00000,6'b000101; /sw $3,$1,5/ Mem4<=6'b100011,5'b00001,5'b00100,5'b00000,5'b00000,6'b000101; /lw $4,$1,5

29、Mem0<=6'b000100,5'b00001,5'b00010,5'b00000,5'b00000,6'b000001; /beq $1,$2,1 Mem4<=6'b000000,5'b00001,5'b00010,5'b00100,5'b00000,6'b101011; /sltu $4,$1,$2 Mem8<=6'b000010,5'b00000,5'b00000,5'b00000,5'b00000,6'b000010;/j

30、2end/ read always (addr)begininst <= Memaddr;endendmodule總控制器(Control):module Control(Instruction,RegWr,ExtOp,ALUSrc,ALUctr,Branch,Jump,RegDst,MemtoReg,MemWr);output RegWr,RegDst,ExtOp,ALUSrc,Branch,Jump,MemtoReg,MemWr;input31:0 Instruction;reg RegWr,RegDst,ExtOp,ALUSrc,Branch,Jump,clk,MemtoReg,M

31、emWr;output 2:0 ALUctr;reg 2:0 ALUctr;wire 5:0 op,func;assign op=Instruction31:26;assign func=Instruction5:0;parameter S0=6'b100000,S1=6'b100010,S2=6'b100011,S3=6'b101010,S4=6'b101011,S5=6'b001101,S6=6'b001001,S7=6'b100011,S8=6'b101011,S9=6'b000100,S10=6'b

32、000010;always(op or func)beginif(op=6'b000000)begincase(func)S0:beginBranch=0;Jump=0;RegDst=1;ALUSrc=0;ALUctr=3'b001;MemtoReg=0;RegWr=1;MemWr=0;endS1:beginBranch=0;Jump=0;RegDst=1;ALUSrc=0;ALUctr=3'b101;MemtoReg=0;RegWr=1;MemWr=0;endS2:beginBranch=0;Jump=0;RegDst=1;ALUSrc=0;ALUctr=3'b100;MemtoReg=0;RegWr=1;MemWr=0;endS3:beginBranch=0;Jump=0;RegDst=1;ALUSrc=0;ALUctr=3'b111;MemtoReg=0;RegWr=1;MemWr=0;endS4:be

溫馨提示

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

評論

0/150

提交評論