VHDL实现贪吃蛇.doc

上传人:w****2 文档编号:6646852 上传时间:2020-03-01 格式:DOC 页数:22 大小:474.50KB
返回 下载 相关 举报
VHDL实现贪吃蛇.doc_第1页
第1页 / 共22页
VHDL实现贪吃蛇.doc_第2页
第2页 / 共22页
VHDL实现贪吃蛇.doc_第3页
第3页 / 共22页
点击查看更多>>
资源描述
西北工业大学课 程 设 计 报 告题 目: 贪吃蛇小游戏摘 要贪吃蛇是一个简单地小游戏,写作贪吃蛇的目的在于以C语言算法思想为基础,通过进一步的改编实现贪吃蛇小游戏,实现其基本游戏功能(显示蛇和老鼠、移动、长大、死亡、十五步内未吃掉则消失、计分、剩余时间)提高自己的对数字电路和相关语言的掌握。 利用DE0板写作,以VHDL语法撰写,并参考实验相关资料文件、网上相关资源以及图书馆相关书籍並,并通过老师的指导和与同学讨论完成写作贪吃蛇游戏。 由于未学习过VHDL和Verilog DHL语言,对DE0板不熟悉,写作过程中遇到了不小麻烦,通过进一步的学习,老师的指导以及参考资料,虽然不能完全实现游戏功能,但是已基本可以实现小游戏。 从一开始的无从下手到最后学会撰写VHDL、游戏显示设计、烧录到板子调试到最后得到成果,使自己一点一点补充不足的知识,对于VHDL硬件与软件间的关系运作也能更加清楚与了解,研究此设计如有机会会再继续完成。 关键词:VHDL, Verilog HDL,DE0目录一、课程设计目的- 3 -二、设计任务与要求- 3 -三、方案设计与论证- 3 -1、VGA显示- 3 -2、键盘控制- 5 -3、蛇的运动与增长- 5 -四、遇到问题的解决方法- 6 -五、存在的问题与不足- 6 -六、总结与体会- 6 -七、参考文献- 7 -八、附录- 8 -贪吃蛇一、课程设计目的1)巩固和加深所学电子技术课程的基本知识, 提高综合运用所学知识的能力;2)培养根据课题需要选用参考书、查阅手册、图表和文献资料的能力,提高学生独立解决工程实际问题的能力3)通过设计方案的分析比较、设计计算、元件选择及电路安装调试等环节初步掌握简单实用电路的工程设计方法。4)提高动手能力掌握常用仪器设备的正确使用方法,学会对简单实用电路的实验调试和对整机指标的测试方法,5)学习VHDL和Verilog HDL语言,熟悉DE0电路板。提高对软件与硬件之间关系的认识与了解二、设计任务与要求设计任务:设计一个贪吃蛇小游戏要求和指标:1. 用PS2键盘作为输入设备,用LCD作为显示器。2. 自定义蛇的图像和老鼠的图像,用四个按键控制蛇的运动方向,完成贪食蛇游戏,蛇撞“墙”、边或者游戏时间到,游戏结束。3. 老鼠出现的地方是随机的,在某个地点出现的时间是蛇走15步的时间,如果15步之内没有被吃掉,它就会在其它地方随机出现。;4. 在旁边显示得分情况和游戏的剩余时间。三、方案设计与论证1、VGA显示VGA标准是一种计算机显示标准,最初是由IBM公司在1987 年提出的一种视频传输标准,在彩色显示器领域得到了广泛应用。VGA管脚中,VGA_Hs和VGA_Vs分别是水平扫描信号和竖直扫描信号,VGA_R, VGA_G和VGA_B是颜色控制信号,控制当前显示的像素色彩。利用水平扫描信号和竖直扫描信号实现二维平面的像素扫描显示,程序中中我們利用Cnt_H与Cnt_V信号来控制,以确认程序正确的将色彩输出到屏幕上。将屏幕分成30*40的矩阵,每个矩阵块根据不同的值赋予不同的颜色。屏幕是从最左上角的(4,4)坐标开始扫描更新,可以将屏幕视为x-y 平面來看,根据矩阵点值赋予不同颜色绘制游戏框架并且实时显示蛇与老鼠在做VGA显示前先进行了彩条显示,以确保颜色显示正确,结果如下:根据彩条显示绘制游戏框架,并定义蛇与老鼠的颜色。2、键盘控制键盘控制程序的主要功能,就是读取用户为控制贪吃蛇的移动,而从键盘所输入的上下左右键值 (键盘的键值): 上:00011101 下:00011011 左:00011100 右:00100011 在键盘控制程序里,设定一个Dir和Dirbuff对方向进行控制,为了避免蛇直接向反方向运动,需要对方向的转换进行限制。需要对现行方向和下一步控制方向进行判断,以防止“回头”运动。3、蛇的运动与增长利用一个数组存放蛇的信息,当蛇移动时,将蛇头之后的坐标依次沿蛇身前移,蛇头根据运动控进行移动赋值。老鼠的位置利用时钟产生随机数,利用随机数得到老鼠的坐标,将相应的坐标块赋色。当蛇头坐标与老鼠的坐标重合时表示蛇已经吃到老鼠,此时将蛇尾后一坐标块赋值赋色,蛇的长度加一。当蛇头撞墙或蛇的首位相接,则根据相应的信号量结束程序。四、遇到问题的解决方法问题一、蛇穿墙而出,经过一定时间,从另一方向穿墙而入。解决方案:设置一个标志量S_Lose, 初始化为零。当为零时程序继续运行,如果撞墙或者首尾相接,赋值为1,结束游戏。问题二、蛇静止不动解决方案:语句判断出错,在蛇头位置时判断结束游戏。更改判断语句,使其只有在撞墙和首位相接时结束。问题三、颜色显示不对解决方案:未考虑颜色叠加,需要将背景色改成黑色才能正确显示颜色。五、存在的问题与不足1、由于时间原因,部分游戏功能要求尚未实现,例:得分显示,老鼠十五步内未被吃掉就消失,剩余时间显示。2、老鼠的随机产生可能在蛇身上,此时将会出现冲突,游戏无法继续。3、在蛇吃掉老鼠,蛇身在蛇尾增长时会有断尾延迟4、由于数组有限,当蛇身超过10时,会出现蛇“脱皮”现象。六、总结与体会这次的设计是通过自己在图书馆和网上查阅资料所完成的,课程设计的任务需要综合运用“高频电子线路”课程的知识,通过调查研究、查阅资料、方案设计,调试及分析讨论,结果展示完成设计任务。在这次课程设计中,学会了怎样去根据课题的要求去设计相应的数字电路。动手能力得到很大的提高。从中发现自己并不能很好的熟练去使用所学到的数电知识。在以后学习中要加强对使用电路和相关语言的了解。把过去熟悉的定型分析、定量计算逐步和工程估算、实验调整等手段结合起来,掌握工程设计的步骤和方法,了解科学实验的程序和实施方法。这对今后从事技术工作无疑是个启蒙训练。通过这种综合训练,可以掌握高频电子线路设计的基本方法,提高动手组织实验的基本技能,培养分析解决电路问题的际本领,为以后毕业设计和从事高频电子线路实验实际工作打下基础。在设计的过程中我遇到很多困难,例如Quartus II 软件的学习,资料的查找,编辑好的文档没有及时保存,以至于从头再来,浪费了很多时间。但吃一堑长一智,现在遇到这些问题,及时解决,以后再做这类事情就会多一点经验,就会少出一些类似问题。在两个星期的课程设计之后,我觉得不仅实际动手能力有所提高,更重要的是懂得设计流程,从开始设计思路,到实现,到纠正完善,再到最后设计论文的撰写,进一步激发了我们对专业知识的兴趣,并能够结合实际存在的问题在专业领域内进行更深入的学习。经过这次课程设计,让我对前面的路有了更多的信心,因为在这个过程中,我学到了不少实用的东西,对于高频电子电路有了更深层次的掌握,并且提高了独立解决问题的能力。我们在学习理论知识的同时还要努力培养自己的动手操作能力,通过这次课程设计我也看到了自己的差距,今后会努力提高自己的动手操作能力,以求真正领会通信专业里边的各种知识,为将来的工作打下良好的基础。总而言之,通过这次课程设计,我们获得了很多,但学海无涯,我们还得一如既往的努力踏实的学习,只有这样才能成为合格的人才七、参考文献【1】Doouglas L.perry VHDL:Programming By Example (杨承恩 谭克俊 颜德文 译) 电子工业出版社【2】云创工作室 詹仙宁 田耕 VHDL 开发精解与实例剖析 电子工业出版社【3】数字电路实验指导讲义(第二版) (课件)八、附录LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;ENTITY Snake ISPORT(Clk : IN STD_LOGIC;Start: IN STD_LOGIC;Rst : IN STD_LOGIC;-FOR VGARed : OUT STD_LOGIC;Blue : OUT STD_LOGIC;Green : OUT STD_LOGIC;Red1 : OUT STD_LOGIC;Blue1 : OUT STD_LOGIC;Green1 : OUT STD_LOGIC;Red2 : OUT STD_LOGIC;Blue2 : OUT STD_LOGIC;Green2 : OUT STD_LOGIC;Red3 : OUT STD_LOGIC;Blue3 : OUT STD_LOGIC;Green3 : OUT STD_LOGIC;V_Sync : OUT STD_LOGIC;H_Sync : OUT STD_LOGIC;-FOR KEYBORDPS2_Clk : IN STD_LOGIC;PS2_Data : IN STD_LOGIC);END Snake;ARCHITECTURE BEHAVE OF Snake ISTYPE MATRIX IS ARRAY (0 TO 29, 0 TO 39) OF INTEGER RANGE 0 TO 6;SIGNAL S_Matrix : MATRIX;-VGA CONTROLSIGNAL Cnt_H : INTEGER RANGE 0 TO 799;SIGNAL Cnt_V : INTEGER RANGE 0 TO 524;SIGNAL Row : INTEGER RANGE 0 TO 29;SIGNAL Col : INTEGER RANGE 0 TO 39;SIGNAL Clk_H : STD_LOGIC :=0;SIGNAL Clk_V : STD_LOGIC :=0;SIGNAL ColorBuf : STD_LOGIC_VECTOR(2 DOWNTO 0);-PS2 CONTROLSIGNAL buff : STD_LOGIC_VECTOR(10 DOWNTO 0);SIGNAL pre_clk,now_clk : STD_LOGIC;SIGNAL kbclk : STD_LOGIC :=0;-SIGNAL Data1,Data2,Data3 : STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL PScnt : INTEGER RANGE 0 TO 10 := 0;SIGNAL Result : STD_LOGIC_VECTOR(7 DOWNTO 0);-SNAKE CONTROLSIGNAL Dir : STD_LOGIC_VECTOR(1 DOWNTO 0) := 00; -00 L 01 R 10 U 11 DSIGNAL Dirbuff : STD_LOGIC_VECTOR (1 DOWNTO 0):= 00; SIGNAL S_Speed : INTEGER := 12500000;SIGNAL S_Clk : STD_LOGIC :=0;TYPE Snake_element IS RECORDs_row : INTEGER RANGE 4 TO 25;s_col : INTEGER RANGE 4 TO 25;s_use : STD_LOGIC;s_head: STD_LOGIC;END RECORD;TYPE BODYBLOCK IS ARRAY (0 TO 9) OF Snake_element;SIGNAL S_Head : Snake_element;SIGNAL S_Body : BODYBLOCK;SIGNAL S_Len : INTEGER RANGE 1 TO 10;SIGNAL S_Erow : INTEGER RANGE 4 TO 25;-SNAKE ENDSIGNAL S_Ecol : INTEGER RANGE 4 TO 25;-SNAKE ENDSIGNAL S_Eat : STD_LOGIC;SIGNAL S_Lose: STD_LOGIC := 0;-FOODSIGNAL F_cntx : INTEGER RANGE 0 TO 39;SIGNAL F_cnty : INTEGER RANGE 0 TO 42;SIGNAL F_row : INTEGER RANGE 5 TO 24;SIGNAL F_col : INTEGER RANGE 5 TO 24;SIGNAL F_pl : Std_Logic;BEGINRed = ColorBuf(0);Green = ColorBuf(1);Blue = ColorBuf(2);Red1 = ColorBuf(0);Green1 = ColorBuf(1);Blue1 = ColorBuf(2);Red2 = ColorBuf(0);Green2 = ColorBuf(1);Blue2 = ColorBuf(2);Red3 = ColorBuf(0);Green3 = ColorBuf(1);Blue3 = ColorBuf(2);PROCESS(Clk)BEGINif(rising_edge(Clk) thenClk_H = not Clk_H;end if;END PROCESS;-COUNT CNT_HPROCESS(Clk_H,Rst)BEGINif (Rst=1)thenCnt_H=0;Clk_V=1;elsif(rising_edge(Clk_H) thenif(Cnt_H=799) thenCnt_H = 0;elseCnt_H = Cnt_H+1;end if;if(Cnt_H= 399) thenClk_V = 1;elseClk_V = 0;end if;end if;END PROCESS;-COUNT CNT_VPROCESS(Clk_V,Rst)BEGINif(Rst=1) thenCnt_V=0;elsif(rising_edge(Clk_V) thenif(Cnt_V=524) thenCnt_V = 0;elseCnt_V = Cnt_V+1;end if;end if;END PROCESS;- GENERATE H&V SYNCPROCESS(Clk,Rst)BEGINif(Rst=1) thenH_Sync=0;V_Sync=0;elsif(rising_edge(Clk) thenif(Cnt_H = 95) thenH_Sync = 0;elseH_Sync = 1;end if;if(Cnt_V = 1) thenV_Sync = 0;elseV_Sync = 1;end if;end if;END PROCESS;-DISPLAY ON VGAPROCESS(Clk_H,Rst)BEGINif(Rst=1) thenColorBuf= 144) and (Cnt_H =783) thenCol = (Cnt_H-144)/16;elseColorBuf = 35) and (Cnt_V =510) thenRow = (Cnt_V-35)/16;elseColorBuf ColorBuf ColorBuf ColorBuf ColorBuf ColorBuf ColorBuf ColorBuf =000;end case;end if;END PROCESS;-PS2 BLOCK-GENERATE 25MHz CLOCKPROCESS(Clk)BEGINif(Clkevent and clk=1)thenkbclk= not kbclk;end if;END PROCESS;-READ IN KEYBORDPROCESS(kbclk,Rst)BEGINif(Rst=1)thenResult=00000000;elsif kbclkevent and kbclk=1thenpre_clk=now_clk;now_clk now_clk)thenbuff(PScnt)=PS2_Data;if(PScnt=10)thenPScnt=0;Result=buff(8 downto 1);elsePScnt=PScnt + 1;end if;end if;end if;END PROCESS;-ASSIGN DIRECTIONPROCESS(Result,Rst)BEGINif(Rst = 1) thenDirbuff Dirbuff Dirbuff Dirbuff DirbuffDirbuff =Dirbuff;end case;end if;END PROCESS;PROCESS(Dirbuff,Start)BEGINif(Start=0)thenDir=00;elsif (Dir(1)xor Dirbuff(1)=1thenDir=Dirbuff;elseDir=Dir;end if;END PROCESS;-SNAKE CONTROL BLOCK-SET SPEEDPROCESS(Clk)variable S_Clk_Cnt : integer range 0 to 12500000;BEGINif(Clkevent and Clk=1)thenif(Rst=1)thenS_Clk=0;S_Clk_Cnt := 0;elsif(S_Clk_Cnt=12500000)thenS_Clk_Cnt :=0;S_Clk=not S_Clk;elseS_Clk_Cnt:=S_Clk_Cnt+1;end if;end if;END PROCESS;-SNAKE INIT & MOVE & EAT PROCESS(S_Clk,Clk,Start)variable len_cnt : integer;variable len : integer range 1 to 10;BEGINlen_cnt:=0;len := S_Len;if Start=0 thenL1: FOR i IN 0 TO 29 LOOPL2: FOR j IN 0 TO 39 LOOPS_Matrix(i,j) = 0;END LOOP L2;END LOOP L1;- INIT ROWSL3: FOR i IN 4 TO 35 LOOP S_Matrix(4,i) = 1;S_Matrix(25,i) = 1;END LOOP L3;- INIT COLUMNSL4: FOR j IN 5 TO 24 LOOPS_Matrix(j,4) = 1;S_Matrix(j,25) = 1;S_Matrix(j,35) =1;END LOOP L4;S_Matrix(19,19) =2; -headS_Head.s_row = 19;S_Head.s_col = 19;S_Head.s_use=1;S_Head.s_head=1;S_Matrix(19,20) =3; -bodyS_Body(0).s_row = 19;S_Body(0).s_col = 20;S_Body(0).s_use=1;S_Body(0).s_head=0;s_Matrix(19,21) =3;S_Body(1).s_row = 19;S_Body(1).s_col = 21;S_Body(1).s_use=1;S_Body(1).s_head=0;S_Len = 2;S_Eat = 1;S_Lose = 0;elsif(Start=1 and S_Lose=0)thenif(S_Clkevent and S_Clk=1) thenS_Erow = S_Body(len-1).s_row;S_Ecol 1)thenlen_cnt:=0;Smove:FOR N IN 0 TO 9 LOOP -LOOP LEN-1 TIMESS_Body(len-1-len_cnt).s_row=S_Body(len-2-len_cnt).s_row;S_Body(len-1-len_cnt).s_collen-2;END LOOP Smove;end if;S_Body(0).s_row=S_Head.s_row;S_Body(0).s_col=S_Head.s_col;if(Dir=00)thenS_Head.s_col=S_Head.s_col-1;elsif(Dir=01)thenS_Head.s_col=S_Head.s_col+1;elsif(Dir=10)thenS_Head.s_row=S_Head.s_row-1;elsif(Dir=11)thenS_Head.s_row=S_Head.s_row+1;end if;S_Matrix(S_Head.s_row,S_Head.s_col)=2;S_Matrix(S_Body(0).s_row,S_Body(0).s_col)=3;if(S_Matrix(S_Head.s_row,S_Head.s_col)=4)then-EAT FOOD TO BE LONGERS_Matrix(S_Erow,S_Ecol)= 3;S_Body(len).s_row=S_Erow;S_Body(len).s_col=S_Ecol;S_Len=S_Len+1;S_Eat=1;elsif(S_Matrix(S_Head.s_row,S_Head.s_col)=1 or S_Matrix(S_Head.s_row,S_Head.s_col) =3)thenS_Lose=1;elseS_Matrix(S_Erow,S_Ecol)= 0;S_Eat=0;end if;if(S_Eat=1 and F_pl=1)thenS_Matrix(F_row,F_col)=4;S_Eat=0;end if;end if;end if;END PROCESS;-SET FOOD PLACE-SET FOOD RANDOM SIGNALPROCESS(Rst,Clk)BEGINif(Rst=1)thenF_cntx=0;F_cnty=0;elsif(CLkevent and Clk=1) thenif(F_cntx=39)thenF_cntx=0;elseF_cntx=F_cntx+1;end if;if(F_cnty=42)thenF_cnty=0;elseF_cnty=F_cnty+1;end if;end if;END PROCESS;-ENABLE PLACE FOODPROCESS(Start,Clk)variable f_lck: STD_LOGIC;BEGINif(Start = 0) thenf_lck:=0;elsif(Clkevent and Clk=0)thenif(S_Eat=1 and f_lck=0)thenF_row=(F_cntx rem 20)+5;F_col=(F_cnty rem 20)+5;if(S_Matrix(F_row,F_col)=0)thenf_lck:=1;F_pl=1;end if;elsif S_Eat=0thenF_pl=0;f_lck:=0;end if;end if;END PROCESS;END BEHAVE;
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 临时分类 > 人文社科


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!