《猫和老鼠游戏实验报告.docx》由会员分享,可在线阅读,更多相关《猫和老鼠游戏实验报告.docx(24页珍藏版)》请在课桌文档上搜索。
1、信息与通信工程学院班级:2009211120班姓名:李川学号:09210591题目:经典数学游戏一.任务要求实验内容:一个人要将1只狗,1只猫,1只老鼠渡过河,独木舟一次只能装载和一只动物,但猫和狗不能单独在一起,而猫和老鼠也不能友好相处,试模拟这个人将三只动物安全渡过河的过程。用发光二极管亮点的移动模拟独木舟渡河的过程,选中渡河的动物及两岸的动物都应有显示,若选错应有报警显示,且游戏失败,按复位键游戏重新开始。当三只动物均安全度过河时,游戏成功,并显示此次游戏独木舟往返渡河的次数。提高要求:游戏难度可设置,选错动物允许有一次修改机会。二.系统设计设计思路:用4个按钮分别用来选择人,狗,猫,鼠
2、,8个LED来表示人和动物的状态,左边4个代表左岸状态,右边4个代表右岸状态,船用点阵上的LED灯表示,灯右移代表船从左岸划到右岸,左移代表船从右岸划到左岸,失败和成功另外用点阵上的2个点表示。总体框图及分块设计:系统结构总框系统结构图(模块划分和传递关系)逻辑划分框图MDS图控制逻辑图(画在预习报告中,无法复制,截屏)三.仿真波形及仿真分析Dps163.84us327.8us491.52us655us819.2us98394us1.邛ms1.31ms1.4Jms1.64ms1.8as1.97m;17.55ns2ms时钟分频仿真图,clkl周期为lms,是自己所需的,证明计算的分频的数字正确,
3、4Hz的clk2周期太长,就不进行仿真ns420.0ns440.0ns460.0ns480.0ns500.pns520.0ns540.pnsManeValueat16.98 nsmanB 1catB 1elkB 0clklB 0dogB 0enterB 1 plB Hll PrB OooOratB 0rstB 0successB 0failB 0court .BO)PS335.542671.09 ms1.01 s16.975 ns-TnTT0101模拟渡河的一步(错误的一步,报错fail=l),f.pJU.UJNlWJYCll3J.,NfW*.I80.RSA1V、Valueat-1J!16.9
4、8ns之之*88之331B1BOBOBOB1BHllBOOOOBOBOBOBOOKn复位,reset=1,pl=111,pr=0000,各自复位仿真图后面随便乱加的,因为我觉得此实验仿真过程较为复杂,还不如直接下载到板子上来找问题方便直接,故仿真图很粗糙。四.源程序-过河游戏-libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entityghlisport(clock:instdOgic;-时钟信号,50MHzmank,dogk,catk,ratk:
5、instdOgic;-人,狗,猫,老鼠的开关信号enterk:instd_logic;-确认开关信号resetk:instd_logic;-复位开关信号pl,pr:outstdOgiC_VeCtor(3downtoO);-河两岸动物的状态boat:outstd_logic_vector(13downtoO);-船灯信号lose,win:outstd_logic;-失败、成功的信号steph,stepl:outstd_logic_vector(6downto0);-数码管的驱动信号-顶层模块end;architecturejgofghliscomponentfenpinport(cp:instd
6、_logic;cpl,cp2:outStdJogic);endcomponent;-调用分频器模块componentfangdouport(elk,key:inStdJogic;q:outstd_logic);endcomponent;-调用防抖动模块。componentshumaguan-调用译码显示模块。port(num:instd_logic_vector(3downto0);step:outstd_logic_vector(6downto0);endcomponent;componentguohe-调用过河控制模块。port(elk,elk1:instd_logic;man,dog,c
7、at,rat:inStdJogic;enter:inStdJogic;reset:instd_logic;pl,pr:outstd_logic_vector(3downtoO);counth,countl:outstd_logic_vector(3downtoO);boats:outstd_logic_vector(13downtoO);fail,success:outstdOgiC);endcomponent;signaltemp1,temp2,temp3,c1,c2:std_logic;signaltemp4,temp5,temp6:std_logic;signalcoh,col:std_
8、logic_vector(3downtoO);beginul:fenpinportmap(clock,cl,c2);u2:fangdouportmap(c1,mank,temp1);u3:fangdouportmap(c1,dogk,temp2);u4:fangdouportmap(c1,catk,temp3);u5:fangdouportmap(c1,ratk,temp4);u6:fangdouportmap(c1,enterk,temp5);u7:fangdouportmap(c1,resetk,temp6);u8:guoheportmap(cl,c2,temp1,temp2,temp3,
9、temp4,temp5,temp6,pl,pr,coh,col,boat,lose,win);u9:shumaguanportmap(coh,steph);ul:shumaguanportmap(col,stepl);endjg;-防抖模块libraryieee;useieee.std_logic_1164.all;entityfangdouisport(clk:instdOgic;-时钟信号,1kHz。key:inStdJogic;-有抖动的开关信号。q:outStdJogic);-防抖动电路输出的无抖动信号。end;architecturefangdou1offangdouissignal
10、cp:std_logic;signaljsp:integerrangeOto3;beginprocess(clk,cp)beginif(clk,eventandclk=,0)thenifkey=1,thenifjsp=3thenjsp=jsp;elsejsp=jsp+l;endif;ifjsp=lthencp-;elsecp=,0,;endif;elsejsp=O;endif;endif;q=cp;endprocess;end;-分频模块libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_
11、logic_unsigned.all;entityfenpinisport(cp:instd_logic;-时钟信号,50MHZcp1,cp2:outstdOgiC);-lkHz、2.5Hz的信号endfenpin;architecturestructoffenpinissignalclkl,clk2,clk3:StdJogic;signaltemp:std_logic_vector(6downtoO);signaltempi:std_logic_vector(8downtoO);signaltemp2:std_logic_vector(8downtoO);beginfpkprocess(cp
12、)beginifrising_edge(cp)thenif(temp=llOOO1,)thenclkl=notclkl;temp=0000000;elsetemp=temp+1;endif;endif;endprocessfp1;fp2:process(clkl)beginifrising_edge(clk1)thenif(templ=,11110111,)thenclk2=notclk2;templ=000000000;elsetempl=temp1+1;endif;endif;endprocessfp2;fp3:process(clk2)beginifrising_edge(clk2)th
13、enif(temp2=l1000111,)thenclk3=notclk3;temp2=000000000;elsetemp2=temp2+l;endif;endif;endprocessfp3;cpl=clk2;cp2=clk3;endstruct;-过河控制模块libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityguoheis-人、狗、猫和鼠的开-确认开关信号。-复位开关信号。河两岸动物的状态。port(clk,clkkinstdogic;man,dogman,dog,cat,rat:inS
14、tdJogic;关动作信号enter:inStdJogic;reset:instd_logic;pl,pr:outstd_logic_vector(3downtoO);counth,countl:outstd_logic_vector(3downto0);-过河次数。boats:outstd_logic_vector(13downto0);-船灯信号。fail,success:outstd_logic);endguohe;architecturestructofguoheissignalch,cl:std_logic_vector(3downto0);signalstate:std_logic
15、_vector(3downto0);signalenable:std_logic;signalriver,river1:std_logic;signalside:std_logic;signalboat:std_logic_vector(1:signalfirst:stdOgic;signalms,ds,cs,rs:std_logic;beginpl:process(clk)beginif(rising_edge(clk)thenif(reset=*1,)thenstate=OOOO*;左边状态全为T。fail=O;success=,O;enable=,O;ch=OOOO,;cl=OOOO;m
16、s=,0,;ds=O,;cs=O;rs=,O,;riverl=0,;side=,O;first=,O;elseif(river=,O,andriverl=10,)thenif(enable=,O,)thenif(man=l,)thenstate(3)=notstate(3);ms=notms;first=,;endif;if(dog-)thenstate(2)=notstate(2);ds=notds;first=,:-成功、警告信号。-复位信号有效。-右边状态全为0,同时-若不处于运输过程。-按下表示人的开关。-人的状态改变。endif;if(cat=l,)thenstate(1)=nots
17、tate(1);cs=notcs;first=;endif;if(rat=l,)thenstate(0)=notstate(0);rs=notrs;first=,;endif;-有确认信号。if(enter=,)then- -对过河次数的处理。if(cl=100()thenif(ch=n100,)thench=ch;cl=cl;fail=,1enable=,;- -若过河次数的高位也计到9,则判为失败。elsech=ch+l;cl=,0000;endif;elsecl=cl+l;endif;side=notside;river1=;- -失败和成功的判断。if(ms-0,)thenfail=1
18、,;enable=1;river1=,0,;-人没有上船,过河失败。- 人和动物在河的两边却同时上船的失败判断。elsif(ds=andstate(3)=,andstate(2)=0,)thenfail=r;enable=r;river1=,0;elsif(ds=andstate(3)=O,andstate(2),1)thenfail=1,ienable=*lriverl-0,;elsif(cs-andstate(3)=,andstate(1)=,O,)thenfail,l;enable=riverl-O;elsif(cs=,l,andstate(3)=O,andstate(l)-l,)the
19、nfail=r;enable=,l;riverl-0;elsif(rs-1andstate(3)=,l,andstate(O)=,O,)thenfail=1;enable=1;river1-0,;elsif(rs=andstate(3)=,O,andState(O)-)thenfail=r;enable=,r;riverl-0;elsif(dsandcs)=,thenfail=r;enable=I;riverl-0,;elsif(csandrs)=,thenfail=,lenable=,lriverl=,0;elsif(dsandrs)=,thenfail=r;enable=,l;river1
20、=,O;elsif(state=1001orState=nIlOOorState=nOO1,orstate=0110orstate=011lorstate=1000)thenfail=,1enable,1;river1=0,;elseif(state=n111,)thensuccess=*lenable=,;endif;endif;ms=,0ds=,0cs=,0rs=0;endif;endif;-运输过程。elseif(side=andboat(0)=l,)thenriverl=,0,;-若从左往右运输且右边的船灯已经亮,则运输过程结束。elsif(side=Oandboat(2)-l)the
21、nriverl=0,;-若从右往左运输且左边的船灯已经亮,则运输过程结束。endif;endif;endif;endif;endprocesspl;p2:process(clk1,cl,ch)-第一次运输开始前。-左边的船灯-人在左边。-左边的船灯beginif(cl=OOOOandch=OOOO)thenboat=OOO111011111000;亮。elseif(rising_edge(clk1)thenif(riverl=,0,)thenif(enable=,0,)thenif(side=,O,)thenboat=00011IOll11100;凫。elsif(side-l)thenboat
22、=0001110111100,;endif;elseboat=boat;endif;elseif(side-)then-从左往右运输。boat(0)=boat(1);boat(1)=boat(2);boat(2)=0,;船灯从左往右依次亮。if(boat(l)=,)thenriver=0,;endif;elseboat(2)=boat(l);boat(1)=boat(0);boat(0)=,0,;if(boat(l)=,)thenriver=,0,;endif;endif;endif;endif;endif;endprocessp2;p3:process(clkl,first)-初始状态。-左
23、边的状态全为T,右边全为-从左往右运输且左边的船灯亮,即运beginif(first=,O,)thenforiin0to3looppl(i)=,r(i)=O;endloop;elseif(rising_edge(clk1)thenif(side=andboat(2)=,l,)then输刚开始。foriin0to3loopif(state(i)=,0)thenpl(i)=,;elsePKi)V=O;endif;endloop;elsif(side-1andboat(0)=,l,)then-从左往右运输且右边的船灯亮,即运输结束。foriin0to3loopif(state(i)=,0)thenp
24、r(i)=,0,;elsepr(i)=,;endif;endloop;elsif(side=Oandboat(0)=,l,)then-从右往左运输且右边的船灯亮,即运输刚开始。foriin0to3loopif(state(i)=,0)thenpr(i)=,01;elsepr(i)=;endif;endloop;elsif(side=Oandboat(2)=,)then-从右往左运输且左边的船灯亮,即运输结束。foriin0to3loopif(state(i)=0)thenpl(i)=,;elsepl(i)=V;endif;endloop;endif;endif;endif;endprocess
25、p3;counth=ch;countl=cl;boats=boat;end;-数码显示模块libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityguoheisport(clk,clkl:instd_logic;man,dogman,dog,cat,rat:instd_logic;-人、狗、猫和鼠的开关动作信号enter:instdOgic;-确认开关信号。reset:inStdJogic;-复位开关信号。pl,pr:outstd_logic_vector(3downtoO);河两岸动物的状态。co
26、unth,countl:outstd_logic_vector(3downtoO);-过河次数。boats:outstd_logic_vector(13downtoO);-船灯信号。fail,success:outstd_logic);-成功、警告信号。endguohe;architecturestructofguoheissignalch,cl:StdJogic_vector(3downtoO);signalstate:std_logic_vector(3downtoO);signalenable:std_logic;signalriver,river1:StdJogic;signalsid
27、e:stdOgic;signalboat:std_logic_vector(13downto0);signalfirst:stdogic;signalms,ds,cs,rs:std_logic;beginpl:process(clk)beginif(rising_edge(clk)thenif(reset=11,)thenstate=OOOO*;左边状态全为T。fail=O;success=,0;enable=,0;ch=0000,;CK=uOOOOn;ms=,0;ds=,O,;cs=O;rs=,O,;riverl=0,;side=,O;first=,O;elseif(river=,0,and
28、riverl=,0,)thenif(enable=O,)thenif(man=,l)thenstate(3)=notstate(3);ms=notms;first=,;endif;if(dog-)thenstate(2)=notstate(2);ds=notds;first=,;endif;if(cat=,)thenstate(1)=notstate(l);cs=notcs;first=,;endif;if(rat=)thenstate(0)=notstate(O);-复位信号有效。-右边状态全为O,同时-若不处于运输过程。-按下表示人的开关。-人的状态改变。rs=notrs;first=,;
29、endif;if(enter=)then-有确认信号。- -对过河次数的处理。if(cl=,100,)thenif(ch=100|)thench=ch;cl=cl;fail=,r;enable=,r;- 若过河次数的高位也计到9,则判为失败。elsech=ch+1d=,OOOO;endif;elsecl=cl+l;endif;side=notside;riverl=l,;- -失败和成功的判断。if(ms=,0,)thenfail,1nable=t1,;river1=,0,;-人没有上船,过河失败。- -人和动物在河的两边却同时上船的失败判断。elsif(ds=andstate(3)=ands
30、tate(2)=,0,)thenfail=1;enable=,1,;riverl=,0;elsif(ds=andstate(3)=,O,andstate(2)=,l)thenfail=r;enable=,l;river1=,0;elsif(cs=,andstate(3)-andstate(1)=O)thenfail=1;enable=,1,;riverl=,0;elsif(cs=,andstate(3)=O,andstate(1)=1)thenfail=r;enable=,l;river1=,0;elsif(rs=,landstate(3)=,andstate(O)=,O,)thenfail=
31、1;enable=,1,;riverl=,0;elsif(rs=,andstate(3)=,O,andstate(O)=)thenfail=r;enable=,l;riverl=,0,;elsif(dsandcs)=l,thenfail=1;enable=,1,;riverl=,0;elsif(csandrs)=,thenfail=r;enable=,l;river1=,0;elsif(dsandrs)=thenfail=1;enable=,1,;river1=,O;elsif(state=,1001,orstate=11OOorState=nOO1,orState=nOl10uorState
32、=nOl11orstate=1000)thenfail=r;enable-r;riverl-O;elseif(state=n111,)thensuccess=lenable=,;endif;endif;ms=,Ods=,Ocs=,Ors=,O;endif;endif;-运输过程。elseif(side=,andboat(0)=,l,)theriverl=,0;-经亮,则运输过程结束。elsif(side=Oandboat(2)=)thenriverl=,0,;-经亮,则运输过程结束。endif;endif;endif;endif;endprocesspl;p2:process(clk1,cl,
33、ch)beginif(cl=OOOOandch=OOOO)thenboat=00011101111100;亮。elseif(rising_edge(clk1)thenif(riverl=,0,)thenif(enable=0)thenif(side=O,)thenboat=00011101111100;亮。elsif(side-)thenboat=0001110111100,;endif;elseboat=boat;endif;elseif(side-)thenboat(0)=boat(1);boat(1)=boat(2);boat(2)=,0,;if(boat(l)=,)thenriver=
34、,0,;endif;elseboat(2)=boat(l);boat(l)=boat(0);boat(0)=,0,;if(boat(l)=,)then若从左往右运输且右边的船灯已若从右往左运输且左边的船灯已-第一次运输开始前。-左边的船灯-人在左边。-左边的船灯-从左往右运输。船灯从左往右依次亮。river=0,;endif;endif;endif;endif;endif;endprocessp2;p3:process(clkl,first)beginif(first=O)thenforiin0to3looppl(i)=,ipr(i)=,0;endloop;elseif(rising_edge
35、(clk1)thenif(side=,andboat(2)=)then-初始状态。-左边的状态全为T,右边全为。-从左往右运输且左边的船灯亮,即运输刚开始。foriin0to3loopif(state(i)=,0)thenpl(i)=,;elsepl(i)=,0,;endif;endloop;elsif(side-andboat(0)=)then- -从左往右运输且右边的船灯亮,即运输结束。foriin0to3loopif(state(i)=0)thenpr(i)=01;elsepr(i)=;endif;endloop;elsif(side=Oandboat(0)=l)then- -从右往左运
36、输且右边的船灯亮,即运输刚开始。foriin0to3loopif(state(i)=,0)thenpr(i)=,01;elsepr(i)=;endif;endloop;elsif(side=Oandboat(2)=,l,)then- -从右往左运输且左边的船灯亮,即运输结束。foriin0to3loopif(state(i)=,O,)thenpl(i)=,;elsepl(i)=,O,;endif;endloop;endif;endif;endif;endprocessp3;counth=ch;countl=cl;boats=boat;end;五.功能说明左右岸动物均有表示,选中的动物灯熄灭点阵
37、点的移动代表船的渡河动作成功或失败均有提示船每过河一次,数码管显示+1任何时候按下复位键,游戏重新开始六.元器件清单及资源利用情况元器件清单:LED灯:8个按钮:6个七段数码管点阵资源利用情况:FlowStatusSuccessful-MonNov0714:39:292011QuartusIIVersion9.0Build13202/25/2009SJFullVersionRevisionNameghlTop-levelEntityNameghlFamilyMAXIIDeviceEPM1270T144C5TimingModelsFinalMettimingrequirementsNoTotal
38、logicelements148/1,270(12%)Totalpins45/116(39%)Totalvirtualpins0UFMblocks0/1(0%)七 .故障及问题分析编译时,考虑最多的是过河的逻辑,没有考虑太多的与硬件的结合编程,到第三次检查时最重要的过河逻辑也没有编出来,当然无仿真图可言,后面是自己在网上找的一段代码,虽然起先编译未能通过,但问题不大,只用改改些许地方就行了,他采用的是if嵌套,套了7,8层if,起先看这段代码看不懂,后面把每个if和endif对应起来打印出来,再仔细想了几个小时才弄明白。最初仿真时,因为自己过河动作的频率较低,故所需仿真的时间较长。得IS左右吧
39、,仿真时发现总是到49%时总是不动了,后来才想到由于自己输入的是50MHZ的频率,而自己需要的频率又很小,计算机进行此仿真会有大量的计算,导致仿真过慢,这个问题老师第一节课可能也说过,自己没注意。后来又以为如果要仿真就得改代码,故进行各个模块的仿真时都是另建工程再改代码进行仿真,而且忘保存了,不知道报告需要仿真图,后来才发现模块之间的信号是可以进行仿真的,可为时已晚。进行下载时,有一次下载完后按按钮总没有反应,后面经同学提醒才知道有个按钮得按下,至于这个按钮的作用,不甚了解。八 .总结和结论此次数电综合实验虽然不是自己完全自己独立完成(上网找了代码)的,但自己仍然学到了不少东西,一是熟悉了VHDL语言,对VHDL进行逻辑电路的结构方式也了解更深,特别是对ProCeSS的理解和ComPorlent的应用。另外,也因为此次实验只有自己选这一个题目,很多具体逻辑问题和实际问题都只有靠自己解决,问同学只能解决一部分,真正要完全解决只有靠自己,因此自己也得到了不少锻炼。但是自己也注意到自己编程还是没有考虑很多关于硬件的问题,更多的只是注意软件,这个自己后面还得好好锻炼。另外,对于状态机的认识也不够,希望老师在以后授课时可以让同学们真正学到怎么设计状态机,怎么利用状态机来进行编译等。
链接地址:https://www.desk33.com/p-224935.html