计算机设计与实践实验报告_第1页
计算机设计与实践实验报告_第2页
计算机设计与实践实验报告_第3页
计算机设计与实践实验报告_第4页
计算机设计与实践实验报告_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机设计与实践报告计算机设计与实践实验报告给定指令系统设计——CPU院系:计算机科学与技术姓名:***********学号:***********班级:************目录HYPERLINK实验目的 3HYPERLINK实验环境 3HYPERLINK设计思想 4HYPERLINKcpu接口信号定义 4HYPERLINK指令格式设计 4HYPERLINKRISC处理器设计格式 4HYPERLINK微操作的定义 6HYPERLINK节拍的划分 7HYPERLINK处理器结构设计框图及功能描述 7HYPERLINK各模块结构设计框图及功能描述 9HYPERLINK时钟模块 9HYPERLINK2)取指模块 10HYPERLINK3)运算模块 11HYPERLINK4)访存模块 12HYPERLINK5)回写模块 13HYPERLINK6)访存控制模块 14HYPERLINK进度安排 15HYPERLINK实验各模块的设计及仿真 16HYPERLINK时钟模块 16HYPERLINK产生节拍的代码: 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集成开发环境和ModeSim仿真工具的使用方法掌握VHDL语言掌握FPGA编程方法及硬件调试手段深刻理解处理器结构和计算机系统的整体工作原理实验环境XilinxISE集成开发环境、ModeSim或Isim仿真工具SD2100数字逻辑设计实验平台设计思想cpu接口信号定义信号名位数方向来源/去向意义RST1I处理器板高电平复位clk1I处理器板系统时钟nMREQ1O主存储器存储器片选nrd1O主存储器存储器读nwr1O主存储器存储器写nbhe1O主存储器高位字节访问允许nble1O主存储器低位字节访问允许abus16O主存储器地址总线dbus16I/O主存储器数据总线timeout4OFPGA-二极管节拍显示nirout1OFPGA-S0\S1指令显示ndbus16OFPGA-S3\S4数据总线内容显示nabus16OFPGA-S5\S2地址总线内容显示ncyout1OFPGA-A0进位标志位显示nbheout1OFPGA-A5高位字节访问允许显示nbleout1OFPGA-A4低位字节访问允许显示nmreqout1OFPGA-A7存储器片选显示nrdout1OFPGA-A6存储器读显示nwrout1OFPGA-A3存储器写显示k08IFPGA-K0控制使其显示寄存器npcout4OFPGA-B4-B7显示pc改变指令格式设计RISC处理器设计格式指令系统中指定所有的指令都是二进制指令通用寄存器的数量为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节拍的划分划分4个节拍节拍对应操作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系统时钟外接系统时钟rst1I系统复位外接系统复位t4O产生节拍节拍控制各个模块模块功能描述:时钟模块是一个四节拍的计数器,负责对各个模块输送节拍,以此来控制各个节拍协调工作。clk产生脉冲,t会循环改变t(i)的值,每次都只有一个1,达到节拍的效果。当复位信号有效,才会都变成02)取指模块信号接口定义:信号名位数方向来源/去向意义T01I时钟模块第一个节拍取指Rst1I系统复位系统复位Pcin16I访存控制回写的pc送给pcRupdate1I回写模块回写模块控制pc更新控制Pcout16O回写模块Pc送往回写模块Pcout_m16O访存控制Pc送往访存控制Irin16I访存控制访存控制取出的指令送取指模块Rout1O访存控制取指的读信号送完访存控制irout16O运算模块指令输出便其他模块使用模块功能描述:t0节拍控制取指模块工作。Rst复位pc,回到初始地址。Rupdate负责pc更新的值送到pc,形成新的地址。取指模块主要功能是送地址给访存控制,取出指令到IR.3)运算模块信号接口定义:信号名位数方向来源/去向意义Rupdate1I回写模块回写数据控制信号Mupdate1I回写模块Mvi/mov回写控制Cupdate1I回写模块进位回写控制Rdata8I回写模块回写的数据T11I时钟模块节拍控制Cyin1I回写模块进位输入Cyout1O进位送回写进位输出至回写Irin16I指令输入指令输入aluAluout8O送回写/访存控制运算等结果输出pcjmp16O跳转指令至pc跳转指令送到取指的pcAddr16O形成地址送访存指令形成地址送访存控制Regout0-Regout78O寄存器输出显示寄存器引出到cpu,显示寄存器功能描述:t1节拍控制alu,在alu中执行各条指令。根据IRin指令的操作码,执行指令,结果从aluout,cyout,addr送出。回写的时候,Rupdate控制回写数据送入,cupdate控制进位回写,Mupdate控制mov/mvi的回写数据。其中pcjmp是直接跳转的地址送往pc。其中显示寄存器,将Regout0-Regout7引出到cpu4)访存模块信号接口定义:信号名位数方向来源/去向意义T21I时钟模块节拍控制访存模块Irin16I取指ir输出指令输入,发读写信号Rtempin8I访存控制存储器中取出的数输入Rtempout8O回写模块暂存的数送回写Wout1O送访存控制发写信号rout1O送访存控制发读信号功能描述:t2控制访存模块,主要是取数的时候,取出的数暂存在访存模块,然后通过回写送到对应的寄存器5)回写模块信号接口定义:信号名位数方向来源/去向意义T31I时钟模块节拍控制回写Irin16I取指模块IR输出指令上操作码给出对应控制Pcin16I取指模块Pc值输入Pcjmp16I运算模块Jmp跳转地址回写Pcout16O送取指模块回写新pc回写Rupdate1O送运算模块回写控制回写运算、取数数据控制Mupdate1O送运算模块回写控制回写mov/mvi数据控制Pcupdate1O送取指模块回写控制Pc回写控制Cupdate1O送运算模块回写控制进位回写控制Rtempin8I访存模块取出的数送回写Aluout8I运算模块运算等结果送回写Cyin1I运算模块进位结果送回写cyout1O送运算模块回写进位结果回写至运算模块Rdataout8O送运算模块回写数据回写至运算模块功能描述:t3节拍控制回写模块的工作。回写模块主要是将各个指令产生的结果暂时送到回写模块里,然后在相对应的时间送到对应的地方。加减运算结果,mov/mvi结果,取数结果,pc更新的结果以及进位都暂存在回写模块,通过指令译码,在对应的指令上添加控制信号:Rupdate,mupdate,cupdate,pcupdate。再送取指和运算模块。6)访存控制模块信号接口定义 :信号名位数方向来源/去向意义T01I时钟模块时钟产生的节拍控制T21I时钟模块时钟产生的节拍控制Rst1I系统复位系统复位Pcin16I取指模块取指送的pc至存储器,取出指令Addrin16I运算模块形成的地址送存储器Aluout8I运算模块运算结果送存储器存Rin16I访存模块访存模块读信号Win1I访存模块访存模块发写信号Rtom1I取指模块取指发的读信号Rtemp8I/O数据送访存模块取数取出的数据Irout16O取指输出指令取出的指令放回取指模块Abus16O存储器地址总线存储器地址总线Dbus16I/O存储器数据总线存储器数据总线给数据Mreq1O存储器片选存储器片选控制信号Wr1O存储器写存储器写控制Rd1O存储器读存储器读控制Nbhe1O存储器高位字节存储器高位字节访问允许nble1O存储器低位字节存储器低位字节访问允许功能描述:访存控制模块主要是与存储器相连接,能够从存储器中取数据,指令,能将数据、地址送到存储器中存储。t0t2两个节拍分别控制不同的操作,t0是取指的时候,从存储器中读出指令;t2则是在需要访存的时候,由访存模块给读写信号,使访存控制对应存储器操作。进度安排第二周完成所有的仿真,在硬件实验平台上调试第二周完成所有的仿真,在硬件实验平台上调试第三周写实验报告,第三周写实验报告,准备考试第一周完成总体设计及各个模块代码编写实验各模块的设计及仿真时钟模块产生节拍的代码: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--产生节拍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';--节拍wait;endprocess;END;仿真波形:波形解释:当rst有效,t全为0,此时为复位。rst无效,随着时钟的上升沿,产生一个一个节拍。四个节拍循环产生。取指模块代码: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';--系统复位 waitfor100ns;rst<='0'; Rupdate<='1';--回写 PCin<="0000000000000001";--pc+1 waitfor100ns; Rupdate<='0'; t0<='1';--取指 IRin<="0011000100000010";--加法指令wait;endprocess;END;仿真波形:波形解释:RST有效时,pc清0,初始化。当t0节拍来了之后,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;--节拍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--节拍控制 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有效,执行指令3102,即R1+R2->aluout。99+dd+1=77,有进位为1.故cyout为1。指令2102执行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是存数,发出写信号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;--节拍控制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. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论