版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
計算機設(shè)計與實踐報告計算機設(shè)計與實踐實驗報告給定指令系統(tǒng)設(shè)計——CPU院系:計算機科學與技術(shù)姓名:***********學號:***********班級:************目錄HYPERLINK實驗目的 3HYPERLINK實驗環(huán)境 3HYPERLINK設(shè)計思想 4HYPERLINKcpu接口信號定義 4HYPERLINK指令格式設(shè)計 4HYPERLINKRISC處理器設(shè)計格式 4HYPERLINK微操作的定義 6HYPERLINK節(jié)拍的劃分 7HYPERLINK處理器結(jié)構(gòu)設(shè)計框圖及功能描述 7HYPERLINK各模塊結(jié)構(gòu)設(shè)計框圖及功能描述 9HYPERLINK時鐘模塊 9HYPERLINK2)取指模塊 10HYPERLINK3)運算模塊 11HYPERLINK4)訪存模塊 12HYPERLINK5)回寫模塊 13HYPERLINK6)訪存控制模塊 14HYPERLINK進度安排 15HYPERLINK實驗各模塊的設(shè)計及仿真 16HYPERLINK時鐘模塊 16HYPERLINK產(chǎn)生節(jié)拍的代碼: 16HYPERLINK仿真波形: 18HYPERLINK取指模塊 19HYPERLINK代碼: 19HYPERLINK仿真波形: 22HYPERLINKALU運算模塊 22HYPERLINK代碼: 22HYPERLINK仿真波形: 27HYPERLINK訪存模塊 29HYPERLINK代碼: 29HYPERLINK仿真波形: 31HYPERLINK回寫模塊 31HYPERLINK代碼: 31HYPERLINK仿真波形: 37HYPERLINK訪存控制模塊 38HYPERLINK代碼: 38HYPERLINK仿真波形: 42HYPERLINKcpu元件例化 44HYPERLINK代碼: 44HYPERLINK仿真波形: 51HYPERLINKUCF文件: 58HYPERLINK總體測試結(jié)果及說明 61HYPERLINK測試指令序列 61HYPERLINK設(shè)計、調(diào)試、下載中遇到問題及解決方案 62HYPERLINK1、設(shè)計中遇到的問題及解決方案 62HYPERLINK2、調(diào)試中遇到的問題及解決方案 62HYPERLINK3、下載中遇到的問題及解決方案 62HYPERLINK實驗總結(jié) 63實驗目的掌握XilinxISE集成開發(fā)環(huán)境和ModeSim仿真工具的使用方法掌握VHDL語言掌握FPGA編程方法及硬件調(diào)試手段深刻理解處理器結(jié)構(gòu)和計算機系統(tǒng)的整體工作原理實驗環(huán)境XilinxISE集成開發(fā)環(huán)境、ModeSim或Isim仿真工具SD2100數(shù)字邏輯設(shè)計實驗平臺設(shè)計思想cpu接口信號定義信號名位數(shù)方向來源/去向意義RST1I處理器板高電平復位clk1I處理器板系統(tǒng)時鐘nMREQ1O主存儲器存儲器片選nrd1O主存儲器存儲器讀nwr1O主存儲器存儲器寫nbhe1O主存儲器高位字節(jié)訪問允許nble1O主存儲器低位字節(jié)訪問允許abus16O主存儲器地址總線dbus16I/O主存儲器數(shù)據(jù)總線timeout4OFPGA-二極管節(jié)拍顯示nirout1OFPGA-S0\S1指令顯示ndbus16OFPGA-S3\S4數(shù)據(jù)總線內(nèi)容顯示nabus16OFPGA-S5\S2地址總線內(nèi)容顯示ncyout1OFPGA-A0進位標志位顯示nbheout1OFPGA-A5高位字節(jié)訪問允許顯示nbleout1OFPGA-A4低位字節(jié)訪問允許顯示nmreqout1OFPGA-A7存儲器片選顯示nrdout1OFPGA-A6存儲器讀顯示nwrout1OFPGA-A3存儲器寫顯示k08IFPGA-K0控制使其顯示寄存器npcout4OFPGA-B4-B7顯示pc改變指令格式設(shè)計RISC處理器設(shè)計格式指令系統(tǒng)中指定所有的指令都是二進制指令通用寄存器的數(shù)量為8,需要3位地址與之對應(yīng)訪存的形式地址為8位定義指令的高5位表示操作碼寄存器-寄存器型指令5353OPAD1AD2其他指令類型538OPAD1AD2實驗中指令設(shè)計JMPX(R7//X-->PC)00000000XJZRiX(ifRi=0thenPC+R7//XPC)00010RiXSUBRi,RjRi-Rj->Ri00100Ri00000RjADDRi,RjRi+Rj->Ri00110Ri00000RjMVIRi,XX->Ri01000RixMOVRi,RjRj->Ri01010RI00000RjSTARi,XRi->R7//X01100RixLDARi,XR7//X->Ri01110RiXSET1cy<-110000SET0cy<-010010微操作的定義指令名稱助記符二進制操作碼無條件跳轉(zhuǎn)JMP00000條件跳轉(zhuǎn)JZ00010減法操作SUB00100加法操作ADD00110立即數(shù)傳送MVI01000寄存器傳送MOV01010存數(shù)操作STA01100取數(shù)操作LDA01110進位置1SET110000進位置0SET010010節(jié)拍的劃分劃分4個節(jié)拍節(jié)拍對應(yīng)操作T0取指操作T1運算ALUT2訪存操作T3回寫操作處理器結(jié)構(gòu)設(shè)計框圖及功能描述clk時鐘模塊Cpu總體設(shè)計圖clk時鐘模塊rstrstt3t2t1t0t3t2t1t0Rdata(7:0)Rdata(7:0)Rupdatealuout(7:0)ALUOUT回寫模塊訪存模塊運算模塊取指模塊Rupdatealuout(7:0)ALUOUT回寫模塊訪存模塊運算模塊取指模塊cycycupdateRdatatempCYpccycycupdateRdatatempCYpcmupdatecymupdatecyRtempalouout(7:0)pcout15:0Rtempalouout(7:0)pcout15:0)RipcnewADDRIR pcnewADDRIRPCOUT_M(15:0)PCOUT_M(15:0)IR(15:0)R_Mpcnewtopcpcupdate IR(15:0)R_MpcnewtopcpcupdateRtempin(7:0)rwRtempin(7:0)rwaddr(15:0)IRin(15:0)訪存控制訪存控制DBus(15:0)ABus(15:0)DBus(15:0)ABus(15:0)nWRnRDnblenbhemreq nWRnRDnblenbhemreq主存儲器主存儲器功能:設(shè)計的cpu是一個簡單的RISC處理器,該處理器是在給定的指令集下構(gòu)建,支持以上的十條指令。主存在一個時鐘周期內(nèi)完成一次存取操作,而且和cpu同步工作。能根據(jù)自己設(shè)計的指令完成以上的操作。并將其部分顯示在SD2100數(shù)字邏輯設(shè)計實驗平臺。各模塊結(jié)構(gòu)設(shè)計框圖及功能描述時鐘模塊 信號接口定義:信號名位數(shù)方向來源/去向意義clk1I系統(tǒng)時鐘外接系統(tǒng)時鐘rst1I系統(tǒng)復位外接系統(tǒng)復位t4O產(chǎn)生節(jié)拍節(jié)拍控制各個模塊模塊功能描述:時鐘模塊是一個四節(jié)拍的計數(shù)器,負責對各個模塊輸送節(jié)拍,以此來控制各個節(jié)拍協(xié)調(diào)工作。clk產(chǎn)生脈沖,t會循環(huán)改變t(i)的值,每次都只有一個1,達到節(jié)拍的效果。當復位信號有效,才會都變成02)取指模塊信號接口定義:信號名位數(shù)方向來源/去向意義T01I時鐘模塊第一個節(jié)拍取指Rst1I系統(tǒng)復位系統(tǒng)復位Pcin16I訪存控制回寫的pc送給pcRupdate1I回寫模塊回寫模塊控制pc更新控制Pcout16O回寫模塊Pc送往回寫模塊Pcout_m16O訪存控制Pc送往訪存控制Irin16I訪存控制訪存控制取出的指令送取指模塊Rout1O訪存控制取指的讀信號送完訪存控制irout16O運算模塊指令輸出便其他模塊使用模塊功能描述:t0節(jié)拍控制取指模塊工作。Rst復位pc,回到初始地址。Rupdate負責pc更新的值送到pc,形成新的地址。取指模塊主要功能是送地址給訪存控制,取出指令到IR.3)運算模塊信號接口定義:信號名位數(shù)方向來源/去向意義Rupdate1I回寫模塊回寫數(shù)據(jù)控制信號Mupdate1I回寫模塊Mvi/mov回寫控制Cupdate1I回寫模塊進位回寫控制Rdata8I回寫模塊回寫的數(shù)據(jù)T11I時鐘模塊節(jié)拍控制Cyin1I回寫模塊進位輸入Cyout1O進位送回寫進位輸出至回寫Irin16I指令輸入指令輸入aluAluout8O送回寫/訪存控制運算等結(jié)果輸出pcjmp16O跳轉(zhuǎn)指令至pc跳轉(zhuǎn)指令送到取指的pcAddr16O形成地址送訪存指令形成地址送訪存控制Regout0-Regout78O寄存器輸出顯示寄存器引出到cpu,顯示寄存器功能描述:t1節(jié)拍控制alu,在alu中執(zhí)行各條指令。根據(jù)IRin指令的操作碼,執(zhí)行指令,結(jié)果從aluout,cyout,addr送出?;貙懙臅r候,Rupdate控制回寫數(shù)據(jù)送入,cupdate控制進位回寫,Mupdate控制mov/mvi的回寫數(shù)據(jù)。其中pcjmp是直接跳轉(zhuǎn)的地址送往pc。其中顯示寄存器,將Regout0-Regout7引出到cpu4)訪存模塊信號接口定義:信號名位數(shù)方向來源/去向意義T21I時鐘模塊節(jié)拍控制訪存模塊Irin16I取指ir輸出指令輸入,發(fā)讀寫信號Rtempin8I訪存控制存儲器中取出的數(shù)輸入Rtempout8O回寫模塊暫存的數(shù)送回寫Wout1O送訪存控制發(fā)寫信號rout1O送訪存控制發(fā)讀信號功能描述:t2控制訪存模塊,主要是取數(shù)的時候,取出的數(shù)暫存在訪存模塊,然后通過回寫送到對應(yīng)的寄存器5)回寫模塊信號接口定義:信號名位數(shù)方向來源/去向意義T31I時鐘模塊節(jié)拍控制回寫Irin16I取指模塊IR輸出指令上操作碼給出對應(yīng)控制Pcin16I取指模塊Pc值輸入Pcjmp16I運算模塊Jmp跳轉(zhuǎn)地址回寫Pcout16O送取指模塊回寫新pc回寫Rupdate1O送運算模塊回寫控制回寫運算、取數(shù)數(shù)據(jù)控制Mupdate1O送運算模塊回寫控制回寫mov/mvi數(shù)據(jù)控制Pcupdate1O送取指模塊回寫控制Pc回寫控制Cupdate1O送運算模塊回寫控制進位回寫控制Rtempin8I訪存模塊取出的數(shù)送回寫Aluout8I運算模塊運算等結(jié)果送回寫Cyin1I運算模塊進位結(jié)果送回寫cyout1O送運算模塊回寫進位結(jié)果回寫至運算模塊Rdataout8O送運算模塊回寫數(shù)據(jù)回寫至運算模塊功能描述:t3節(jié)拍控制回寫模塊的工作?;貙懩K主要是將各個指令產(chǎn)生的結(jié)果暫時送到回寫模塊里,然后在相對應(yīng)的時間送到對應(yīng)的地方。加減運算結(jié)果,mov/mvi結(jié)果,取數(shù)結(jié)果,pc更新的結(jié)果以及進位都暫存在回寫模塊,通過指令譯碼,在對應(yīng)的指令上添加控制信號:Rupdate,mupdate,cupdate,pcupdate。再送取指和運算模塊。6)訪存控制模塊信號接口定義 :信號名位數(shù)方向來源/去向意義T01I時鐘模塊時鐘產(chǎn)生的節(jié)拍控制T21I時鐘模塊時鐘產(chǎn)生的節(jié)拍控制Rst1I系統(tǒng)復位系統(tǒng)復位Pcin16I取指模塊取指送的pc至存儲器,取出指令Addrin16I運算模塊形成的地址送存儲器Aluout8I運算模塊運算結(jié)果送存儲器存Rin16I訪存模塊訪存模塊讀信號Win1I訪存模塊訪存模塊發(fā)寫信號Rtom1I取指模塊取指發(fā)的讀信號Rtemp8I/O數(shù)據(jù)送訪存模塊取數(shù)取出的數(shù)據(jù)Irout16O取指輸出指令取出的指令放回取指模塊Abus16O存儲器地址總線存儲器地址總線Dbus16I/O存儲器數(shù)據(jù)總線存儲器數(shù)據(jù)總線給數(shù)據(jù)Mreq1O存儲器片選存儲器片選控制信號Wr1O存儲器寫存儲器寫控制Rd1O存儲器讀存儲器讀控制Nbhe1O存儲器高位字節(jié)存儲器高位字節(jié)訪問允許nble1O存儲器低位字節(jié)存儲器低位字節(jié)訪問允許功能描述:訪存控制模塊主要是與存儲器相連接,能夠從存儲器中取數(shù)據(jù),指令,能將數(shù)據(jù)、地址送到存儲器中存儲。t0t2兩個節(jié)拍分別控制不同的操作,t0是取指的時候,從存儲器中讀出指令;t2則是在需要訪存的時候,由訪存模塊給讀寫信號,使訪存控制對應(yīng)存儲器操作。進度安排第二周完成所有的仿真,在硬件實驗平臺上調(diào)試第二周完成所有的仿真,在硬件實驗平臺上調(diào)試第三周寫實驗報告,第三周寫實驗報告,準備考試第一周完成總體設(shè)計及各個模塊代碼編寫實驗各模塊的設(shè)計及仿真時鐘模塊產(chǎn)生節(jié)拍的代碼:LIBRARYieee;USEieee.std_logic_1164.ALL;entitycount4isport(clk,rst:instd_logic;t:outstd_logic_vector(3downto0));endcount4;architectureBehavioralofcount4issignaltemp:std_logic_vector(3downto0);beginprocess(rst,clk) begin if(rst='1')then--復位 t<="0000"; temp<="0001";--準備一個時鐘之后送給t elsif(clk='1'andclk'event)then t<=temp; casetempis--產(chǎn)生節(jié)拍when"0001"=>temp<="0010";when"0010"=>temp<="0100";when"0100"=>temp<="1000";when"1000"=>temp<="0001";whenothers=>temp<="ZZZZ"; endcase; endif; endprocess;endBehavioral;測試代碼:LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYcount4_testISENDcount4_test;ARCHITECTUREbehaviorOFcount4_testISCOMPONENTcount4PORT(clk:INstd_logic;rst:INstd_logic;t:OUTstd_logic_vector(3downto0));ENDCOMPONENT;--Inputssignalclk:std_logic:='0';signalrst:std_logic:='0'; --Outputssignalt:std_logic_vector(3downto0);--Clockperioddefinitions--constantclk_period:time:=10ns;BEGIN --InstantiatetheUnitUnderTest(UUT)uut:count4PORTMAP(clk=>clk,rst=>rst,t=>t);--Clockprocessdefinitionsclk_process:processbegin clk<='0'; waitfor10ns; clk<='1'; waitfor10ns;endprocess;--Stimulusprocessstim_proc:processbegin --holdresetstatefor100ns.waitfor20ns; rst<='1';--復位 waitfor40ns; rst<='0';--節(jié)拍wait;endprocess;END;仿真波形:波形解釋:當rst有效,t全為0,此時為復位。rst無效,隨著時鐘的上升沿,產(chǎn)生一個一個節(jié)拍。四個節(jié)拍循環(huán)產(chǎn)生。取指模塊代碼:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityGetIRisport(t0:instd_logic;rst:instd_logic;Rout:outstd_logic;PCin:instd_logic_vector(15downto0);Rupdate:instd_logic;--PCupdatePCout:outstd_logic_vector(15downto0);PCout_m:outstd_logic_vector(15downto0);IRin:instd_logic_vector(15downto0);IRout:outstd_logic_vector(15downto0));endGetIR;architectureBehavioralofGetIRissignalPC:std_logic_vector(15downto0);signalIR:std_logic_vector(15downto0);beginprocess(t0,rst,PCin,Rupdate,IR,PC)beginif(rst='0')thenif(Rupdate='1')then--pc回寫pcupdate PC<=PCin; endif; if(t0='1')then--取指 PCout<=PC+1;--topcnew PCout_m<=PC;--tomemorycontrol IR<=IRin; IRout<=IRin; Rout<='0'; endif;elsePC<="0000000000000000"; PCout<="0000000000000000"; endif;endprocess;endBehavioral;測試代碼:LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYGetIR_testISENDGetIR_test;ARCHITECTUREbehaviorOFGetIR_testIS--ComponentDeclarationfortheUnitUnderTest(UUT)COMPONENTGetIRPORT(t0:INstd_logic;rst:INstd_logic;PCin:INstd_logic_vector(15downto0);Rupdate:INstd_logic;PCout:OUTstd_logic_vector(15downto0); PCout_m:OUTstd_logic_vector(15downto0);IRin:INstd_logic_vector(15downto0); Rout:OUTstd_logic;IRout:OUTstd_logic_vector(15downto0));ENDCOMPONENT;--Inputssignalt0:std_logic:='0';signalrst:std_logic:='0';signalPCin:std_logic_vector(15downto0):=(others=>'0');signalRupdate:std_logic:='0';signalIRin:std_logic_vector(15downto0):=(others=>'0'); --Outputs signalRout:std_logic;signalPCout:std_logic_vector(15downto0); signalPCout_m:std_logic_vector(15downto0);signalIRout:std_logic_vector(15downto0);--Noclocksdetectedinportlist.Replace<clock>belowwith--appropriateportnameBEGIN --InstantiatetheUnitUnderTest(UUT)uut:GetIRPORTMAP(t0=>t0,rst=>rst,PCin=>PCin,Rupdate=>Rupdate,PCout=>PCout, PCout_m=>PCout_m,IRin=>IRin, Rout=>Rout,IRout=>IRout);--Stimulusprocess stim_proc:processbegin waitfor100ns; rst<='1';--系統(tǒng)復位 waitfor100ns;rst<='0'; Rupdate<='1';--回寫 PCin<="0000000000000001";--pc+1 waitfor100ns; Rupdate<='0'; t0<='1';--取指 IRin<="0011000100000010";--加法指令wait;endprocess;END;仿真波形:波形解釋:RST有效時,pc清0,初始化。當t0節(jié)拍來了之后,rupdate(pcupdate控制pc更新)有效,將pc送給pcout_m給訪存控制模塊。取出指令送irin,IR送出指令I(lǐng)Rout。pc更新加1,送pcout,送回寫模塊。ALU運算模塊代碼:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;useIEEE.STD_LOGIC_ARITH.ALL;entityaluisPORT(Rupdate:instd_logic;Mupdate:instd_logic;Cupdate:instd_logic;Rdata:instd_logic_vector(7downto0);t1:instd_logic;--節(jié)拍cyin:instd_logic;cyout:outstd_logic;IRin:instd_logic_vector(15downto0);aluout:outstd_logic_vector(7downto0);Regout0,Regout1,Regout2,Regout3,Regout4,Regout5,Regout6,Regout7:outstd_logic_vector(7downto0);pcjmp:outstd_logic_vector(15downto0);addr:outstd_logic_vector(15downto0));endalu;architectureBehavioralofaluissubtyperegisstd_logic_vector(7downto0);subtypenumisintegerrange0to7;typeRegAryisarray(num)ofreg;signalmyreg:RegAry:=(others=>"00000000");signalcy:std_logic;begin process(IRin,t1,cyin,Rupdate,Mupdate,Rdata,Cupdate,myreg,cy)variableA,B,ans:std_logic_vector(8downto0);beginif(t1='1')then--節(jié)拍控制 caseIRin(15downto11)is when"00000"=>--JMP無條件跳轉(zhuǎn) pcjmp<=myreg(7)&IRin(7downto0);--R7//X->PC when"00010"=>--JZ有條件跳轉(zhuǎn) if(myreg(conv_integer(IRin(10downto8)))="00000000")then--ifRi=0thenPC+X->PC aluout<=IRin(7downto0); else aluout<="00000000"; endif; when"00100"=>--SUB減法操作 A:='0'&myreg(conv_integer(IRin(10downto8)));--得到Ri的值 B:='0'&myreg(conv_integer(IRin(2downto0)));--得到Rj的值 ans:=A-B-cy; aluout<=ans(7downto0); cyout<=ans(8); when"00110"=>--ADD加法操作 A:='0'&myreg(conv_integer(IRin(10downto8)));--得到Ri的值 B:='0'&myreg(conv_integer(IRin(2downto0)));--得到Rj的值 ans:=A+B+cy;--Ri+Rj+cy aluout<=ans(7downto0); cyout<=ans(8); when"01000"=>--MVI立即數(shù)傳送 aluout<=IRin(7downto0);--MVIX->Ri when"01010"=>--MOV寄存器傳送 aluout<=myreg(conv_integer(IRin(2downto0)));--MOVRj->Ri when"01100"=>--STA(Ri->R7//x)存數(shù)操作 aluout<=myreg(conv_integer(IRin(10downto8))); addr<=myreg(7)&IRin(7downto0); when"01110"=>--LDA取數(shù)操作R7//x->Ri addr<=myreg(7)&(IRin(7downto0));--地址送MAR when"10000"=>--SETCY1進位置1 cy<='1'; cyout<='1'; when"10010"=>--SETCY0進位置0 cy<='0'; cyout<='0'; whenothers=>null; endcase;elsif(Rupdate='1')thenmyreg(conv_integer(IRin(10downto8)))<=Rdata;-- elsif(Cupdate='1')then-- cy:=cyin; elsif(Mupdate='1')then myreg(conv_integer(IRin(10downto8)))<=Rdata;endif;if(Cupdate='1')then--送進位 cy<=cyin; endif;endprocess;Regout0<=myreg(0);Regout1<=myreg(1);Regout2<=myreg(2); Regout3<=myreg(3);Regout4<=myreg(4);Regout5<=myreg(5);Regout6<=myreg(6);Regout7<=myreg(7);endBehavioral;測試代碼:LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYalu_testISENDalu_test;ARCHITECTUREbehaviorOFalu_testIS--ComponentDeclarationfortheUnitUnderTest(UUT)COMPONENTaluPORT(Rupdate:INstd_logic; Mupdate:INstd_logic; Cupdate:INSTD_LOGIC;Rdata:INstd_logic_vector(7downto0);t1:INstd_logic;IRin:INstd_logic_vector(15downto0);aluout:OUTstd_logic_vector(7downto0);cyin:INstd_logic; cyout:OUTstd_logic; Regout0,Regout1,Regout2,Regout3:OUTstd_logic_vector(7downto0); Regout4,Regout5,Regout6,Regout7:OUTstd_logic_vector(7downto0); pcjmp:OUTstd_logic_vector(15downto0);addr:OUTstd_logic_vector(15downto0));ENDCOMPONENT;--InputssignalRupdate:std_logic:='0'; signalMupdate:std_logic:='0'; signalCupdate:std_logic:='0';signalRdata:std_logic_vector(7downto0):=(others=>'0');signalt1:std_logic:='0';signalIRin:std_logic_vector(15downto0):=(others=>'0');signalcyin:std_logic:='0'; --BiDirssignaladdr:std_logic_vector(15downto0); --Outputssignalaluout:std_logic_vector(7downto0); signalcyout:std_logic;signalpcjmp:std_logic_vector(15downto0); signalRegout0:std_logic_vector(7downto0); signalRegout1:std_logic_vector(7downto0); signalRegout2:std_logic_vector(7downto0); signalRegout3:std_logic_vector(7downto0); signalRegout4:std_logic_vector(7downto0); signalRegout5:std_logic_vector(7downto0); signalRegout6:std_logic_vector(7downto0); signalRegout7:std_logic_vector(7downto0);--Noclocksdetectedinportlist.Replace<clock>belowwith--appropriateportname--constant<clock>_period:time:=10ns;BEGIN --InstantiatetheUnitUnderTest(UUT)uut:aluPORTMAP(Rupdate=>Rupdate, Mupdate=>Mupdate, Cupdate=>Cupdate,Rdata=>Rdata,t1=>t1,IRin=>IRin,aluout=>aluout,cyin=>cyin, cyout=>cyout, pcjmp=>pcjmp, Regout0=>Regout0, Regout1=>Regout1, Regout2=>Regout2, Regout3=>Regout3, Regout4=>Regout4, Regout5=>Regout5, Regout6=>Regout6, Regout7=>Regout7,addr=>addr);--Clockprocessdefinitions--Stimulusprocessstim_proc:processbegin --holdresetstatefor100ns.waitfor50ns; Rupdate<='1'; cyin<='0'; Rdata<="10011001"; IRin<="1111100111111111"; waitfor50ns; cyin<='1'; Rdata<="11011101"; IRin<="1111101011111111";waitfor50ns; Rupdate<='0'; Cupdate<='1'; cyin<='1'; t1<='1'; IRin<="0011000100000010";--R1+R2->R1 waitfor50ns; Cupdate<='1'; IRin<="0010000100000010";--R1-R2->R1 waitfor50ns; IRin<="0100001010101010";--MVI10101010->R2 waitfor50ns; IRin<="0101001000000001";--R1->R2 waitfor50ns; IRin<="0000000010101011";--JMP10101011 waitfor50ns; IRin<="0001001001010101";--JZR2,01010101 waitfor50ns; IRin<="0110001010101010";--STAR2,10101010 waitfor50ns; IRin<="0111000101010101";--LDAR1,01010101 waitfor50ns; IRin<="1000011111111111";--置1 waitfor50ns; IRin<="1001011111111111";--清0wait;endprocess; END;仿真波形:波形解釋:Rupdate有效時,將R1賦值99,R2賦值dd。cupdate有效,進位1送入。T1有效,執(zhí)行指令3102,即R1+R2->aluout。99+dd+1=77,有進位為1.故cyout為1。指令2102執(zhí)行R1-R2->aluout。99-dd-1=bb。有借位為1。指令42aa為R2送aa,由于要回寫,故送到ALUOUT。指令5201將R1值送R2,由于回寫,故aluout是r1值99。指令00ab跳轉(zhuǎn),pcjmp就是R7//ab。指令1255是JZ,ifr2=0thenr7//55->pc。指令62aa,把R2的值存在R7//aa,故aluout為R2的值,addr為00aa。指令7155取R7//55的值送R1,addr地址為0055送訪存控制。87ff,97ff為進位置0/1,由于在內(nèi)部變量直接置進位,波形上沒有。訪存模塊代碼:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entityMemoryisport(t2:instd_logic;IRin:instd_logic_vector(15downto0);Rtempin:instd_logic_vector(7downto0);Rtempout:outstd_logic_vector(7downto0);Wout,Rout:outstd_logic);endMemory;architectureBehavioralofMemoryissignalRtemp:std_logic_vector(7downto0);beginprocess(t2,IRin,Rtempin,Rtemp)beginif(t2='1')thencaseIRin(15downto11)is when"01100"=>--STA Wout<='0';--給訪存控制,寫 Rout<='1'; when"01110"=>--LDA Wout<='1'; Rout<='0';--給出讀信號 Rtemp<=Rtempin;--Rtempin來自MDR的低位 Rtempout<=Rtempin; whenothers=> Wout<='1'; Rout<='1'; endcase;endif;endprocess;endBehavioral;測試代碼:LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYMemory_testISENDMemory_test;ARCHITECTUREbehaviorOFMemory_testIS--ComponentDeclarationfortheUnitUnderTest(UUT)COMPONENTMemoryPORT(t2:INstd_logic;IRin:INstd_logic_vector(15downto0);Rtempin:INstd_logic_vector(7downto0);Rtempout:OUTstd_logic_vector(7downto0);Wout:OUTstd_logic;Rout:OUTstd_logic);ENDCOMPONENT;--Inputssignalt2:std_logic:='0';signalIRin:std_logic_vector(15downto0):=(others=>'0');signalRtempin:std_logic_vector(7downto0):=(others=>'0'); --OutputssignalRtempout:std_logic_vector(7downto0);signalWout:std_logic;signalRout:std_logic;--Noclocksdetectedinportlist.Replace<clock>belowwith--appropriateportnameBEGIN --InstantiatetheUnitUnderTest(UUT)uut:MemoryPORTMAP(t2=>t2,IRin=>IRin,Rtempin=>Rtempin,Rtempout=>Rtempout,Wout=>Wout,Rout=>Rout);stim_proc:processbegin waitfor100ns; t2<='1'; IRin<="0110001010101010";--STA waitfor100ns; IRin<="0111010101010101";--LDA Rtempin<="11000010";--來自MDR的數(shù)據(jù) waitfor100ns; IRin<="0000000000000000";wait;endprocess;END;仿真波形:波形解釋:訪存模塊主要的功能是在存取的時候給出讀寫信號,并在取數(shù)的過程中暫存數(shù)據(jù)。波形中t2有效時,指令62aa是存數(shù),發(fā)出寫信號WOUT為0,有效。7555為取數(shù),讀信號ROUT有效,數(shù)據(jù)從retmpin送到暫存器rtemp,Rtempout送出回寫模塊代碼:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityWriteBackisport(t3:instd_logic;IRin,PCin:instd_logic_vector(15downto0);pcjmp:instd_logic_vector(15downto0);PCout:outstd_logic_vector(15downto0);Rupdate:outstd_logic;Mupdate:outstd_logic;PCupdate:outstd_logic;Cupdate:outstd_logic;rtempin:instd_logic_vector(7downto0);aluout:instd_logic_vector(7downto0);cyin:instd_logic;cyout:outstd_logic;Rdataout:outstd_logic_vector(7downto0));endWriteBack;architectureBehavioralofWriteBackissignalRdata,Rtemp:std_logic_vector(7downto0);signalpcnew,m:std_logic_vector(15downto0);--signalcy:std_logic;beginprocess(t3,PCin,IRin,cyin,rtempin,aluout,Rtemp,Rdata,pcnew,m)beginif(t3='1')then caseIRin(15downto11)is when"00010"=>--jz--Rupdate<='1'; if(aluout(7)='0')then m<="00000000"&aluout; else m<="11111111"&aluout; endif; pcnew<=PCin+m; PCout<=PCin+m; when"01110"=>--LDA Rtemp<=rtempin; Rdataout<=rtempin; Rupdate<='1'; PCout<=PCin; when"00110"=>--ADD Rdata<=aluout; Rdataout<=aluout; Rupdate<='1'; Cupdate<='1'; PCout<=PCin; cyout<=cyin; when"00100"=>--SUB Rdata<=aluout; Rdataout<=aluout; Rupdate<='1'; Cupdate<='1'; PCout<=PCin; cyout<=cyin; when"01000"=>--MVI Rdata<=aluout; Rdataout<=aluout; Mupdate<='1'; PCout<=PCin; when"01010"=>--MOV Rdata<=aluout; Rdataout<=aluout; Mupdate<='1'; PCout<=PCin; when"00000"=>--JMP PCout<=pcjmp;--pcupdate='1' when"10000"=> Cupdate<='1'; PCout<=PCin; cyout<=cyin; when"10010"=> Cupdate<='1'; PCout<=PCin; cyout<=cyin;whenothers=> Rupdate<='0'; PCout<=PCin; endcase; PCupdate<='1'; else Rupdate<='0'; PCupdate<='0'; Mupdate<='0'; Cupdate<='0';endif;endprocess;endBehavioral;測試代碼:LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYWriteBack_testISENDWriteBack_test;ARCHITECTUREbehaviorOFWriteBack_testIS--ComponentDeclarationfortheUnitUnderTest(UUT)COMPONENTWriteBackPORT(t3:INstd_logic; cyin:INstd_logic;IRin:INstd_logic_vector(15downto0);PCin:INstd_logic_vector(15downto0); pcjmp:INstd_logic_vector(15downto0);PCout:OUTstd_logic_vector(15downto0);Rupdate:OUTstd_logic; Mupdate:OUTstd_logic; PCupdate:OUTstd_logic; Cupdate:outstd_logic; cyout:OUTstd_logic;rtempin:INstd_logic_vector(7downto0);aluout:INstd_logic_vector(7downto0);Rdataout:OUTstd_logic_vector(7downto0)--Rtempout:OUTstd_logic_vector(15downto0));ENDCOMPONENT;--Inputssignalt3:std_logic:='0'; signalcyin:std_logic:='0';signalIRin:std_logic_vector(15downto0):=(others=>'0');signalPCin:std_logic_vector(15downto0):=(others=>'0');signalrtempin:std_logic_vector(7downto0):=(others=>'0');signalaluout:std_logic_vector(7downto0):=(others=>'0');signalpcjmp:std_logic_vector(15downto0):=(others=>'0'); --OutputssignalPCout:std_logic_vector(15downto0);signalRupdate:std_logic; signalMupdate:std_logic; signalPCupdate:std_logic; signalcyout:std_logic;signalRdataout:std_logic_vector(7downto0); signalCupdate:std_logic;--signalRtempout:std_logic_vector(15downto0);--Noclocksdetectedinportlist.Replace<clock>belowwith--appropriateportname--constant<clock>_period:time:=10ns;BEGIN --InstantiatetheUnitUnderTest(UUT)uut:WriteBackPORTMAP(t3=>t3,IRin=>IRin,PCin=>PCin, pcjmp=>pcjmp, cyin=>cyin, cyout=>cyout,PCout=>PCout,Rupdate=>Rupdate, Mupdate=>Mupdate, PCupdate=>PCupdate, Cupdate=>Cupdate,rtempin=>rtempin,aluout=>aluout,Rdataout=>Rdataout--Rtempout=>Rtempout);stim_proc:process begin --holdresetstatefor100ns.waitfor100ns; t3<='1'; IRin<="0101001000000101";--MOV waitfor100ns; IRin<="0100001000001111";--MVI waitfor100ns; PCin<="0000000000000101";--pc+1為0000000000000101IRin<="0001001001010101";--JZ aluout<="10101010"; waitfor100ns; pcjmp<="0000000011110000"; IRin<="0000000010101001";--jmpR7//10101001 waitfor100ns; IRin<="0111010101010101";--LDA rtempin<="10101010";waitfor100ns; IRin<="1000000000000000";--置1 cyin<='1'; waitfor100ns; IRin<="0011000100000010";--ADD aluout<="11110000"; cyin<='1';wait;endprocess;END;仿真波形:波形解釋:t3有效時,回寫模塊開始工作。指令5205,420f都是MOV/MVI,rdataout的值就是aluout,mupdate有效。指令1255,判斷R2為0,則PC+aluout,設(shè)置aluout為aa,為負數(shù)二進制數(shù)的補碼,aluout擴充為ffaa,加上pcin0005,則·pcOut為ffaf,指令00f0(測試的時候只考慮操作碼,對應(yīng)的輸入),跳轉(zhuǎn)pcjmp為00f0,pcout為00f0。7555取數(shù),rtempin送rdataout為aa。8000置1,cyout為1,cupdate有效。3102加法,aluout送radataout,有進位cyout為1。訪存控制模塊代碼:libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;entityMemControisport(t0,t2:instd_logic;--節(jié)拍控制rst:instd_logic;PCin,addrin:instd_logic_vector(15downto0);aluout:instd_logic_vector(7downto0);Rin,Win,RtoM:instd_logic;Rtemp:inoutstd_logic_vector(7downto0);IRout:outstd_logic_vector(15downto0);Abus:outstd_logic_vector(15downto0);Dbus:inoutstd_logic_vector(15downto0);Mreq,WR,RD,nBHE,nBLE:outstd_logic);endMemContro;architectureBehavioralofMemControissignalMAR,MDR:STD_LOGIC_VECTOR(15DOWNTO0);beginprocess(rst,Rin,Win,MAR,MDR,t0,t2,PCin,addrin,rtemp,aluout)beginif(rst='0')then if(t0='1'andRtoM='0')then--取指令 MAR<=PCin; Abus<=PCin; Dbus<="ZZZZZZZZZZZZZZZZ"; Mreq<='0'; RD<='0'; WR<='1'; nBHE<='0'; nBLE<='0'; MDR<=Dbus; IRout<=Dbus; elsif(t2='1')then if(Rin='0')then--取數(shù) MAR<=addrin; Abus<=addrin; Dbus<="ZZZZZZZZZZZZZZZZ"; nBLE<='0'; nBHE<='0'; Mreq<='0'; RD<='0'; WR<='1'; MDR<=Dbus; rtemp<=Dbus(7downto0);--取數(shù)的低8位 elsif(Win='0')then--存數(shù) MAR<=addrin; Abus<=addrin; MDR<="00000000"&aluout; Dbus<="00000000"&aluout; Mreq<='0'; RD<='1'; WR<='0'; nBLE<='0'; nBHE<='0'; endif; else Mreq<='1'; Dbus<="ZZZZZZZZZZZZZZZZ"; WR<='1'; RD<='1'; nBHE<='1'; nBLE<='1'; endif; else Mreq<='1'; Dbus<="ZZZZZZZZZZZZZZZZ"; WR<='1'; RD<='1'; nBHE<='1'; nBLE<='1'; endif; endprocess;endBehavioral;測試代碼:LIBRARYieee;USEieee.std_logic_1164.ALL;ENTITYMemContro_testISENDMemContro_test;ARCHITECTUREbehaviorOFMemContro_testIS--ComponentDeclarationfortheUnitUnderTest(UUT)COMPONENTMemControPORT(t0:INstd_logic;t2:INstd_logic;rst:INstd_logic;PCin:INstd_logic_vector(15downto0);addrin:INstd_logic_vector(15downto0);aluout:INstd_logic_vector(7downto0);Rin:INstd_logic;Win:INstd_logic; RtoM:INstd_logic;Rtemp:INOUTstd_logic_vector(7downto0);IRout:OUTstd_logic_vector(15downto0);Abus:OUTstd_logic_vector(15downto0);Dbus:INOUTstd_logic_vector(15downto0);Mreq:OUTstd_logic;WR:OUTstd_logic;RD:OUTstd_logic;nBHE:OUTstd_logic;nBLE:OUTstd_logic);ENDCOMPONENT;--Inputssignalt0:std_logic:='0';signalt2:std_logic:='0';signalrst:std_logic:='0';signalPCin:std_logic_vector(15downto0):=(others=>'0');signaladdrin:std_logic_vector(15downto0):=(others=>'0');signalaluout:std_logic_vector(7downto0):=(others=>'0');signalRin:std_logic:='0';signalWin:std_logic:='0';signalRtoM:std_logic:='0'; --BiDirssignalRtemp:std_logic_vector(7downto0);signalDbus:std_logic_vector(15downto0); --OutputssignalIRout:std_logic_vector(15downto0);signalAbus:std_logic_vector(15downto0);signalMreq:std_logic;signalWR:std_logic;signalRD:std_logic;signalnBHE:std_logic;signalnBLE:std_logic;--Noclocksdetectedinportlist.Replace<clock>belowwith--appropriateportname--constant<clock>_period:time:=10ns;BEGIN --InstantiatetheUnitUnderTest(UUT)uut:MemControPORTMAP
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 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è)擴大勞務(wù)分包合同范圍
- 采購協(xié)議庫存貨物合同
- 購車設(shè)備招標信息發(fā)布
- 放心使用保證書
- 租賃合同補充協(xié)議的制定要點解讀
- 電工工程施工作業(yè)分承包商
- 搬家運輸服務(wù)協(xié)議
- 熱處理技術(shù)創(chuàng)新合同
- 保證書格式創(chuàng)新案例分析
- 知識產(chǎn)權(quán)許可使用合同樣本
- SEER數(shù)據(jù)庫的申請及數(shù)據(jù)提取方法與流程
- 湖北省新中考語文現(xiàn)代文閱讀技巧講解與備考
- 幼兒園故事課件:《胸有成竹》
- (完整版)康復科管理制度
- 深度千分尺校準記錄表
- GB/T 10000-2023中國成年人人體尺寸
- 電工安全用具課件
- 北師大版四年級數(shù)學上冊《不確定性》評課稿
- 模板銷售合同模板
- 對越自衛(wèi)反擊戰(zhàn)專題培訓課件
- 小學生簡筆畫社團活動記錄
評論
0/150
提交評論