計算機設計與實踐實驗報告_第1頁
計算機設計與實踐實驗報告_第2頁
計算機設計與實踐實驗報告_第3頁
計算機設計與實踐實驗報告_第4頁
計算機設計與實踐實驗報告_第5頁
已閱讀5頁,還剩89頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

計算機設計與實踐報告計算機設計與實踐實驗報告給定指令系統(tǒng)設計——CPU院系:計算機科學與技術姓名:***********學號:***********班級:************目錄HYPERLINK實驗目的 3HYPERLINK實驗環(huán)境 3HYPERLINK設計思想 4HYPERLINKcpu接口信號定義 4HYPERLINK指令格式設計 4HYPERLINKRISC處理器設計格式 4HYPERLINK微操作的定義 6HYPERLINK節(jié)拍的劃分 7HYPERLINK處理器結構設計框圖及功能描述 7HYPERLINK各模塊結構設計框圖及功能描述 9HYPERLINK時鐘模塊 9HYPERLINK2)取指模塊 10HYPERLINK3)運算模塊 11HYPERLINK4)訪存模塊 12HYPERLINK5)回寫模塊 13HYPERLINK6)訪存控制模塊 14HYPERLINK進度安排 15HYPERLINK實驗各模塊的設計及仿真 16HYPERLINK時鐘模塊 16HYPERLINK產生節(jié)拍的代碼: 16HYPERLINK仿真波形: 18HYPERLINK取指模塊 19HYPERLINK代碼: 19HYPERLINK仿真波形: 22HYPERLINKALU運算模塊 22HYPERLINK代碼: 22HYPERLINK仿真波形: 27HYPERLINK訪存模塊 29HYPERLINK代碼: 29HYPERLINK仿真波形: 31HYPERLINK回寫模塊 31HYPERLINK代碼: 31HYPERLINK仿真波形: 37HYPERLINK訪存控制模塊 38HYPERLINK代碼: 38HYPERLINK仿真波形: 42HYPERLINKcpu元件例化 44HYPERLINK代碼: 44HYPERLINK仿真波形: 51HYPERLINKUCF文件: 58HYPERLINK總體測試結果及說明 61HYPERLINK測試指令序列 61HYPERLINK設計、調試、下載中遇到問題及解決方案 62HYPERLINK1、設計中遇到的問題及解決方案 62HYPERLINK2、調試中遇到的問題及解決方案 62HYPERLINK3、下載中遇到的問題及解決方案 62HYPERLINK實驗總結 63實驗目的掌握XilinxISE集成開發(fā)環(huán)境和ModeSim仿真工具的使用方法掌握VHDL語言掌握FPGA編程方法及硬件調試手段深刻理解處理器結構和計算機系統(tǒng)的整體工作原理實驗環(huán)境XilinxISE集成開發(fā)環(huán)境、ModeSim或Isim仿真工具SD2100數字邏輯設計實驗平臺設計思想cpu接口信號定義信號名位數方向來源/去向意義RST1I處理器板高電平復位clk1I處理器板系統(tǒng)時鐘nMREQ1O主存儲器存儲器片選nrd1O主存儲器存儲器讀nwr1O主存儲器存儲器寫nbhe1O主存儲器高位字節(jié)訪問允許nble1O主存儲器低位字節(jié)訪問允許abus16O主存儲器地址總線dbus16I/O主存儲器數據總線timeout4OFPGA-二極管節(jié)拍顯示nirout1OFPGA-S0\S1指令顯示ndbus16OFPGA-S3\S4數據總線內容顯示nabus16OFPGA-S5\S2地址總線內容顯示ncyout1OFPGA-A0進位標志位顯示nbheout1OFPGA-A5高位字節(jié)訪問允許顯示nbleout1OFPGA-A4低位字節(jié)訪問允許顯示nmreqout1OFPGA-A7存儲器片選顯示nrdout1OFPGA-A6存儲器讀顯示nwrout1OFPGA-A3存儲器寫顯示k08IFPGA-K0控制使其顯示寄存器npcout4OFPGA-B4-B7顯示pc改變指令格式設計RISC處理器設計格式指令系統(tǒng)中指定所有的指令都是二進制指令通用寄存器的數量為8,需要3位地址與之對應訪存的形式地址為8位定義指令的高5位表示操作碼寄存器-寄存器型指令5353OPAD1AD2其他指令類型538OPAD1AD2實驗中指令設計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微操作的定義指令名稱助記符二進制操作碼無條件跳轉JMP00000條件跳轉JZ00010減法操作SUB00100加法操作ADD00110立即數傳送MVI01000寄存器傳送MOV01010存數操作STA01100取數操作LDA01110進位置1SET110000進位置0SET010010節(jié)拍的劃分劃分4個節(jié)拍節(jié)拍對應操作T0取指操作T1運算ALUT2訪存操作T3回寫操作處理器結構設計框圖及功能描述clk時鐘模塊Cpu總體設計圖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主存儲器主存儲器功能:設計的cpu是一個簡單的RISC處理器,該處理器是在給定的指令集下構建,支持以上的十條指令。主存在一個時鐘周期內完成一次存取操作,而且和cpu同步工作。能根據自己設計的指令完成以上的操作。并將其部分顯示在SD2100數字邏輯設計實驗平臺。各模塊結構設計框圖及功能描述時鐘模塊 信號接口定義:信號名位數方向來源/去向意義clk1I系統(tǒng)時鐘外接系統(tǒng)時鐘rst1I系統(tǒng)復位外接系統(tǒng)復位t4O產生節(jié)拍節(jié)拍控制各個模塊模塊功能描述:時鐘模塊是一個四節(jié)拍的計數器,負責對各個模塊輸送節(jié)拍,以此來控制各個節(jié)拍協(xié)調工作。clk產生脈沖,t會循環(huán)改變t(i)的值,每次都只有一個1,達到節(jié)拍的效果。當復位信號有效,才會都變成02)取指模塊信號接口定義:信號名位數方向來源/去向意義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)運算模塊信號接口定義:信號名位數方向來源/去向意義Rupdate1I回寫模塊回寫數據控制信號Mupdate1I回寫模塊Mvi/mov回寫控制Cupdate1I回寫模塊進位回寫控制Rdata8I回寫模塊回寫的數據T11I時鐘模塊節(jié)拍控制Cyin1I回寫模塊進位輸入Cyout1O進位送回寫進位輸出至回寫Irin16I指令輸入指令輸入aluAluout8O送回寫/訪存控制運算等結果輸出pcjmp16O跳轉指令至pc跳轉指令送到取指的pcAddr16O形成地址送訪存指令形成地址送訪存控制Regout0-Regout78O寄存器輸出顯示寄存器引出到cpu,顯示寄存器功能描述:t1節(jié)拍控制alu,在alu中執(zhí)行各條指令。根據IRin指令的操作碼,執(zhí)行指令,結果從aluout,cyout,addr送出?;貙懙臅r候,Rupdate控制回寫數據送入,cupdate控制進位回寫,Mupdate控制mov/mvi的回寫數據。其中pcjmp是直接跳轉的地址送往pc。其中顯示寄存器,將Regout0-Regout7引出到cpu4)訪存模塊信號接口定義:信號名位數方向來源/去向意義T21I時鐘模塊節(jié)拍控制訪存模塊Irin16I取指ir輸出指令輸入,發(fā)讀寫信號Rtempin8I訪存控制存儲器中取出的數輸入Rtempout8O回寫模塊暫存的數送回寫Wout1O送訪存控制發(fā)寫信號rout1O送訪存控制發(fā)讀信號功能描述:t2控制訪存模塊,主要是取數的時候,取出的數暫存在訪存模塊,然后通過回寫送到對應的寄存器5)回寫模塊信號接口定義:信號名位數方向來源/去向意義T31I時鐘模塊節(jié)拍控制回寫Irin16I取指模塊IR輸出指令上操作碼給出對應控制Pcin16I取指模塊Pc值輸入Pcjmp16I運算模塊Jmp跳轉地址回寫Pcout16O送取指模塊回寫新pc回寫Rupdate1O送運算模塊回寫控制回寫運算、取數數據控制Mupdate1O送運算模塊回寫控制回寫mov/mvi數據控制Pcupdate1O送取指模塊回寫控制Pc回寫控制Cupdate1O送運算模塊回寫控制進位回寫控制Rtempin8I訪存模塊取出的數送回寫Aluout8I運算模塊運算等結果送回寫Cyin1I運算模塊進位結果送回寫cyout1O送運算模塊回寫進位結果回寫至運算模塊Rdataout8O送運算模塊回寫數據回寫至運算模塊功能描述:t3節(jié)拍控制回寫模塊的工作?;貙懩K主要是將各個指令產生的結果暫時送到回寫模塊里,然后在相對應的時間送到對應的地方。加減運算結果,mov/mvi結果,取數結果,pc更新的結果以及進位都暫存在回寫模塊,通過指令譯碼,在對應的指令上添加控制信號:Rupdate,mupdate,cupdate,pcupdate。再送取指和運算模塊。6)訪存控制模塊信號接口定義 :信號名位數方向來源/去向意義T01I時鐘模塊時鐘產生的節(jié)拍控制T21I時鐘模塊時鐘產生的節(jié)拍控制Rst1I系統(tǒng)復位系統(tǒng)復位Pcin16I取指模塊取指送的pc至存儲器,取出指令Addrin16I運算模塊形成的地址送存儲器Aluout8I運算模塊運算結果送存儲器存Rin16I訪存模塊訪存模塊讀信號Win1I訪存模塊訪存模塊發(fā)寫信號Rtom1I取指模塊取指發(fā)的讀信號Rtemp8I/O數據送訪存模塊取數取出的數據Irout16O取指輸出指令取出的指令放回取指模塊Abus16O存儲器地址總線存儲器地址總線Dbus16I/O存儲器數據總線存儲器數據總線給數據Mreq1O存儲器片選存儲器片選控制信號Wr1O存儲器寫存儲器寫控制Rd1O存儲器讀存儲器讀控制Nbhe1O存儲器高位字節(jié)存儲器高位字節(jié)訪問允許nble1O存儲器低位字節(jié)存儲器低位字節(jié)訪問允許功能描述:訪存控制模塊主要是與存儲器相連接,能夠從存儲器中取數據,指令,能將數據、地址送到存儲器中存儲。t0t2兩個節(jié)拍分別控制不同的操作,t0是取指的時候,從存儲器中讀出指令;t2則是在需要訪存的時候,由訪存模塊給讀寫信號,使訪存控制對應存儲器操作。進度安排第二周完成所有的仿真,在硬件實驗平臺上調試第二周完成所有的仿真,在硬件實驗平臺上調試第三周寫實驗報告,第三周寫實驗報告,準備考試第一周完成總體設計及各個模塊代碼編寫實驗各模塊的設計及仿真時鐘模塊產生節(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--產生節(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無效,隨著時鐘的上升沿,產生一個一個節(jié)拍。四個節(jié)拍循環(huá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送出指令IRout。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無條件跳轉 pcjmp<=myreg(7)&IRin(7downto0);--R7//X->PC when"00010"=>--JZ有條件跳轉 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立即數傳送 aluout<=IRin(7downto0);--MVIX->Ri when"01010"=>--MOV寄存器傳送 aluout<=myreg(conv_integer(IRin(2downto0)));--MOVRj->Ri when"01100"=>--STA(Ri->R7//x)存數操作 aluout<=myreg(conv_integer(IRin(10downto8))); addr<=myreg(7)&IRin(7downto0); when"01110"=>--LDA取數操作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跳轉,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,由于在內部變量直接置進位,波形上沒有。訪存模塊代碼: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的數據 waitfor100ns; IRin<="0000000000000000";wait;endprocess;END;仿真波形:波形解釋:訪存模塊主要的功能是在存取的時候給出讀寫信號,并在取數的過程中暫存數據。波形中t2有效時,指令62aa是存數,發(fā)出寫信號WOUT為0,有效。7555為取數,讀信號ROUT有效,數據從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,設置aluout為aa,為負數二進制數的補碼,aluout擴充為ffaa,加上pcin0005,則·pcOut為ffaf,指令00f0(測試的時候只考慮操作碼,對應的輸入),跳轉pcjmp為00f0,pcout為00f0。7555取數,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--取數 MAR<=addrin; Abus<=addrin; Dbus<="ZZZZZZZZZZZZZZZZ"; nBLE<='0'; nBHE<='0'; Mreq<='0'; RD<='0'; WR<='1'; MDR<=Dbus; rtemp<=Dbus(7downto0);--取數的低8位 elsif(Win='0')then--存數 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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論