Lab5實驗報告_第1頁
Lab5實驗報告_第2頁
Lab5實驗報告_第3頁
Lab5實驗報告_第4頁
Lab5實驗報告_第5頁
已閱讀5頁,還剩13頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、計算機組成體系結構實驗報告簡單的類MIPS單周期處理器實現SJTU | F0905103LAB5實驗報告王紅賓 50905190612012目錄1實驗概述11.1實驗名稱11.2 實驗目的11.3實驗范圍11.4注意事項12新建工程,導入文件12.1實驗描述12.1.1新建工程13頂層模塊TOP33.1實驗描述33.1.1模塊描述43.1.2新建模塊源文件Top41.3定義信號線53.1.4程序計數器PC53.1.5 RESET53.1.6模塊實例化,連接模塊63.1.7連接其他信號線74仿真84.1編寫二進制測試程序84.2系統任務$readmemb和$readmemh9

2、4.3其他常用系統任務104.4 testbench文件114.5仿真樣例125 實驗程序131實驗概述1.1實驗名稱簡單的類MIPS單周期處理器實現 整體調試1.2 實驗目的完成單周期的類mips處理器1.3實驗范圍本次實驗將覆蓋以下范圍 1ISE的使用2Xilinx Spartan 3E實驗板的使用3使用VerilogHDL進行邏輯設計1.4注意事項1. 本實驗的邏輯設計工具為Xilinx ISE11.1。2新建工程,導入文件 2.1實驗描述 2.1.1新建工程1 啟動ISE 11.1。2 選擇File > New Project 出現New Project Wizard。3 Pro

3、ject Name填寫lab5,選擇工程Project Location,Top-level Source Type選擇HDL。點擊Next。4. Device Properties 中各屬性填寫如下: Product Category: ALL Family: Spartan3E Device: XC3S500E Package: FG320 Speed: -4 Synthesis Tool: XST(VHDL/Verilog)Simulator: ISim (VHDL/Verilog) ,也可用Modelsim仿真。Preferred Language: Verilog 確認Enable

4、Enhanced Design Summary 已勾選 5. 點擊Next 6. 在New Project Wizard Create New Source中點擊Next 7. 在 New Project Wizard Add Existing Sources中點擊Next 8. 在New Project Wizard Project Summary中點擊Finish,結束建立工程9. 將此前兩次實驗中的模塊文件(*.v)拷貝到lab5工程目錄下10. 添加源文件:新建文件命令:菜單欄 - Project Add Source 或:Sources窗口中,設備名(xc3s500e-4fg320或

5、類似)上右鍵鼠標,彈出菜單中點擊Add Source 11. Adding Source Files 中,選中全部要添加的文件, 保持默認項,點OK。3頂層模塊TOP 3.1實驗描述聯合調試單周期類mips處理器。3.1.1模塊描述3.1.2新建模塊源文件Top 1.3定義信號線為top模塊內的每一根/組連接信號線命名,并在top模塊中聲明定義它們。例如,主控制模塊輸出端口上的連線: 3.1.4程序計數器PC 程序計數器是這個簡單CPU能夠跑起來的關鍵。定義一個32位reg類型PC,在時鐘上升沿(下降沿已經被我們用作寄存器的寫了)做PC<=PC+4。實驗中Top.v文件對程序計數器的定義

6、如下:PC reg 31:0 PC;注:簡單的講,在組合邏輯中用阻塞賦值“=”,時序邏輯中用非阻塞賦值“<=”。兩者綜合出來的電路不一樣,具體區別查閱參考書。時序邏輯和組合邏輯不要放在同一個always塊中。3.1.5 RESET PC置0x00000000,各寄存器清零,這是reset要做的工作。同步或異步,邊沿或電平,同學們可以自由實現。寄存器清零,所以要適當修改上次實驗的registerFile模塊,給模塊添加reset信號。注:添加reset要注意,寫在原來“寫”的always塊中。假如新加一個always塊,當個兩個“寫”always同時滿足時,就混亂不知賦什么值了。3.1.6

7、模塊實例化,連接模塊實例化前兩次實驗中編寫的模塊,實例化的過程中連接模塊的端口。實例化有以下兩種方法: 1. 嚴格按照模塊定義的端口順序來連接,不用表明原模塊定義時規定的端口名: 模塊 模塊名(連接端口1信號名,連接端口信號名2) 2. 在連接時用“.”符號,表明原模塊是定義時規定的端口名: 模塊 模塊名(.端口1名(信號1), .端口2 名(信號2) ) 推薦用第2種實例化方法。以主控制模塊為例,以下代碼實例化一個Ctr:mainCtr。并連接其端口。INST是定義好的指令存儲器輸出的連接信號,其他信號線我們在3.1.3中已定義。實例化CtrCtr模塊定義實驗中Top.v文件對alu模塊的定

8、義如下:alu mainalu (.input1(READ_DATA1), .input2(INPUT_2), .aluctr(ALU_CTR), .zero(ZERO), .alures(ALU_RES);實驗中Top.v文件對aluctr模塊的定義如下:aluctr mainaluctr (.aluop(ALU_OP), .funct(INST5:0), .aluctr(ALU_CTR);實驗中Top.v文件對data_memory模塊的定義如下:data_memory mainmemory (.reset(reset), .clock_in(mlk), .address(ALU_RES)

9、, .writedata(READ_DATA2), .memwirte(MEM_WRITE), .memread(MEM_READ), .readdata(READ_DATA);實驗中Top.v文件對mainregister模塊的定義如下:register mainregister (.clock_in(mlk), .readreg1(INST25:21), .readreg2(INST20:16), .reset(reset), .writereg(WRITE_REG), .writedata(WRITE_DATA), .regwrite(REG_WRITE), .readdata1(REA

10、D_DATA1), .readdata2(READ_DATA2);實驗中Top.v文件對mainsignext模塊的定義如下:signext mainsignext (.inst(INST15:0), .data(EXTENDED_DATA);3.1.7連接其他信號線1. MUX Mux已經在前幾次實驗中提到,實現很簡單,一個三目運算符Assign OUT = SEL ? INPUT1 : INPUT2; OUT, SEL, INPUT1, INPUT2都是預先定義的信號。2. 左移兩位,用移位運算符:左移(“<<”),右移(“>>”) 3. 加法器,直接用無符號加法運

11、算。 注:verilog中寄存器類型被解釋成無符號數,整數類型(integer)被解釋成二進制補碼形式的有符號數。因此要綜合成無符號算術算符需要使用寄存器類型,而要得到有符號算術算符就需要使用整數。網線類型被解釋成無符號數。4. 與門,使用位運算符&(位與)。注意&和&&的區別。實驗中Top.v文件對信號線的連接如下:assign WRITE_REG=REG_DST?INST15:11:INST20:16;assign INPUT_2=ALU_SRC?EXTENDED_DATA:READ_DATA2;assign WRITE_DATA=MEM_TO_REG?RE

12、AD_DATA:ALU_RES;assign JUMP_ADDRESS=(INST & 32'b00000011111111111111111111111111)<<2)|(PC+4) & 32'b11110000000000000000000000000000);assign ADD_RES=(PC+4)+(EXTENDED_DATA<<2);assign MUX_RES=(BRANCH & ZERO)?ADD_RES:(PC+4);assign MUX_RES2=JUMP?JUMP_ADDRESS:MUX_RES;4仿真4.1

13、編寫二進制測試程序 請編寫自己的測試匯編。下面提供一個簡易匯編器供參考。 一些相關的基本知識: 指令格式: Mips 基本指令格式匯編格式:注意匯編中寄存器的順序跟指令格式中的不一樣 add $1,$2,$3 :$1=$2 + $3 sub $1,$2,$3 :$1=$2 - $3 and $1,$2,$3 :$1=$2 & $3 or $1,$2,$3 :$1=$2 | $3 slt $1,$2,$3 :if($2<$3) $1=1 else $1=0 lw $1,10($2) :$1=memory$2+10 sw $1,10($2) :memory$2+10=$1 beq $

14、1,$2,10 :if($1=$2) goto PC+4+40 10是PC+4后的指令間隔數,故為PC+4+40 j 10000 :goto 100004.2系統任務$readmemb和$readmemh放在initial初始化塊中。Verilog中這兩個系統任務用來從文件中讀取數據到存儲器中,格式如下: $readmemx(“datafile”, memoryName); $readmemx(“datafile”, memoryName, startAddr); $readmemx(“datafile”, memoryName, startAddr, endAddr); 這里給出mem_da

15、ta和mem_inst兩個樣例文件,分別用來裝入data memory和instruction memory。mem_data mem_inst另外,還可以直接在Top.v文件中對數據進行初始化,如下:InstMemFile0=8'b00001000;InstMemFile1=8'b00000000;InstMemFile2=8'b00000000;InstMemFile3=8'b00000100;InstMemFile4=8'b10001100;InstMemFile5=8'b00000001;InstMemFile6=8'b00000

16、001;InstMemFile7=8'b00010100;InstMemFile8=8'b10001100;InstMemFile9=8'b00000010;InstMemFile10=8'b00000001;InstMemFile11=8'b00001000;InstMemFile12=8'b00000000;InstMemFile13=8'b00100010;InstMemFile14=8'b10011000;InstMemFile15=8'b00100000;InstMemFile16=8'b00000000

17、;InstMemFile17=8'b00100010;InstMemFile18=8'b00100000;InstMemFile19=8'b00100010;4.3其他常用系統任務 $monitor 提供監控和輸出參數列表中的表達式或變量值的功能。如$monitor(“rxd=%b”, rxb); $time 返回當前仿真時刻值。如$monitor($time); 4.4 testbench文件整個處理器設計基本完成后,編輯testbench文件,進行仿真測試: 1) 初始化data memory、instruction memory和register三大存儲模塊,這里

18、僅以初始化data memory為例說明,其它類推。該memory用于存儲二進制代碼。如下圖,Verilog中調用了系統任務$readmemh將mem_data文件中的數據讀入到memFile數組中。或按需要都添加到top中的initial塊里,如下: 2) 編寫Top層的testbench文件,定義文件名為Top_tb,在左側欄中選擇Verilog Test Fixture,選擇Top模塊。自動生成Top_tb測試文件。3) 按需要添加時鐘激勵和其他輸入信號的初始化等。 4) 添加register模塊中的regfile 寄存器數組到仿真波形窗口,觀察各個寄存器的變化情況。5) 在Consol

19、e窗口中輸入restart和run 2000ns命令,重新進行仿真。觀察仿真波形與你提供的MIPS指令結果進行對比。4.5仿真樣例下面給出一個仿真樣例:5 實驗程序/Top.vmodule top(clk,reset,PC); input clk; input reset; output reg 31:0 PC; wire 31:0 INST; wire 4:0 OUT1; wire 31:0 OUT2; wire 31:0 OUT3; wire 31:0 OUT4; wire 31:0 OUT5; wire 3:0 ALU_CTR; wire ZERO; wire 31:0 ALU_RES;

20、 wire 1:0 ALU_OP; wire REG_DST, JUMP, BRANCH, MEM_READ, MEM_TO_REG, MEM_WRITE, ALU_SRC, REG_WRITE; wire 31:0 READ_DATA; wire 31:0 READ_DATA1; wire 31:0 READ_DATA2; wire 31:0 DATA; initial begin PC=0; endctr mainctr(.opcode(INST31:26),.regdst(REG_DST),.alusrc(ALU_SRC),.memtoreg(MEM_TO_REG),.regwrite(

21、REG_WRITE),.memread(MEM_READ),.memwrite(MEM_WRITE),.branch(BRANCH),.aluop(ALU_OP),.jump(JUMP);alu mainalu(.input1(READ_DATA1),.input2(OUT2),.aluctr(ALU_CTR),.reset(reset),.zero(ZERO),.alures(ALU_RES);aluctr mainaluctr(.aluop(ALU_OP),.funct(INST5:0),.reset(reset),.aluctr(ALU_CTR);data_memory mainmemo

22、ry(.reset(reset),.clock_in(clk),.address(ALU_RES),.writedata(READ_DATA2),.memwrite(MEM_WRITE),.memread(MEM_READ),.readdata(READ_DATA);register mainregister(.clock_in(clk),.readreg1(INST25:21),.readreg2(INST20:16),.reset(reset),.writereg(OUT1),.writedata(OUT3),.regwrite(REG_WRITE),.readdata1(READ_DATA1),.readdata2(READ_DATA2);signext mainsignext(.inst(INST15:0),.data(DATA),.reset(reset);inst_mem maininst(.readaddress(PC),.reset(reset),.inst(INST);assign OUT1=REG_DST?INST15:11:INST20:16;assign OUT2=ALU_SRC?DATA:READ_DATA2;assign OUT3=MEM_TO_REG?

溫馨提示

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

評論

0/150

提交評論