計算機組成原理-實驗四-寄存器堆設計實驗_第1頁
計算機組成原理-實驗四-寄存器堆設計實驗_第2頁
計算機組成原理-實驗四-寄存器堆設計實驗_第3頁
計算機組成原理-實驗四-寄存器堆設計實驗_第4頁
計算機組成原理-實驗四-寄存器堆設計實驗_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

計算機組成原理-實驗四-寄存器堆設計實驗實驗內容與原理:CPU內部通常包含若?個通?寄存器,以暫存參加運算的數(shù)據(jù)和中間結果。寄存器速度快,個數(shù)少,但是RISCCPU的設計強調設置?量的寄存器。例如,Intel80x86系列CPU中只有8個寄存器,?SPARCRISCCPU中卻有120個寄存器。MISPCPU中有32個32位的寄存器堆。所謂寄存器堆,就是?個寄存器的集合,為?便訪問其中的寄存器,對寄存器堆中的寄存器進?統(tǒng)?編碼,稱為寄存器號或者寄存器地址,每個寄存器均通過制定寄存器好進?訪問。本實驗要求設計?個32*32位的寄存器堆,即含有32個寄存器,每個寄存器32位。該寄存器堆有2個讀端?、1個寫端?,即能夠同時讀出2個寄存器的值,寫?1個寄存器。讀操作不需要時鐘控制,寫操作需要在上跳沿才能寫?。其他具體實驗內容參考計算機組成原理實驗指導書。程序模塊結構圖:ALU運算器模塊代碼:`timescale1ns/1ps//ALU模塊moduleALU(OP,A,B,F,ZF,CF,OF,SF,PF);parameterSIZE=32;//運算位數(shù)input[3:0]OP;//運算操作input[SIZE:1]A;//左運算數(shù)input[SIZE:1]B;//右運算數(shù)output[SIZE:1]F;//運算結果outputZF,//0標志位,運算結果為0(全零)則置1,否則置0CF,//進借位標志位,取最?位進位C,加法時C=1則CF=1表?有進位,減法時C=0則CF=1表?有借位OF,//溢出標志位,對有符號數(shù)運算有意義,溢出則OF=1,否則為0SF,//符號標志位,與F的最?位相同PF;//奇偶標志位,F(xiàn)有奇數(shù)個1,則PF=1,否則為0reg[SIZE:1]F;regC,ZF,CF,OF,SF,PF;//C為最?位進位always@(*)beginC=0;case(OP)4'b0000:beginF=A&B;end//按位與4'b0001:beginF=A|B;end//按位或4'b0010:beginF=A^B;end//按位異或4'b0011:beginF=~(A|B);end//按位或?4'b0100:begin{C,F}=A+B;end//加法4'b0101:begin{C,F}=A-B;end//減法4'b0110:beginF=A<B;end//A<B則F=1,否則F=04'b0111:beginF=B<<A;end//將B左移A位endcaseZF=F==0;//F全為0,則ZF=1CF=C;//進位借位標志OF=A[SIZE]^B[SIZE]^F[SIZE]^C;//溢出標志公式SF=F[SIZE];//符號標志,取F的最?位PF=~^F;//奇偶標志,F(xiàn)有奇數(shù)個1,則F=1;偶數(shù)個1,則F=0endendmodule寄存器堆模塊代碼:`timescale1ns/1ps//寄存器堆模塊moduleRegFile(Clk,Clr,Write_Reg,R_Addr_A,R_Addr_B,W_Addr,W_Data,R_Data_A,R_Data_B);parameterADDR=5;//寄存器編碼/地址位寬parameterNUMB=1<<ADDR;//寄存器個數(shù)parameterSIZE=32;//寄存器數(shù)據(jù)位寬inputClk;//寫?時鐘信號inputClr;//清零信號inputWrite_Reg;//寫控制信號input[ADDR:1]R_Addr_A;//A端?讀寄存器地址input[ADDR:1]R_Addr_B;//B端?讀寄存器地址input[ADDR:1]W_Addr;//寫寄存器地址input[SIZE:1]W_Data;//寫?數(shù)據(jù)output[SIZE:1]R_Data_A;//A端?讀出數(shù)據(jù)output[SIZE:1]R_Data_B;//B端?讀出數(shù)據(jù)reg[SIZE:1]REG_Files[0:NUMB-1];//寄存器堆本體integeri;//?于遍歷NUMB個寄存器initial//初始化NUMB個寄存器,全為0for(i=0;i<NUMB;i=i+1)REG_Files[i]<=0;always@(posedgeClkorposedgeClr)//時鐘信號或清零信號上升沿beginif(Clr)//清零for(i=0;i<NUMB;i=i+1)REG_Files[i]<=0;else//不清零,檢測寫控制,?電平則寫?寄存器if(Write_Reg)REG_Files[W_Addr]<=W_Data;end//讀操作沒有使能或時鐘信號控制,使?數(shù)據(jù)流建模(組合邏輯電路,讀不需要時鐘控制)assignR_Data_A=REG_Files[R_Addr_A];assignR_Data_B=REG_Files[R_Addr_B];endmodule頂層綜合模塊:`timescale1ns/1ps//寄存器堆+ALU組合模塊moduleRF_ALU(Clk,Clr,Write_Reg,Write_Select,//控制信號R_Addr_A,R_Addr_B,W_Addr,//讀寫地址Input_Data,R_Data_A,R_Data_B,//數(shù)據(jù)IOOP,ZF,CF,OF,SF,PF,F//ALU運算);parameterADDR=5;//地址位寬parameterSIZE=32;//數(shù)據(jù)位寬//寄存器堆inputClk,Clr;//寫?時鐘信號,清零信號inputWrite_Reg;//寫控制信號input[ADDR:1]R_Addr_A;//A讀端?寄存器地址input[ADDR:1]R_Addr_B;//B讀端?寄存器地址input[ADDR:1]W_Addr;//寫寄存器地址input[SIZE:1]Input_Data;//外部輸?數(shù)據(jù)output[SIZE:1]R_Data_A;//A端?讀出數(shù)據(jù)output[SIZE:1]R_Data_B;//B端?讀出數(shù)據(jù)//ALUinput[3:0]OP;//運算符編碼outputZF,//零標志CF,//進借位標志(只對?符號數(shù)運算有意義)OF,//溢出標志(只對有符號數(shù)運算有意義)SF,//符號標志(只對有符號數(shù)運算有意義)PF;//奇偶標志output[SIZE:1]F;//運算結果FinputWrite_Select;//寫?數(shù)據(jù)選擇信號wire[SIZE:1]ALU_F;//ALU運算結果中間變量wire[SIZE:1]W_Data;//寫?數(shù)據(jù)//Write_Select?電平則寫外部輸?,否則寫運算結果assignW_Data=Write_Select?Input_Data:ALU_F;assignF=ALU_F;//輸出運算結果F//實例化寄存器堆模塊RegFileRF_Test(//輸?.Clk(Clk),//時鐘信號.Clr(Clr),//清零信號.Write_Reg(Write_Reg),//寫?控制.R_Addr_A(R_Addr_A),//A端?讀地址.R_Addr_B(R_Addr_B),//B端?讀地址.W_Addr(W_Addr),//寫?地址.W_Data(W_Data),//寫?數(shù)據(jù),由外部或ALU輸?//輸出.R_Data_A(R_Data_A),//A端?讀出數(shù)據(jù).R_Data_B(R_Data_B)//B端?讀出數(shù)據(jù));//實例化ALU模塊ALUALU_Test(//輸?.OP(OP),//運算符.A(R_Data_A),//從寄存器讀A操作數(shù).B(R_Data_B),//從寄存器讀B操作數(shù).F(ALU_F),//ALU_F作為中間變量暫存運算結果,與Input_Data選擇輸?寄存器//輸出.ZF(ZF),//零標志.CF(CF),//進借位標志(只對?符號數(shù)運算有意義).OF(OF),//溢出標志(只對有符號數(shù)運算有意義).SF(SF),//符號標志(只對有符號數(shù)運算有意義).PF(PF)//奇偶標志);endmodule測試模塊代碼:`timescale1ns/1psmoduleTest();regClk,Clr,Write_Reg,Write_Select;reg[4:0]R_Addr_A,R_Addr_B,W_Addr;reg[31:0]Input_Data;reg[3:0]OP;wire[31:0]R_Data_A,R_Data_B,F;wireZF,CF,OF,SF,PF;initialbeginClr=0;//不清零Write_Reg=1;//寫進去之后讀讀看R_Addr_A=5'b00000;//A端?先讀寄存器0R_Addr_B=5'b00001;//B端?先讀寄存器1OP=4'b0101;//先做?個減法運算Write_Select=1'b1;//先寫外部輸?//將32'h7fff_fffd寫?寄存器0,作為左操作數(shù)Input_Data=32'h7fff_fffd;W_Addr=5'b00000;Clk=0;#50;Clk=1;#50;//將32'h7fff_ffff寫?寄存器0,作為右操作數(shù)Input_Data=32'h7fff_ffff;W_Addr=5'b00001;Clk=0;#50;Clk=1;#50;Write_Select=1'b0;//改為寫?運算結果R_Addr_B=5'b00010;//B端?改為讀寄存器2//將ALU的運算結果寫?寄存器,并讀讀看W_Addr=5'b00010;Clk=0;#50;Clk=1;#50;//到此為?我們完成了?次減法運算//(其實不是(ALU實時運算),實際上ALU已經(jīng)做了5次減法)//左右操作數(shù)跟運算結果依次寫?了寄存器0,1,2end//實例化寄存器堆模塊RF_ALURF_Test(.Clk(Clk),.Clr(Clr),.Write_Reg(Write_Reg),.Write_Select(Write_Select),.R_Addr_A(R_Addr_A),.R_Addr_B(R_Addr_B),.W_Addr(W_Addr),.Input_Data(Input_Data),.R_Data_A(R_Data_A),.R_Data_B(R_Data_B),.OP

溫馨提示

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

評論

0/150

提交評論