類MIPS單周期微處理器設(shè)計(jì)實(shí)驗(yàn)報(bào)告-鐘遠(yuǎn)維-U201213500_第1頁
類MIPS單周期微處理器設(shè)計(jì)實(shí)驗(yàn)報(bào)告-鐘遠(yuǎn)維-U201213500_第2頁
類MIPS單周期微處理器設(shè)計(jì)實(shí)驗(yàn)報(bào)告-鐘遠(yuǎn)維-U201213500_第3頁
類MIPS單周期微處理器設(shè)計(jì)實(shí)驗(yàn)報(bào)告-鐘遠(yuǎn)維-U201213500_第4頁
類MIPS單周期微處理器設(shè)計(jì)實(shí)驗(yàn)報(bào)告-鐘遠(yuǎn)維-U201213500_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、類MIPS單周期微處理器設(shè)計(jì)實(shí)驗(yàn)報(bào)告專業(yè):電子信息工程班級(jí):卓越1201班學(xué)號(hào): U201213500姓名: 鐘 遠(yuǎn) 維 一、 實(shí)驗(yàn)?zāi)康?. 了解微處理器的基本結(jié)構(gòu)2. 掌握哈佛結(jié)構(gòu)的計(jì)算機(jī)工作原理3. 學(xué)會(huì)設(shè)計(jì)簡(jiǎn)單的微處理器4. 了解軟件控制硬件工作的基本原理二、 實(shí)驗(yàn)任務(wù)利用HDL語言,基于Xilinx FPGA nexys4實(shí)驗(yàn)平臺(tái),設(shè)計(jì)一個(gè)能夠執(zhí)行以下MIPS指令集的單周期類MIPS處理器,要求完成所有支持指令的功能仿真,驗(yàn)證指令執(zhí)行的正確性,要求編寫匯編程序?qū)⒈救藢W(xué)號(hào)的ASCII碼存入RAM的連續(xù)內(nèi)存區(qū)域支持基本的內(nèi)存操作如lw,sw指令支持基本的算術(shù)邏輯運(yùn)算如add,sub,and

2、,or,slt,andi指令支持基本的程序控制如beq,j指令三、 微處理器各模塊設(shè)計(jì)各模塊的框圖結(jié)構(gòu)如上圖所示。由圖可知,該處理器包含指令存儲(chǔ)器、數(shù)據(jù)存儲(chǔ)器、寄存器組、ALU單元、符號(hào)數(shù)擴(kuò)張、控制器、ALU控制譯碼以及多路復(fù)用器等。圖中還忽略了一個(gè)單元:時(shí)鐘信號(hào)產(chǎn)生器,而且以上各個(gè)部件必須在時(shí)鐘信號(hào)的控制下協(xié)調(diào)工作。1. 指令存儲(chǔ)器的設(shè)計(jì)指令寄存器為ROM類型的存儲(chǔ)器,為單一輸出指令的存儲(chǔ)器。因此其對(duì)外的接口為clk、存儲(chǔ)器地址輸入信號(hào)(指令指針)以及數(shù)據(jù)輸出信號(hào)(指令)。(1)在IP wizard 中配置ROM,分配128個(gè)字的存儲(chǔ)空間,字長(zhǎng)為32位寬。(2)選擇輸入具有地址寄存功能,只有

3、當(dāng)時(shí)鐘上升沿有效時(shí),才進(jìn)行數(shù)據(jù)的輸出。(3)配置ROM內(nèi)存空間的初始化COE文件。最后單擊Generate按鈕生成IROM模塊。2. 數(shù)據(jù)存儲(chǔ)器的設(shè)計(jì)數(shù)據(jù)存儲(chǔ)器為RAM類型的存儲(chǔ)器,并且需要獨(dú)立的讀寫控制信號(hào)。因此其對(duì)外的接口輸入信號(hào)為clk、we、datain、addr;輸出信號(hào)為dataout。數(shù)據(jù)存儲(chǔ)器基本建立過程同ROM的建立。3. 寄存器組設(shè)計(jì)寄存器組是指令操作的主要對(duì)象,MIPS中一共有32個(gè)32位寄存器。在指令的操作過程中需要區(qū)分Rs、Rt、Rd的地址和數(shù)據(jù),并且Rd的數(shù)據(jù)只有在寄存器寫信號(hào)有效時(shí)才能寫入,因此該模塊的輸入為clk、RegWriteAddr、RegWriteDat

4、a、RegWriteEn、RsAddr、RtAddr、reset;輸出信號(hào)為RsData、RtData。由于$0一直輸出0,因此當(dāng)RsAddr、RtAddr為0時(shí),RsData以及RtData必須輸出0,否則輸出相應(yīng)地址寄存器的值。另外,當(dāng)RegWriteEn有效時(shí),數(shù)據(jù)應(yīng)該寫入RegWriteAddr寄存器。并且每次復(fù)位時(shí)所有寄存器都清零。代碼如下:module regFile( input clk, input reset, input 31:0 regWriteData, input 4:0 regWriteAddr, input regWriteEn, output 31:0 RsDa

5、ta, 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=regWriteData;endende

6、lsebeginfor(i=0;i<31;i=i+1)regsi=0;regs31=32'hffffffff;endendendmodule4. ALU設(shè)計(jì)在這個(gè)簡(jiǎn)單的MIPS指令集中,微處理器支持add、sub、and、or、slt運(yùn)算指令,需要利用ALU單元實(shí)現(xiàn)運(yùn)算,同時(shí)數(shù)據(jù)存儲(chǔ)指令sw、lw也需要ALU單元計(jì)算存儲(chǔ)器地址,條件跳轉(zhuǎn)指令beq需要ALU來比較兩個(gè)寄存器是否相等。所有這些指令包含的操作為加、減、與、或小于設(shè)置5種不同的操作。該模塊根據(jù)輸入控制信號(hào)對(duì)輸入數(shù)據(jù)進(jìn)行相應(yīng)的操作,并獲得輸出結(jié)果以及零標(biāo)示,由于MIPS處理器ALU單元利用4根輸入控制線的譯碼決定執(zhí)行何種操

7、作,因此該模塊的接口為:輸入: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:beginaluRes=input1-inp

8、ut2;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控制設(shè)計(jì)ALU單元對(duì)應(yīng)以上5種操作的編碼如表所示:輸入信號(hào)操

9、作類型0000與0001或0010加0110減0111小于設(shè)置通過2位操作類型碼以及6位指令功能碼就可以產(chǎn)生ALU單元的4位控制信號(hào)。它們之間的對(duì)應(yīng)關(guān)系如表所示:因此該模塊的主要功能就是根據(jù)譯碼控制單元產(chǎn)生2位操作碼以及6位功能碼產(chǎn)生4位ALU控制信號(hào),接口為:輸入: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)casex(ALUOp,funct)8

10、'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;endcaseendmodule6. 控制

11、器設(shè)計(jì)控制器輸入為指令的opCode字段,即操作碼。操作碼經(jīng)過主控制單元的譯碼,給ALUCtr、Data、Memory、Registers、Muxs等部件輸出正的控制信號(hào)。微處理器在執(zhí)行不同指令時(shí),哥哥控制信號(hào)相對(duì)應(yīng)的狀態(tài)表如下:因此該模塊的接口為:輸入:opcode(6bit)輸出:alusrc,memtoreg,regwrite,memread,memwrite,branch,aluop1:0,jmp代碼為:module ctr( input 5:0 opCode, output regDst, output aluSrc, output memToReg, output regWrite

12、, 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'b000010:/jmpbeginregDst=0;aluSrc=0;memToReg=0;regWrite=0;memRead=0;memWrite=

13、0;branch=0;aluop=2'b00;jmp=1;end6'b000000:/RbeginregDst=1;aluSrc=0;memToReg=0;regWrite=1;memRead=0;memWrite=0;branch=0;aluop=2'b10;jmp=0;end6'b100011:/lwbeginregDst=0;aluSrc=1;memToReg=1;regWrite=1;memRead=1;memWrite=0;branch=0;aluop=2'b00;jmp=0;end6'b101011:/swbeginregDst=0;

14、aluSrc=1;memToReg=0;regWrite=0;memRead=0;memWrite=1;branch=0;aluop=2'b00;jmp=0;end6'b000100:/beqbeginregDst=0;aluSrc=0;memToReg=0;regWrite=0;memRead=0;memWrite=0;branch=1;aluop=2'b01;jmp=0;end6'b001100:/andibeginregDst=0;aluSrc=1;memToReg=0;regWrite=1;memRead=0;memWrite=0;branch=0;al

15、uop=2'b11;jmp=0;enddefault:beginregDst=0;aluSrc=0;memToReg=0;regWrite=0;memRead=0;memWrite=0;branch=0;aluop=2'b00;jmp=0;endendcaseendendmodule7. 符號(hào)數(shù)擴(kuò)展將16位有符號(hào)擴(kuò)展為32位有符號(hào)數(shù)。帶符號(hào)擴(kuò)展只需要在前面補(bǔ)足符號(hào)即可。代碼為:module signext( input 15:0 inst, output 31:0 data );assign data=inst15:15?16'hffff,inst:16'h00

16、00,inst;endmodule8. 頂層模塊頂層模塊需要將前面多個(gè)模塊實(shí)例化,通過導(dǎo)線以及多路復(fù)用器將各個(gè)部件連接起來,并且在時(shí)鐘的控制下修改PC的值,PC是一個(gè)32位的寄存器,每個(gè)時(shí)鐘沿自動(dòng)增加4。多路復(fù)用器MUX直接通過三目運(yùn)算符實(shí)現(xiàn):Assign OUT = SEL?INPUT1:INPUT2;其中,OUT、SEL、INPUT1、INPUT2都是預(yù)先定義的信號(hào)。代碼如下:module top( input clkin, input reset );reg31:0 pc,add4;wire choose4;wire31:0 expand2,mux2,mux3,mux4,mux5,add

17、ress,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;/wireforext

18、wire31:0 expand;always (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),.jm

19、p(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_number imem(.a(pc8:2),.clk(clkin),.spo(inst);regFile regfile(.RsA

20、ddr(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?memr

21、eaddata:aluRes;assign mux4=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匯編程序設(shè)計(jì)下面以將本人學(xué)號(hào)U201213500的ASCII碼存入RAM的連續(xù)內(nèi)存區(qū)域編寫為匯編程序?yàn)槔壕庉婱IPS匯編源代碼:采用ultraedit

22、編輯匯編源程序代碼,并保存為number.asm文件。代碼如下: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,50 #2sw $2,16($3)andi $2,$31,49 #1sw $2,20($3)andi $2,$31,51 #3sw $2,24($3)andi $2,$31,53 #5sw $2,28($3)andi $2,$31,48 #0sw $2,32($3)andi

23、$2,$31,48 #0sw $2,36($3)j main獲取機(jī)器代碼,并保存為coe文件:利用QtSpim裝載number.asm,并測(cè)試功能是否正常。裝載之后的用戶代碼段在QtSpim中的結(jié)構(gòu)如附圖所示:提取的用戶代碼對(duì)應(yīng)的機(jī)器碼,并把j main指令對(duì)應(yīng)的機(jī)器碼0x08100009修改為0x08000000。將上述機(jī)器指令保存在ultraedit中新的文件中,添加coe文件頭描述語句,完成后的完整coe文件內(nèi)容如下:MEMORY_INITIALIZATION_RADIX=16;MEMORY_INITIALIZATION_VECTOR=33e20055,ac620000,33e20032

24、,ac620004,33e20030,ac620008,33e20031,ac62000c,33e20032,ac620010,33e20031,ac620014,33e20033,ac620018,33e20035,ac62001c,33e20030,ac620020,33e20030,ac620024,08000000,將該文件保存為coe文件,即number.coe。至此,coe文件制作完成。最后,把coe文件導(dǎo)入irom中,如下圖所示:五、 模塊仿真1. 寄存器組仿真:建立仿真代碼,在自動(dòng)生成的激勵(lì)代碼基礎(chǔ)上加入功能仿真需要的代碼:reset測(cè)試、寫入測(cè)試、輸出測(cè)試等、完整代碼如下:m

25、odule regsim;/ Inputsreg clk;reg reset;reg 31:0 regWriteData;reg 4:0 regWriteAddr;reg regWriteEn;reg 4:0 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(regWriteA

26、ddr), .regWriteEn(regWriteEn), .RsData(RsData), .RtData(RtData), .RsAddr(RsAddr), .RtAddr(RtAddr);integer 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 hereregWri

27、teData=32'h55aaaa55;regWriteEn=1;reset=1;#100;reset=0;end parameter PERIOD = 20;always beginclk = 1'b0;#(PERIOD/2) clk = 1'b1;#(PERIOD/2);endalways beginfor(i = 31; i>= 1; i=i-1) beginregWriteAddr = i;RsAddr=i;#PERIOD;endendendmodule仿真結(jié)果如下:下圖可以觀察到Reset為高電平狀態(tài)。Reset高電平狀態(tài)下輸出數(shù)據(jù)為0,表示Reset有

28、效地工作了。Reset信號(hào)無效后,正常輸入和輸出數(shù)據(jù)。第一次for循環(huán)的地址范圍輸出數(shù)據(jù)在時(shí)鐘低電平時(shí)輸出0,高電平輸出0x55aaaa55,如下圖所示,表明數(shù)據(jù)正確地在時(shí)鐘上升沿寫入的。之后一直輸出的數(shù)據(jù)與寫入的數(shù)據(jù)相同,表明數(shù)據(jù)都正確地保存在寄存器組中。2. 控制器仿真:控制器仿真需要包含所有case的輸入,仿真激勵(lì)文件修改代碼后,如下:module ctrsim;/ Inputsreg 5:0 opCode;/ Outputswire regDst;wire aluSrc;wire memToReg;wire regWrite;wire memRead;wire memWrite;wir

29、e branch;wire 1:0 aluop;wire jmp;/ Instantiate the Unit Under Test (UUT)ctr uut (.opCode(opCode), .regDst(regDst), .aluSrc(aluSrc), .memToReg(memToReg), .regWrite(regWrite), .memRead(memRead), .memWrite(memWrite), .branch(branch), .aluop(aluop), .jmp(jmp);initial begin/ Initialize InputsopCode = 0;/

30、 Wait 100 ns for global reset to finish#100; opCode=6'b000010;/jump#100; opCode=6'b000000;/R#100; opCode=6'b100011;/lw#100; opCode=6'b101011;/sw#100; opCode=6'b000100;endendmodule所有case下的仿真波形如圖所示,將該波形圖與之前的表格對(duì)吧發(fā)現(xiàn)功能正確。3. 頂層仿真:激勵(lì)代碼如下: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 PERIOD

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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)論