類MIPS單周期處理器_第1頁(yè)
類MIPS單周期處理器_第2頁(yè)
類MIPS單周期處理器_第3頁(yè)
類MIPS單周期處理器_第4頁(yè)
類MIPS單周期處理器_第5頁(yè)
已閱讀5頁(yè),還剩15頁(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、一、 實(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語(yǔ)言,基于Xilinx FPGA nexys4實(shí)驗(yàn)平臺(tái),設(shè)計(jì)一個(gè)能夠執(zhí)行以下MIPS指令集的單周期類MIPS處理器,要求完成所有支持指令的功能仿真,驗(yàn)證指令執(zhí)行的正確性,要求編寫(xiě)匯編程序?qū)⒈救藢W(xué)號(hào)的ASCII碼存入RAM的連續(xù)內(nèi)存區(qū)域。(1)支持基本的算術(shù)邏輯運(yùn)算如add,sub,and,or,slt,andi指令(2)支持基本的內(nèi)存操作如lw,sw指令(3)支持基本的程序控制如beq,j指令三、 實(shí)驗(yàn)過(guò)程1、 建立工程在I

2、SE 14.7軟件中建立名為L(zhǎng)ab1 的工程文件。芯片系列選擇Artix7,具體芯片型號(hào)選擇XC7A100T,封裝類型選擇CSG324,速度信息選擇-1。2、 分模塊設(shè)計(jì)1) 指令存儲(chǔ)器ROM設(shè)計(jì)新建IP core Generator,命名為irom。設(shè)定的指令存儲(chǔ)器大小為128字,指令存儲(chǔ)器模塊在頂層模塊中被調(diào)用。輸入為指令指針(PC)與時(shí)鐘信號(hào)(clkin),輸出為32位的機(jī)器指令,并將輸出的機(jī)器指令送到后續(xù)的寄存器組模塊、控制器模塊、立即數(shù)符號(hào)擴(kuò)展模塊進(jìn)行相應(yīng)的處理。然后制作COE文件。先使用UltraEdit編輯代碼,代碼如下main:addi $2,$0,85 sw $2,0($3)

3、addi $2,$0,50 sw $2,4($3)addi $2,$0,48 sw $2,8($3)addi $2,$0,49 sw $2,12($3)addi $2,$0,53 #sw $2,16($3)addi $2,$0,49 #sw $2,20($3)addi $2,$0,51 #sw $2,24($3)addi $2,$0,52 #sw $2,28($3)addi $2,$0,54 #sw $2,32($3)addi $2,$0,52 #sw $2,36($3)j main將其導(dǎo)入QtSpim中,選中機(jī)器碼,加上前綴并將最后一行0x08100009修改為0x08000000,代碼如下

4、MEMORY_INITIALIZATION_RADIX=16;MEMORY_INITIALIZATION_VECTOR=20020055,ac620000,20020032,ac620004,20020030,ac620008,20020031,ac62000c,20020035,ac620010,20020031,ac620014,20020033,ac620018,20020034,ac62001c,20020036,ac620020,20020034,ac620024,08000000,保存為.coe文件,在ROM模塊里調(diào)用。2) 數(shù)據(jù)存儲(chǔ)器RAM設(shè)計(jì)新建IP core Generato

5、r,命名為dram。數(shù)據(jù)存儲(chǔ)器為RAM類型的存儲(chǔ)器,并且需要獨(dú)立的讀寫(xiě)信號(hào)控制。因此其對(duì)外的接口為clk、we、datain、addr;輸出信號(hào)為dataout。當(dāng)時(shí)鐘上升沿到來(lái)時(shí),如果寫(xiě)信號(hào)(we)為真,根據(jù)addr所表示的地址找到對(duì)應(yīng)的存儲(chǔ)單元,并將輸入的數(shù)據(jù)(datain)寫(xiě)到對(duì)應(yīng)的存儲(chǔ)單元中;如果寫(xiě)信號(hào)為假,則根據(jù)addr所表示的地址,將對(duì)應(yīng)存儲(chǔ)單元的數(shù)據(jù)送到輸出端(dataout)。在本實(shí)驗(yàn)中調(diào)用ISE提供的IP核進(jìn)行設(shè)計(jì),設(shè)定的數(shù)據(jù)存儲(chǔ)器大小為64字。數(shù)據(jù)存儲(chǔ)器模塊在頂層模塊中被調(diào)用。輸入的時(shí)鐘信號(hào)來(lái)自于頂層模塊的clkin,addr信號(hào)來(lái)自于ALU單元的輸出端(對(duì)基地址與偏移量執(zhí)

6、行加操作),datain來(lái)自于寄存器組的第二個(gè)數(shù)據(jù)輸出端(Rtdata),而控制信號(hào)we則來(lái)自于控制器對(duì)指令的譯碼。輸出數(shù)據(jù)dataout通過(guò)一個(gè)選擇器(MUX3)決定是否寫(xiě)入到相應(yīng)的寄存器。初始化dram值:0x55555555,在以后的仿真過(guò)程中可以用于驗(yàn)證是否正確調(diào)用3) 立即數(shù)符號(hào)擴(kuò)展模塊設(shè)計(jì)對(duì)于I型指令,將指令的低十六位作為立即數(shù)符號(hào)擴(kuò)展模塊的輸入inst15:0,如果十六位立即數(shù)的最高位(即符號(hào)位)為1,則在inst15:15前面補(bǔ)16個(gè)1,如果為0,則在前面補(bǔ)16個(gè)0。然后將符號(hào)擴(kuò)展之后的data31:0通過(guò)一個(gè)選擇器(即MUX2)輸送到ALU單元的第二個(gè)源操作數(shù)輸入端(即inp

7、ut2)。代碼如下:module signext( input 15:0 inst, output 31:0 data );assign data=inst15:15?16'hffff,inst:16'h0000,inst;endmodule4) 寄存器組模塊該模塊的輸入為clk、RegWriteData、RegWriteAddr、RegWriteEn、RsAddr、RtAddr和reset,輸出信號(hào)為RsData和RtData。由于$0一直輸出0,因此當(dāng)RsAddr、RtAddr為0時(shí),RsData以及RtData必須輸出0,否則輸出相應(yīng)地址寄存器數(shù)據(jù)。另外,當(dāng)RegWrit

8、eEn信號(hào)有效時(shí),數(shù)據(jù)應(yīng)該寫(xiě)入RegWriteAddr寄存器,并且每次復(fù)位時(shí)所有寄存器都清零。寄存器組模塊在頂層模塊中被調(diào)用。clk信號(hào)來(lái)自于頂層模塊的clkin,reset信號(hào)來(lái)自于頂層模塊的reset,RegWriteData來(lái)自于ALU單元的運(yùn)算結(jié)果輸出端或者是數(shù)據(jù)存儲(chǔ)器的輸出端(通過(guò)一個(gè)選擇器MUX3進(jìn)行選擇),RegWriteAddr、RsAddr、RtAddr來(lái)自于指令的對(duì)應(yīng)位,RegWriteEn來(lái)自于控制器對(duì)指令的譯碼。輸出信號(hào)Rsdata與Rtdata則分別來(lái)自于Rsaddr與Rtaddr對(duì)應(yīng)的寄存器。代碼如下:module regFile( input clk, input

9、 reset, input 31:0 regWriteData, input 4:0 regWriteAddr, input regWriteEn, output 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

10、(posedge clk)beginif(!reset)beginif(regWriteEn=1)beginregsregWriteAddr=regWriteData;endendelsebeginfor(i=0;i<31;i=i+1)regsi=0;regs31=32'hffffffff;endendendmodule5) 控制器模塊控制器輸入為指令的opCode字段,即操作碼。操作碼經(jīng)過(guò)主控制單元的譯碼,給ALUCtrl、Data Memory、Registers、Muxs等部件輸出正確的控制信號(hào)。該模塊在頂層模塊中被調(diào)用,輸入的opcode來(lái)自于指令的前6位,而輸出信號(hào)al

11、uSrc、MemToReg、RegWrite、MemRead、MemWrite、branch、aluop和jmp則是對(duì)6位opcode的譯碼。代碼如下:module ctr( input 5:0 opCode, output regDst, output aluSrc, output memToReg, output regWrite, output memRead, output memWrite, output branch, output 1:0 aluop, output jmp );reg regDst;reg aluSrc;reg memToReg;reg regWrite;reg

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

13、=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;aluSrc=1;memToReg=0;regWrite=0;memRead=0;memWrite=1;branch=0;aluop=2'b00;jmp=0;end6'b000100:/beqbeginregDst=0;aluSrc=0;memTo

14、Reg=0;regWrite=0;memRead=0;memWrite=0;branch=1;aluop=2'b01;jmp=0;end/6'b001100:/andi6'b001000:/andibeginregDst=0;aluSrc=1;memToReg=0;regWrite=1;memRead=0;memWrite=0;branch=0;/aluop=2'b11;aluop=2'b00;jmp=0;enddefault:beginregDst=0;aluSrc=0;memToReg=0;regWrite=0;memRead=0;memWrite=

15、0;branch=0;aluop=2'b00;jmp=0;endendcaseendendmodule6) 運(yùn)算器(ALU)模塊微處理器支持的add、sub、and、or和slt運(yùn)算指令,需要利用ALU單元實(shí)現(xiàn)運(yùn)算,同時(shí)數(shù)據(jù)存儲(chǔ)指令sw和lw也需要通過(guò)ALU單元計(jì)算存儲(chǔ)器地址,條件跳轉(zhuǎn)指令beq需要ALU來(lái)比較兩個(gè)寄存器是否相等。所有這些指令包含的操作為加、減、與、或和小于設(shè)置5鐘不同的操作。該模塊根據(jù)輸入控制信號(hào)對(duì)輸入數(shù)據(jù)進(jìn)行相應(yīng)的操作,并獲得輸出結(jié)果以及零標(biāo)識(shí),由于MIPS處理器ALU單元利用4根輸入控制信線的譯碼決定執(zhí)行何種操作,于是該操作的輸入接口為input1、input2和

16、aluCtr,輸出端口為zero和aluRes。ALU模塊在頂層模塊被調(diào)用。input1來(lái)自于寄存器組模塊輸出信號(hào)Rsdata,input2來(lái)自于寄存器組模塊輸出信號(hào)Rtdata或者是立即數(shù)符號(hào)擴(kuò)展模塊的輸出信號(hào)(通過(guò)一個(gè)選擇器MUX2進(jìn)行選擇),aluCtr來(lái)自于aluctr模塊的輸出端。aluRes與zero為ALU單元的運(yùn)算結(jié)果,其中zero主要用于beq指令。代碼如下:module ALU( input 31:0 input1, input 31:0 input2, input 3:0 aluCtr, output 31:0 aluRes, output zero );reg zero

17、;reg31:0 aluRes;always (input1 or input2 or aluCtr)begincase(aluCtr)4'b0110:beginaluRes=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(inp

18、ut1<input2)aluRes = 1;enddefault:aluRes = 0;endcaseendendmodule7) ALU控制設(shè)計(jì)MIPS指令中具有6位操作碼,如果為R型指令,進(jìn)一步采用6位功能碼來(lái)表示R型指令的具體操作。由于設(shè)計(jì)的微處理器支持的運(yùn)算類指令全部為R型指令,因此可以通過(guò)對(duì)R型指令的6位功能碼編碼產(chǎn)生ALU的4為控制信號(hào)。但是lw、sw以及beq、j型指令沒(méi)有功能碼,因此需要區(qū)分指令的類型。由于只有三類指令需要ALU單元,因此可以采用兩位二進(jìn)制碼對(duì)指令的ALU操作類型進(jìn)行編碼。指令的ALU操作類型編碼由指令譯碼器產(chǎn)生。通過(guò)2位操作類型碼以及6位指令功能碼就可以

19、產(chǎn)生ALU單元的4位控制信號(hào)。該模塊的主要功能就是根據(jù)譯碼控制單元產(chǎn)生的2位操作碼以及6位功能碼產(chǎn)生4位ALU控制信號(hào),因此輸入信號(hào)為aluop(2位)、funct(6位),輸出信號(hào)為aluctr(4位)。ALU控制模塊在頂層模塊被調(diào)用。aluop來(lái)自于控制器對(duì)指令的6位opcode的譯碼,而funct來(lái)自于指令的后6位。代碼如下: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'b00

20、xxxxxx: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;endcaseendmodule8) 頂層模塊設(shè)計(jì)本次實(shí)驗(yàn)

21、中多路復(fù)用器模塊MUX以及PC模塊綜合在頂層模塊之中,頂層模塊需要將前面的多個(gè)模塊實(shí)例化后,通過(guò)導(dǎo)線以及多路復(fù)用器將各個(gè)部件連接起來(lái),并且在時(shí)鐘的控制下修改PC的值,PC是一個(gè)32位的寄存器,每個(gè)時(shí)鐘沿自動(dòng)增加4。多路復(fù)用器MUX直接通過(guò)三目運(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,m

22、ux4,mux5,address,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

23、;/wireforextwire31: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),.aluo

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

25、(.RsAddr(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

26、?memreaddata: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;endmodule3、 各模塊仿真1) 寄存器組仿真代碼如下:module regFile( input clk, input reset, input 31:0 regW

27、riteData, input 4:0 regWriteAddr, input regWriteEn, output 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=regWriteData;endendelsebeginfor(i=0;i<31;i=i+1)regsi=0;

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論