猫和老鼠游戏实验报告.docx
- 文档编号:10496591
- 上传时间:2023-02-14
- 格式:DOCX
- 页数:24
- 大小:318.11KB
猫和老鼠游戏实验报告.docx
《猫和老鼠游戏实验报告.docx》由会员分享,可在线阅读,更多相关《猫和老鼠游戏实验报告.docx(24页珍藏版)》请在冰豆网上搜索。
猫和老鼠游戏实验报告
数字电路综合
实验报告
信息与通信工程学院
班级:
2009211120班
姓名:
李川
学号:
09210591
题目:
经典数学游戏
一.任务要求
实验内容:
一个人要将1只狗,1只猫,1只老鼠渡过河,独木舟一次只能装载和一只动物,但猫和狗不能单独在一起,而猫和老鼠也不能友好相处,试模拟这个人将三只动物安全渡过河的过程。
用发光二极管亮点的移动模拟独木舟渡河的过程,选中渡河的动物及两岸的动物都应有显示,若选错应有报警显示,且游戏失败,按复位键游戏重新开始。
当三只动物均安全度过河时,游戏成功,并显示此次游戏独木舟往返渡河的次数。
提高要求:
游戏难度可设置,选错动物允许有一次修改机会。
二.系统设计
设计思路:
用4个按钮分别用来选择人,狗,猫,鼠,8个LED来表示人和动物的状态,左边4个代表左岸状态,右边4个代表右岸状态,船用点阵上的LED灯表示,灯右移代表船从左岸划到右岸,左移代表船从右岸划到左岸,失败和成功另外用点阵上的2个点表示。
总体框图及分块设计:
控制逻辑图(画在预习报告中,无法复制,截屏)
三.仿真波形及仿真分析
2ms时钟分频仿真图,clk1周期为1ms,是自己所需的,证明计算的分频的数字正确,4Hz的clk2周期太长,就不进行仿真
数码管的仿真图,in:
num,out:
step
模拟渡河的一步(错误的一步,报错fail=1)
复位,reset=1,pl=‘1111’,pr=‘0000’,各自复位
仿真图后面随便乱加的,因为我觉得此实验仿真过程较为复杂,还不如直接下载到板子上来找问题方便直接,故仿真图很粗糙。
四.源程序
--过河游戏----顶层模块libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entitygh1isport(clock:
instd_logic;--时钟信号,50MHzmank,dogk,catk,ratk:
instd_logic;--人,狗,猫,老鼠的开关信号enterk:
instd_logic;--确认开关信号resetk:
instd_logic;--复位开关信号pl,pr:
outstd_logic_vector(3downto0);--河两岸动物的状态boat:
outstd_logic_vector(13downto0);--船灯信号lose,win:
outstd_logic;--失败、成功的信号steph,stepl:
outstd_logic_vector(6downto0));--数码管的驱动信号end;architecturejgofgh1iscomponentfenpin--调用分频器模块port(cp:
instd_logic;cp1,cp2:
outstd_logic);endcomponent;componentfangdou--调用防抖动模块。
port(clk,key:
instd_logic;q:
outstd_logic);endcomponent;componentshumaguan--调用译码显示模块。
port(num:
instd_logic_vector(3downto0);step:
outstd_logic_vector(6downto0));endcomponent;componentguohe--调用过河控制模块。
port(clk,clk1:
instd_logic;man,dog,cat,rat:
instd_logic;enter:
instd_logic;reset:
instd_logic;pl,pr:
outstd_logic_vector(3downto0);counth,countl:
outstd_logic_vector(3downto0);boats:
outstd_logic_vector(13downto0);fail,success:
outstd_logic);endcomponent;signaltemp1,temp2,temp3,c1,c2:
std_logic;signaltemp4,temp5,temp6:
std_logic;signalcoh,col:
std_logic_vector(3downto0);beginu1:
fenpinportmap(clock,c1,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(c1,c2,temp1,temp2,temp3,temp4,temp5,temp6,pl,pr,coh,col,boat,lose,win);u9:
shumaguanportmap(coh,steph);u10:
shumaguanportmap(col,stepl);endjg;
--防抖模块
libraryieee;useieee.std_logic_1164.all;entityfangdouisport(clk:
instd_logic;--时钟信号,1kHz。
key:
instd_logic;--有抖动的开关信号。
q:
outstd_logic);--防抖动电路输出的无抖动信号。
end;architecturefangdou1offangdouissignalcp:
std_logic;signaljsp:
integerrange0to3;beginprocess(clk,cp)beginif(clk'eventandclk='0')thenifkey='1'thenifjsp=3thenjsp<=jsp;elsejsp<=jsp+1;endif;ifjsp=1thencp<='1';elsecp<='0';endif;elsejsp<=0;endif;endif;q<=cp;endprocess;end;--分频模块
libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityfenpinisport(cp:
instd_logic;--时钟信号,50MHzcp1,cp2:
outstd_logic);--1kHz、2.5Hz的信号endfenpin;architecturestructoffenpinissignalclk1,clk2,clk3:
std_logic;signaltemp:
std_logic_vector(6downto0);signaltemp1:
std_logic_vector(8downto0);signaltemp2:
std_logic_vector(8downto0);beginfp1:
process(cp)beginifrising_edge(cp)thenif(temp="1100011")thenclk1<=notclk1;temp<="0000000";elsetemp<=temp+1;endif;endif;endprocessfp1;fp2:
process(clk1)beginifrising_edge(clk1)thenif(temp1="111101111")thenclk2<=notclk2;temp1<="000000000";elsetemp1<=temp1+1;endif;endif;endprocessfp2;fp3:
process(clk2)beginifrising_edge(clk2)thenif(temp2="110001111")thenclk3<=notclk3;temp2<="000000000";elsetemp2<=temp2+1;endif;endif;endprocessfp3;cp1<=clk2;cp2<=clk3;endstruct;--过河控制模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityguoheis
port(clk,clk1:
instd_logic;
man,dogman,dog,cat,rat:
instd_logic;--人、狗、猫和鼠的开关动作信号
enter:
instd_logic;--确认开关信号。
reset:
instd_logic;--复位开关信号。
pl,pr:
outstd_logic_vector(3downto0);--河两岸动物的状态。
counth,countl:
outstd_logic_vector(3downto0);--过河次数。
boats:
outstd_logic_vector(13downto0);--船灯信号。
fail,success:
outstd_logic);--成功、警告信号。
endguohe;
architecturestructofguoheis
signalch,cl:
std_logic_vector(3downto0);
signalstate:
std_logic_vector(3downto0);
signalenable:
std_logic;
signalriver,river1:
std_logic;
signalside:
std_logic;
signalboat:
std_logic_vector(13downto0);
signalfirst:
std_logic;
signalms,ds,cs,rs:
std_logic;
begin
p1:
process(clk)
begin
if(rising_edge(clk))then
if(reset='1')then--复位信号有效。
state<="0000";--右边状态全为'0',同时左边状态全为'1'。
fail<='0';
success<='0';
enable<='0';
ch<="0000";
cl<="0000";
ms<='0';
ds<='0';
cs<='0';
rs<='0';
river1<='0';
side<='0';
first<='0';
else
if(river='0'andriver1='0')then--若不处于运输过程。
if(enable='0')then
if(man='1')then--按下表示人的开关。
state(3)<=notstate(3);--人的状态改变。
ms<=notms;
first<='1';
endif;
if(dog='1')then
state
(2)<=notstate
(2);
ds<=notds;
first<='1';
endif;
if(cat='1')then
state
(1)<=notstate
(1);
cs<=notcs;
first<='1';
endif;
if(rat='1')then
state(0)<=notstate(0);
rs<=notrs;
first<='1';
endif;
if(enter='1')then--有确认信号。
--对过河次数的处理。
if(cl="1001")then
if(ch="1001")then
ch<=ch;cl<=cl;fail<='1';enable<='1';
--若过河次数的高位也计到9,则判为失败。
else
ch<=ch+1;cl<="0000";
endif;
else
cl<=cl+1;
endif;
side<=notside;
river1<='1';
--失败和成功的判断。
if(ms='0')then
fail<='1';enable<='1';river1<='0';--人没有上船,过河失败。
--人和动物在河的两边却同时上船的失败判断。
elsif(ds='1'andstate(3)='1'andstate
(2)='0')then
fail<='1';enable<='1';river1<='0';
elsif(ds='1'andstate(3)='0'andstate
(2)='1')then
fail<='1';enable<='1';river1<='0';
elsif(cs='1'andstate(3)='1'andstate
(1)='0')then
fail<='1';enable<='1';river1<='0';
elsif(cs='1'andstate(3)='0'andstate
(1)='1')then
fail<='1';enable<='1';river1<='0';
elsif(rs='1'andstate(3)='1'andstate(0)='0')then
fail<='1';enable<='1';river1<='0';
elsif(rs='1'andstate(3)='0'andstate(0)='1')then
fail<='1';enable<='1';river1<='0';
elsif(dsandcs)='1'then
fail<='1';enable<='1';river1<='0';
elsif(csandrs)='1'then
fail<='1';enable<='1';river1<='0';
elsif(dsandrs)='1'then
fail<='1';enable<='1';river1<='0';
elsif(state="1001"orstate="1100"orstate="0011"
orstate="0110"orstate="0111"orstate="1000")then
fail<='1';enable<='1';river1<='0';
else
if(state="1111")then
success<='1';enable<='1';
endif;
endif;
ms<='0';ds<='0';cs<='0';rs<='0';
endif;
endif;
--运输过程。
else
if(side='1'andboat(0)='1')thenriver1<='0';--若从左往右运输且右边的船灯已经亮,则运输过程结束。
elsif(side='0'andboat
(2)='1')thenriver1<='0';--若从右往左运输且左边的船灯已经亮,则运输过程结束。
endif;
endif;
endif;
endif;
endprocessp1;
p2:
process(clk1,cl,ch)
begin
if(cl<="0000"andch<="0000")then--第一次运输开始前。
boat<="00011101111100";--左边的船灯亮。
else
if(rising_edge(clk1))then
if(river1='0')then
if(enable='0')then
if(side='0')then--人在左边。
boat<="00011101111100";--左边的船灯亮。
elsif(side='1')then
boat<="00011101111001";
endif;
else
boat<=boat;
endif;
else
if(side='1')then--从左往右运输。
boat(0)<=boat
(1);boat
(1)<=boat
(2);boat
(2)<='0';--船灯从左往右依次亮。
if(boat
(1)='1')then
river<='0';
endif;
else
boat
(2)<=boat
(1);
boat
(1)<=boat(0);boat(0)<='0';
if(boat
(1)='1')then
river<='0';
endif;
endif;
endif;
endif;
endif;
endprocessp2;
p3:
process(clk1,first)
begin
if(first='0')then--初始状态。
foriin0to3loop
pl(i)<='1';pr(i)<='0';--左边的状态全为'1',右边全为'0'。
endloop;
else
if(rising_edge(clk1))then
if(side='1'andboat
(2)='1')then--从左往右运输且左边的船灯亮,即运输刚开始。
foriin0to3loop
if(state(i)='0')then
pl(i)<='1';
else
pl(i)<='0';
endif;
endloop;
elsif(side='1'andboat(0)='1')then
--从左往右运输且右边的船灯亮,即运输结束。
foriin0to3loop
if(state(i)='0')then
pr(i)<='0';
else
pr(i)<='1';
endif;
endloop;
elsif(side='0'andboat(0)='1')then
--从右往左运输且右边的船灯亮,即运输刚开始。
foriin0to3loop
if(state(i)='0')then
pr(i)<='0';
else
pr(i)<='1';
endif;
endloop;
elsif(side='0'andboat
(2)='1')then
--从右往左运输且左边的船灯亮,即运输结束。
foriin0to3loop
if(state(i)='0')then
pl(i)<='1';
else
pl(i)<='0';
endif;
endloop;
endif;
endif;
endif;
endprocessp3;
counth<=ch;countl<=cl;
boats<=boat;
end;
--数码显示模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityguoheis
port(clk,clk1:
instd_logic;
man,dogman,dog,cat,rat:
instd_logic;--人、狗、猫和鼠的开关动作信号
enter:
instd_logic;--确认开关信号。
reset:
instd_logic;--复位开关信号。
pl,pr:
outstd_logic_vector(3downto0);--河两岸动物的状态。
counth,countl:
outstd_logic_vector(3downto0);--过河次数。
boats:
outstd_logic_vector(13downto0);--船灯信号。
fail,success:
outstd_logic);--成功、警告信号。
endguohe;
architecturestructofguoheis
signalch,cl:
std_logic_vector(3downto0);
signalstate:
std_logic_vector(3downto0);
signalenable:
std_logic;
signalriver,river1:
std_logic;
signalside:
std_logic;
signalboat:
std_logic_vector(13downto0);
signalfirst:
std_logic;
signalms,ds,cs,rs:
std_logic;
begin
p1:
process(clk)
begin
if(rising_edge(clk))then
if(reset='1')then--复位信号有效。
state<="0000";--右边状态全为'0',同时左边状态全为'1'。
fail<='0';
success<='0';
enable<='0';
ch<="0000";
cl<="0000";
ms<='0';
ds<='0';
cs<='0';
rs<='0';
river1<='0';
side<='0';
first<='0';
else
if(river='0'andriver1='0')then--若不处于运输过程。
if(enable='0')then
if(man='1')then--按下表示人的开关。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 猫和老鼠 游戏 实验 报告