




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、一、 實驗?zāi)康?. 了解微處理器的基本結(jié)構(gòu)。2. 掌握哈佛結(jié)構(gòu)的計算機工作原理。3. 學會設(shè)計簡單的微處理器。4. 了解軟件控制硬件工作的基本原理。二、 實驗任務(wù)利用HDL語言,基于Xilinx FPGA nexys4實驗平臺,設(shè)計一個能夠執(zhí)行以下MIPS指令集的單周期類MIPS處理器,要求完成所有支持指令的功能仿真,驗證指令執(zhí)行的正確性,要求編寫匯編程序?qū)⒈救藢W號的ASCII碼存入RAM的連續(xù)內(nèi)存區(qū)域。(1)支持基本的算術(shù)邏輯運算如add,sub,and,or,slt,andi指令(2)支持基本的內(nèi)存操作如lw,sw指令(3)支持基本的程序控制如beq,j指令三、 實驗過程1、 建立工程在I
2、SE 14.7軟件中建立名為Lab1 的工程文件。芯片系列選擇Artix7,具體芯片型號選擇XC7A100T,封裝類型選擇CSG324,速度信息選擇-1。2、 分模塊設(shè)計1) 指令存儲器ROM設(shè)計新建IP core Generator,命名為irom。設(shè)定的指令存儲器大小為128字,指令存儲器模塊在頂層模塊中被調(diào)用。輸入為指令指針(PC)與時鐘信號(clkin),輸出為32位的機器指令,并將輸出的機器指令送到后續(xù)的寄存器組模塊、控制器模塊、立即數(shù)符號擴展模塊進行相應(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中,選中機器碼,加上前綴并將最后一行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ù)存儲器RAM設(shè)計新建IP core Generato
5、r,命名為dram。數(shù)據(jù)存儲器為RAM類型的存儲器,并且需要獨立的讀寫信號控制。因此其對外的接口為clk、we、datain、addr;輸出信號為dataout。當時鐘上升沿到來時,如果寫信號(we)為真,根據(jù)addr所表示的地址找到對應(yīng)的存儲單元,并將輸入的數(shù)據(jù)(datain)寫到對應(yīng)的存儲單元中;如果寫信號為假,則根據(jù)addr所表示的地址,將對應(yīng)存儲單元的數(shù)據(jù)送到輸出端(dataout)。在本實驗中調(diào)用ISE提供的IP核進行設(shè)計,設(shè)定的數(shù)據(jù)存儲器大小為64字。數(shù)據(jù)存儲器模塊在頂層模塊中被調(diào)用。輸入的時鐘信號來自于頂層模塊的clkin,addr信號來自于ALU單元的輸出端(對基地址與偏移量執(zhí)
6、行加操作),datain來自于寄存器組的第二個數(shù)據(jù)輸出端(Rtdata),而控制信號we則來自于控制器對指令的譯碼。輸出數(shù)據(jù)dataout通過一個選擇器(MUX3)決定是否寫入到相應(yīng)的寄存器。初始化dram值:0x55555555,在以后的仿真過程中可以用于驗證是否正確調(diào)用3) 立即數(shù)符號擴展模塊設(shè)計對于I型指令,將指令的低十六位作為立即數(shù)符號擴展模塊的輸入inst15:0,如果十六位立即數(shù)的最高位(即符號位)為1,則在inst15:15前面補16個1,如果為0,則在前面補16個0。然后將符號擴展之后的data31:0通過一個選擇器(即MUX2)輸送到ALU單元的第二個源操作數(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,輸出信號為RsData和RtData。由于$0一直輸出0,因此當RsAddr、RtAddr為0時,RsData以及RtData必須輸出0,否則輸出相應(yīng)地址寄存器數(shù)據(jù)。另外,當RegWrit
8、eEn信號有效時,數(shù)據(jù)應(yīng)該寫入RegWriteAddr寄存器,并且每次復(fù)位時所有寄存器都清零。寄存器組模塊在頂層模塊中被調(diào)用。clk信號來自于頂層模塊的clkin,reset信號來自于頂層模塊的reset,RegWriteData來自于ALU單元的運算結(jié)果輸出端或者是數(shù)據(jù)存儲器的輸出端(通過一個選擇器MUX3進行選擇),RegWriteAddr、RsAddr、RtAddr來自于指令的對應(yīng)位,RegWriteEn來自于控制器對指令的譯碼。輸出信號Rsdata與Rtdata則分別來自于Rsaddr與Rtaddr對應(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)過主控制單元的譯碼,給ALUCtrl、Data Memory、Registers、Muxs等部件輸出正確的控制信號。該模塊在頂層模塊中被調(diào)用,輸入的opcode來自于指令的前6位,而輸出信號al
11、uSrc、MemToReg、RegWrite、MemRead、MemWrite、branch、aluop和jmp則是對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) 運算器(ALU)模塊微處理器支持的add、sub、and、or和slt運算指令,需要利用ALU單元實現(xiàn)運算,同時數(shù)據(jù)存儲指令sw和lw也需要通過ALU單元計算存儲器地址,條件跳轉(zhuǎn)指令beq需要ALU來比較兩個寄存器是否相等。所有這些指令包含的操作為加、減、與、或和小于設(shè)置5鐘不同的操作。該模塊根據(jù)輸入控制信號對輸入數(shù)據(jù)進行相應(yīng)的操作,并獲得輸出結(jié)果以及零標識,由于MIPS處理器ALU單元利用4根輸入控制信線的譯碼決定執(zhí)行何種操作,于是該操作的輸入接口為input1、input2和
16、aluCtr,輸出端口為zero和aluRes。ALU模塊在頂層模塊被調(diào)用。input1來自于寄存器組模塊輸出信號Rsdata,input2來自于寄存器組模塊輸出信號Rtdata或者是立即數(shù)符號擴展模塊的輸出信號(通過一個選擇器MUX2進行選擇),aluCtr來自于aluctr模塊的輸出端。aluRes與zero為ALU單元的運算結(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è)計MIPS指令中具有6位操作碼,如果為R型指令,進一步采用6位功能碼來表示R型指令的具體操作。由于設(shè)計的微處理器支持的運算類指令全部為R型指令,因此可以通過對R型指令的6位功能碼編碼產(chǎn)生ALU的4為控制信號。但是lw、sw以及beq、j型指令沒有功能碼,因此需要區(qū)分指令的類型。由于只有三類指令需要ALU單元,因此可以采用兩位二進制碼對指令的ALU操作類型進行編碼。指令的ALU操作類型編碼由指令譯碼器產(chǎn)生。通過2位操作類型碼以及6位指令功能碼就可以
19、產(chǎn)生ALU單元的4位控制信號。該模塊的主要功能就是根據(jù)譯碼控制單元產(chǎn)生的2位操作碼以及6位功能碼產(chǎn)生4位ALU控制信號,因此輸入信號為aluop(2位)、funct(6位),輸出信號為aluctr(4位)。ALU控制模塊在頂層模塊被調(diào)用。aluop來自于控制器對指令的6位opcode的譯碼,而funct來自于指令的后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è)計本次實驗
21、中多路復(fù)用器模塊MUX以及PC模塊綜合在頂層模塊之中,頂層模塊需要將前面的多個模塊實例化后,通過導(dǎo)線以及多路復(fù)用器將各個部件連接起來,并且在時鐘的控制下修改PC的值,PC是一個32位的寄存器,每個時鐘沿自動增加4。多路復(fù)用器MUX直接通過三目運算符實現(xiàn),例如assign OUT = SEL ? INPUT1 : INPUT2;其中,OUT、SEL、INPUT1和INPUT2都是預(yù)先定義的信號。代碼如下: 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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 四川電力職業(yè)技術(shù)學院《衛(wèi)生法4》2023-2024學年第二學期期末試卷
- 商丘職業(yè)技術(shù)學院《計算機視覺基礎(chǔ)》2023-2024學年第二學期期末試卷
- 山東體育學院《數(shù)字測圖原理與方法A》2023-2024學年第二學期期末試卷
- 大連大學《臨床中藥學2》2023-2024學年第二學期期末試卷
- 湖北民族大學《特殊教育管理學》2023-2024學年第二學期期末試卷
- 寧波幼兒師范高等??茖W?!稒C械制造工藝基礎(chǔ)》2023-2024學年第二學期期末試卷
- 成都醫(yī)學院《聚合物基復(fù)合材料》2023-2024學年第二學期期末試卷
- 重慶工貿(mào)職業(yè)技術(shù)學院《物理課程標準與教材研讀》2023-2024學年第二學期期末試卷
- 四川藝術(shù)職業(yè)學院《教育改革》2023-2024學年第二學期期末試卷
- 天津理工大學中環(huán)信息學院《雷達原理與系統(tǒng)》2023-2024學年第二學期期末試卷
- 骨傷科常見疾病中醫(yī)診療規(guī)范診療指南2023版
- 省級一網(wǎng)統(tǒng)管網(wǎng)格化社會治理指揮手冊(含事項清單)
- 四川省成都市青羊區(qū)2024年四年級數(shù)學第二學期期末調(diào)研試題含解析
- 輸液反應(yīng)的應(yīng)急預(yù)案及處理流程課件
- 水稻工廠化育秧技術(shù)規(guī)程
- 污水處理設(shè)備運行記錄臺賬
- 2024年合肥市蜀山區(qū)中考二模英語試題含答案
- 抖音團購培訓
- (古詩對比閱讀)《登幽州臺歌》與《登飛來峰》聯(lián)讀設(shè)計2022
- 影視特效與欄目包裝智慧樹知到期末考試答案2024年
- 如何有效地開展集體備課
評論
0/150
提交評論