數電-cpu設計精簡指令集RISC32位單周期_第1頁
數電-cpu設計精簡指令集RISC32位單周期_第2頁
數電-cpu設計精簡指令集RISC32位單周期_第3頁
數電-cpu設計精簡指令集RISC32位單周期_第4頁
數電-cpu設計精簡指令集RISC32位單周期_第5頁
已閱讀5頁,還剩23頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

精簡指令集(RISC)32位單周cpu設電氣513CPUCPUCPU

010123 S

ASADoADoSe<< 總體電寄存器堆(RegisterFiles)、取指電路及相關基礎部件(如選擇器)等構成。MIPS指令格R

26 21I

26 21 16 J

26 R[10:I設置JJRop0func指定。rsrt是源寄存器號,rd是目的寄sa指定移位位數。I1632位,依指令的不同需進行零擴展J26數據路徑設下一條指令地址的選42位的和;j262PC+4的4位拼接在一起。3-34012A3Be在圖3-3中控制器(ControlUnit)根據op、funczero(對于beqbne指令)信pcsource。ALU的輸入ALU2個:AB輸入端。A、B2種輸入情況。對于A輸入端,有寄存器堆的A_data和移位數sa輸入。對于B輸入端,有寄存器堆的B_dataimm3-4所示ABeAB3-4ALUALUA、B端具體輸入哪路數據由控制器(ControlUnit)根據指令譯碼產生控shiftaluimm來選擇。寄存器堆的輸入A_addrB_addr的輸入來自指令,分別只有一種輸入,W_addrData43-5ABABfAreget、jalm2reg來選擇。在圖3-5中模塊f的輸入為5位的寄存器號reg_dest和jalW_addrVerilogHDL語句為:AssignW_addr=reg_dest|基本功能部件的設計與實在本實驗中基本功能部件主要有:3221多路選擇器、3241器、521多路選擇器、D32位加/3221選擇器的設計與CPU的重要部件。32214-1所示。

Sel=0:O=ASel=1:O=moduleinputmoduleinput[31:0]input[31:0]B, output[31:0]OassignO=Sel?B:A;

4-132214-9MUX32_2_13241選擇器的設計與32414-18MUMU

Sel[1:0]=00:O=Sel[1:0]=01:O=BSel[1:0]=10:O=

Sel[1:0]=11:O=4-183241324132213241modulemoduleinput[31:0]input[31:0]input[31:0]input[31:0]input[1:0]Sel,output[31:0]OassignO=(Sel==2'b00)?A:(Sel==2'b01)?B:(Sel==2'b10)?C:D; 521選擇器的設計與實5214-19

Sel=0:O=ASel=1:O=4-195215213221521modulemoduleinput[4:0]input[4:0]B,inputSel,output[4:0]OassignO=Sel?B:A;帶有異步清零的32D觸發器的設計與實3221選擇Verilog實現代碼:modulemoduleinput[31:0]D, outputreg[31:0]Qalways@(posedgeClockornegedgeReset)beginif(Reset==0)Q<=0; Q<=移位器的3221Verilogmodulemoduleinput[31:0]input[4:0]Sa, outputreg[31:0]Oalways@(*)if(!Right) O=D<<Sa;elseif(!Arith)O=D>> O=$signed(D)>>>Sa;32位加/減法器的設計與實32位加/32位的加法/A

A(B)

ABVerilogmodulemoduleinput[31:0]input[31:0]B, output[31:0]Resultcla32cla32as32(A,B^{32{sub}},sub,moduleinput[31:0]input[31:0]b, output[31:0]sassigns=a+b+c;運算器(ALU)的設計與實運算器ALU是CPU組成的部件之一,其實現方法主要有2種:一種是以加法5-15-1:ALULui(設置ALU5-15-1

A:操作數,32

5-1ALU

B:操作數,32Zero:零標志,1位;當運算結010;NewSource命令,選VerilogModule輸入,并輸入Verilog文件名:ALU,單擊Next按鈕進入端口定義對ALUVerilog程序參考代碼:modulemoduleinput[31:0]input[31:0]input[3:0]output[31:0]Result, wire[31:0]d_and=A&B;wire[31:0]d_or=A|B;wire[31:0]d_xor=A^wire[31:0]d_lui=wire[31:0]d_and_or=ALU_Operation[2]?d_or:d_and;wire[31:0]d_xor_lui=ALU_Operation[2]?d_lui:d_xor;wire[31:0]d_as,d_sh;addsub32as32(A,B,ALU_Operation[2],d_as);Shiftershift_1(B,A[4:0],ALU_Operation[2],ALU_Operation[3],d_sh);MUX32_4_1sel(d_as,d_and_or,d_xor_lui,d_sh,ALU_Operation[1:0],assignZero=~|Result;寄存器堆(RegisterFile)的設計與實6-1所示。

6-1RegisterFile6-11個數據輸入端口,2個數據輸出端口,因此可以從該寄存器組中同時輸出2個數據由于沒有設置讀信號故在本實驗中當A_addr(或B_addr)0時,并不是選擇輸出Register0的內容,而是直接輸出06-1中各信號引腳的功A_addr:A輸出端口地址,5B_addr:B輸出端口地址,5W_addr:數據寫入的寄存器號,5Write:寫信號,1Data:數據,32A_data:A端口的輸出數據,32B_data:B端口的輸出數據,32ClockNewSource命令,選ModuleName欄輸入模塊名:RegFileNextFinishRegisterFilesVerilog module input[4:0]A_addr,input[4:0]B_addr,input[4:0]W_addr,input[31:0]Data, output[31:0]A_data,output[31:0]reg[31:0]//ReadassignA_data=(A_addr==0)?0:Register[A_addr];assignB_data=(B_addr==0)?0:Register[B_addr];//Writedataintegeri;always@(posedgeClockornegedgeReset)beginif(Reset==0)beginfor(i=1;i<=31;i=i+1)Register[i]<=0;endelseif((Write)&&(W_addr!=0))Register[W_addr]<=控制器(ControlUnit)的設計與實7-5-17-1z:運算結果為零,1op[5:0]:指令操作碼,6func[5:0]:指令功能碼,6wmem:寫器,1位,為1時寫器,否則不寫,輸出wreg:寫寄存器,11regrtrt,11rtrtm2reg:器數據寫寄存器信號,1位,為1選擇器數據,否則t選ALUshift:ALUA端口使用移位位數,11時使用移位位數,否則使用寄jal:子程序調用,11jalsext:立即數符號擴展,11aluc[3:0]:ALU操作控制碼,4pcsource[1:0]:下一條指令地址選擇,2NewSource命令,選定義框。其中ModuleName欄輸入模塊名Control_Unit,單擊Next進入下一步,FinishControl_UnitVerilog程序參考代碼:moduleinput[5:0]input[5:0]func, outputoutputm2reg,output[3:0]aluc,output output[1:0]pcsource, //Registerwirei_add=(op==6'b000000&func==6'b100000)?1:0;wirei_sub=(op==6'b000000&func==6'b100010)?1:0;wirei_and=(op==6'b000000&func==6'b100100)?1:0;wirei_or=(op==6'b000000&func==6'b100101)?1:0;wirei_xor=(op==6'b000000&func==6'b100110)?1:0;wirei_sll=(op==6'b000000&func==6'b000000)?1:0;wirei_srl=(op==6'b000000&func==6'b000010)?1:0;wirei_sra=(op==6'b000000&func==6'b000011)?1:0;wirei_jr=(op==6'b000000&func==6'b001000)?1:0;//immediatewirei_addi=(op==6'b001000)?1:0;wirei_andi=(op==wirei_ori=(op==6'b001101)?1:0;wirei_xori=(op==6'b001110)?1:0;wirei_lw=(op==6'b100011)?1:0;wirei_sw=(op==6'b101011)?1:0;wirei_beq=(op==6'b000100)?1:0;wirei_bne=(op==6'b000101)?1:0;wirei_lui=(op==wirei_j =(op==6'b000010)?1:0;//jwirei_jal=(op==6'b000011)?1:0;////Createcontrolassignwreg=i_add|i_sub|i_and|i_or|i_xor|i_sll|i_srl|i_sra|i_addi|i_andi|i_ori|i_or|i_xori|i_lw|i_lui|i_jal;assignregrt=i_addi|i_andi|i_ori|i_xori|i_lw|i_lui;assignjal =i_jal;assignm2reg=assignshift=i_sll|i_srlassignaluimm=i_addi|i_andi|i_ori|i_xori|i_lw|i_lui|i_sw;assignsext=i_addi|i_lw|i_sw|i_beq|assignaluc[3]=assignaluc[2]=i_sub|i_or|i_srl|i_sra|i_ori|i_lui;assignaluc[1]=i_xor|i_sll|i_srl|i_sra|i_xori|i_beq|i_bne|assignaluc[0]=i_and|i_or|i_sll|i_srl|i_srai_andi|i_ori;assignwmem =i_sw; source[1]=i_jr|i_j| source[0]=i_beq&z|i_bne&~z|i_j|i_jal;Verilog實現代碼中,首先對指令的功能進行譯碼,以“i_”開頭的變(addassignregrt=i_addi|i_andi|i_ori|i_xori| |i_xori(立即數異或、i_lw(取整數數據字)或i_lui(設置)功能時控制信號regrt1。aluc[3:0]5-1CPU的封CPUCPUCPU8-1

8-1CPU8-1CPUClock:輸入,1Reset:輸入,1Inst[31:0]:輸入,32位,CPUMem[31:0]:輸入,32pc[31:0]:輸入,32wmem:輸出,1位,器寫信號Result[31:0]:輸出,32Data[31:0]:輸出,32Bmodule input[31:0]inputmodule input[31:0]input[31:0]output[31:0]pc, output[31:0]Result,output[31:0]Datawire[31:0]p4,adr, ,res,ra,alu_mem,alua,alub;wire[4:0]reg_dest,wn;wire[3:0]wire[1:0]wirezero,wreg,regrt,wire[31:0]sa={27'b0,wire[31:0]offset={imm[13:0],inst[15:0],dff32ip( ,Clock,Reset,pc);cla32pcplus4(pc,32'h4,1'b0,p4);cla32br_adr(p4,offset,1'b0wire[31:0]jpc={p4[31:28],Control_UnitCU(inst[31:26],inst[5:0],shift,aluimm,pcsource,jal,sext);wiree=sext&inst[15];wire[15:0]imm={16{e}};wire[31:0]immdiate{imminst[15:0]};//RegFilerf(Clock,Reset,inst[25:21],inst[20:16],wn,res,wreg,ra,Data);MUX32_2_1alu_a(ra,sa,shift,alua);MUX32_2_1alu_b(Data,immdiate,aluimm,alub);ALUalu(alua,alub,aluc,Result,MUX5_2_1MUX5_2_1reg_wn(inst[15:11],inst[20:16],regrtassignwn=reg_dest|MUX32_2_1res_mem(Result,mem,m2reg,alu_mem);MUX32_2_1link(alu_mem,p4,jal,res);MUX32_4_1nextpc(p4,adr,ra,jpc,pcsource 測當CPU設計完成后,還需要對其進試,為此需要再設計一個指令器和一個數據器,同時再設計相應的測試程序。指令器及測試程moduleinput[31:0]output[31:0]wire[31:0]ramassignram[5'h00]=32'h3c011234;//luiR1,0x1234assignram[5'h01]=32'h34215678;//oriR1,R1,0x5678assignram[5'h02]=32'h3C02AAAA;//luiR2,0xaaaaassignram[5'h03]=32'h3442BBBB;//oriR2,R2,0xbbbbassignram[5'h04]=32'h00221820;//addR3,R1,R2assignram[5'h05]=32'h00221822;//subR3,R1,R2assignram[5'h06]=32'h00221824;//andR3,R1,R2assignram[5'h07]=32'h00221825;//orR3,R1,R2assignram[5'h08]=32'h00221826;//xorR3,R1,R2assignram[5'h09]=32'h00021900;//sllR3,R2,4assignram[5'h0a]=32'h00021902;//srlR3,R2,4assignram[5'h0b]=32'h00021903;//srlR3,R2,4assignram[5'h0c]=32'h20231234;//addiR3,R1,0x1234assignram[5'h0d]=32'h302300EF;//andiR3,R1,0xefassignram[5'h0e]=32'h342300EF;//oriR3,R1,0xefassignram[5'h0f]=32'h382300EF;//xoriR3,R1,0xefassignram[5'h10]=32'h00631826;//xorR3,R3,R3assignram[5'h11]=32'hAC610001;//swR1,1(R3)assignassignram[5'h12]=32'h90650001;//lwR5,1(R3)assigninst=ram[address[6:2]];數據器及測試數modulemodule output[31:0]dataout,input[31:0]datain,input[31:0]addr, reg[31:0]ramassigndataout=always@(posedgeClock)if(we)ram[addr[6:2]]=integerinitialfor(i=0;i<=31;i=i+1)ram[i]=i*仿真測圖9-1CPU、指令器和數據器連到開發板驗Switch[1:0]:輸出內容選擇,00–顯示執行指令,01–pc,10–顯示ALU運算結果,11

溫馨提示

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

評論

0/150

提交評論