VHDL课程设计之打地鼠游戏报告-含代码_第1页
VHDL课程设计之打地鼠游戏报告-含代码_第2页
VHDL课程设计之打地鼠游戏报告-含代码_第3页
VHDL课程设计之打地鼠游戏报告-含代码_第4页
VHDL课程设计之打地鼠游戏报告-含代码_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

题目:VHDL课程设计之打地鼠游戏专业:信息工程班级:电联学生姓名:提交日期:2023年03月05日目录一、设计任务与要求·······························3二、总体框图··································32.1总体框图·······························32.2设计思路及各模块功能·······················32.2.1设计思路····························32.2.2各模块功能···························3三、选择器件·································4四、模块功能实现·······························74.1分频器模块······························74.2随机数产生模块1······························84.3随机数产生模块2·····························94.4键盘控制模块······························104.5计分器模块·····························144.6LCD1602地鼠显示模块·····························154.7数码管显示模块·······························17五、总体设计电路图·····························18六、游戏说明书·······························186.1前言·································186.2运行说明·······························186.3评分规那么·······························18七、心得体会······················································19一、设计任务与要求设计一个挑战反响速度的“打地鼠〞游戏机。要求:地鼠随机出现在任何位置,以按键代表锤子,击中地鼠,一旦击中,数码管计分器分数增加。按复位键重新开始游戏。二、总体框图2.1、打地鼠游戏机的总体框图如下列图所示:分频模块分频模块键盘模块随机数发生模块数码管显示模块计分模块键盘模块随机数发生模块数码管显示模块计分模块LCD显示模块LCD显示模块电路设计总体框图2.2、设计思路及各模块功能:设计思路:产生伪随机数使地鼠随机出现,外接LCD1602显示地鼠随机出现的位置,以一个特殊字符表示地鼠。游戏者按下按键,与地鼠出现的位置代表的伪随机数进行比拟,假设一致,计分器进行加分。按下ESC键进行复位,利用50MHz分频作为根本信号源。各模块功能介绍:——分频器模块将50MHz的信号源分别分频为游戏所需频率的时钟信号1Hz。——伪随机数产生模块产生伪随机数,使得地鼠出现位置随机。——计分模块接收来自键盘控制模块的信号,正确一次加一分。——LCD显示模块在1HZ时钟信号下,根据产生的伪随机数使得2*16的LCD屏上随机出现代表地鼠的字符。——键盘控制模块玩家按下地鼠出现的位置可能对应的按键,按键地址与地鼠出现的位置对应的伪随机进行比拟,假设一致,输出一个为‘1’的correct信号。——计分模块接收来自键盘控制模块的信号,正确一次加一分。——数码管显示模块通过数码管,将计分模块的计分结果显示出来。三、器件选择设计开发软件:Quartus28.1/9.0主芯片:芯片:EP2C8Q208C8:含8,256Les;165,888RAMbits;2个PLL;;139个I/O口2.配置芯片:EPCS1/EPCS4FPGA串行配置芯片含1MbitFlash/4MbitFlashEP2C5Q208C8:配置EPCS1EP2C8Q208C8:配置EPCS43.FLASH:〔2M×〕4.SRAM:IS61LV25616256K×16Bit存储器电路:24LC16B16Kbit〔8Blocks×8Bit〕存储器电路:93LC46B1Kbit〔64×16Bit〕7.有源晶振:8.电源芯片:LM1117-3.3V、9.调试接口:AS、JTAG调试接口10.核心板尺寸:100mm×79mm外接LCD1602显示屏工业字符型液晶,能够同时显示16x02即32个字符。〔16列2行〕注:为了表示的方便,后文皆以1表示高电平,0表示低电平。1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由假设干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形〔用自定义CGRAM,显示效果也不好〕。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块〔显示字符和数字〕。市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大局部的字符型液晶。2管脚功能1602采用标准的16脚接口,其中:第1脚:GND为电源地第2脚:VCC接5V电源正极第3脚:V0为液晶显示器比照度调整端,接正电源时比照度最弱,接地电源时比照度最高〔比照度过高时会产生“鬼影〞,使用时可以通过一个10K的电位器调整比照度〕。第4脚:RS为存放器选择,高电平1时选择数据存放器、低电平0时选择指令存放器。第5脚:RW为读写信号线,高电平(1)时进行读操作,以51为例的简单原理图低电平(0)时进行写操作。第6脚:E(或EN)端为使能(enable)端,高电平〔1〕时读取信息,负跳变时执行指令。第7~14脚:D0~D7为8位双向数据端。第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。特性3.3V或5V工作电压,比照度可调内含复位电路提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能有80字节显示数据存储器DDRAM内建有192个5X7点阵的字型的字符发生器CGROM8个可由用户自定义的5X7的字符发生器CGRAM特征应用微功耗、体积小、显示内容丰富、超薄轻巧,常用在袖珍式仪表和低功耗应用系统中。操作控制注:关于E=H脉冲——开始时初始化E为0,然后置E为1。外接PS/2键盘进行控制四、功能模块4.1分频器模块分频器模块接收晶振提供的50MHz时钟信号,通过计数将其分频为1s的时钟脉冲信号并输出。输出秒脉冲的VHDL程序如下:LIBRARYIEEE;USEIEEE.std_logic_1164.ALL;useieee.std_logic_unsigned.all;ENTITYdividerISPORT(clk:INSTD_LOGIC;rst_n:INSTD_LOGIC;clk_1HZ:BUFFERSTD_LOGIC);ENDdivider;ARCHITECTUREbehavOFdividerISBEGINPROCESS(clk,rst_n)VARIABLEcount:INTEGERrange0TO50000000;BEGINIFrst_n='0'THENcount:=0;ELSIFclk'eventANDclk='1'THENIFcount=25000000THENcount:=0;clk_1HZ<=NOTclk_1HZ;ELSEcount:=count+1;ENDIF;ENDIF;ENDPROCESS;ENDbehav;4.2随机数产生模块1以下程序为产生4位伪随机数的代码,取ram为一个4位数,将第1位和第4位进行同或得结果feedback,将ram的前3位和feedback合并取代原来4位的ram,新的ram即是得到的一个伪随机数,不停的反复就可得到一组序列为16的伪随机数。这个伪随机数产生器的伪随机数传递给LCD显示屏。LibraryIEEE;useIEEE.std_logic_1164.all;useIEEE.std_logic_arith.all;entitybeeisport(clk:instd_logic;reset:instd_logic;data_out:outUNSIGNED(3downto0));endbee;architecturertlofbeeissignalfeedback:std_logic;signalram:UNSIGNED(3downto0);beginfeedback<=ram(3)xnorram(0);latch_it:process(clk,reset)beginif(reset='1')thenram<=(others=>'0');elsif(clk='1'andclk'event)thenram<=ram(2downto0)&feedback;endif;endprocess;data_out<=ram(3downto0);endRTL;4.3随机数产生模块2原理同随机数产生模块1,产生的伪随机数传递给键盘控制模块。LibraryIEEE;useIEEE.std_logic_1164.all;useIEEE.std_logic_arith.all;entitylai2isport(clk:instd_logic;reset:instd_logic;data_out:outUNSIGNED(3downto0));endlai2;architecturertloflai2issignalfeedback:std_logic;signalram:UNSIGNED(3downto0);beginfeedback<=ram(3)xnorram(0);latch_it:process(clk,reset)beginif(reset='1')thenram<=(others=>'0');elsif(clk='1'andclk'event)thenram<=ram(2downto0)&feedback;endif;endprocess;data_out<=ram(3downto0);endRTL;4.4键盘控制模块根据得到伪随机产生模块传递的信号num1,将此时按下的按键地址与伪随机数所代表的0地址进行比拟,假设一致,那么输出为‘1’的correct信号给下面的计分器模块。libraryIEEE;useIEEE.std_logic_1164.all;useIEEE.std_logic_arith.all;useIEEE.std_logic_unsigned.all;entityps2scanisport(clk:inSTD_LOGIC;rst_n:inSTD_LOGIC; num1:instd_logic_vector(3downto0);ps2k_clk:inSTD_LOGIC;ps2k_data:inSTD_LOGIC;LCD_Data:instd_logic_vector(8downto0);correct:outstd_logic;signalresss:outstd_logic;led:outSTD_LOGIC_VECTOR(5downto0));endentityps2scan;architectureps2receiveofps2scanissignalps2k_clk_r:STD_LOGIC_VECTOR(2downto0);signalneg_ps2k_clk:STD_LOGIC;signaltemp_data:STD_LOGIC_VECTOR(7downto0);signalnum:STD_LOGIC_VECTOR(3downto0);signalps2_byte_r:STD_LOGIC_VECTOR(7downto0);signalcount:std_logic_vector(3downto0);begin---------------process(clk,rst_n)beginif(rst_n='0')thenps2k_clk_r<="000";elsif(clk'eventANDclk='1')thenps2k_clk_r<=ps2k_clk_r(1downto0)&ps2k_clk;endif;endprocess;----------------------neg_ps2k_clk<='1'whenps2k_clk_r(2downto1)="10"else'0';----------------------process(clk,rst_n)beginif(rst_n='0')thennum<=x"0";temp_data<=x"00";elsif(clk'eventANDclk='1')thenif(neg_ps2k_clk='1')thennum<=num+1;casenumiswhenx"1"=>temp_data(0)<=ps2k_data;whenx"2"=>temp_data(1)<=ps2k_data;whenx"3"=>temp_data(2)<=ps2k_data;whenx"4"=>temp_data(3)<=ps2k_data;whenx"5"=>temp_data(4)<=ps2k_data;whenx"6"=>temp_data(5)<=ps2k_data;whenx"7"=>temp_data(6)<=ps2k_data;whenx"8"=>temp_data(7)<=ps2k_data;whenothers=>null;endcase;endif;if(num=x"b")thennum<=x"0";endif;endif;endprocess;------------------- process(clk,rst_n) VARIABLEcount1:INTEGERrange0TO1; begin if(rst_n='0')then ps2_byte_r<=x"00"; elsif(clk'eventANDclk='1')then if(num=x"b")then ps2_byte_r<=temp_data; endif; endif; endprocess;------------------- process(ps2_byte_r) begin --correct<='0'; if(ps2_byte_r=x"29")thenresss<='0';else casenum1is when"0000"=>--0 if(ps2_byte_r=x"6b")then correct<='1'; elsecorrect<='0'; endif; when"0001"=>--1 if(ps2_byte_r=x"74")then correct<='1'; elsecorrect<='0'; endif; when"0010"=>--2 if(ps2_byte_r=x"73")then correct<='1'; elsecorrect<='0'; endif; when"0011"=>--3 if(ps2_byte_r=x"74")then correct<='1'; elsecorrect<='0'; endif; when"0100"=>--4 if(ps2_byte_r=x"69")then correct<='1'; elsecorrect<='0'; endif; when"0101"=>--5 if(ps2_byte_r=x"79")then correct<='1'; elsecorrect<='0'; endif; when"0110"=>--6 if(ps2_byte_r=x"73")then correct<='1'; elsecorrect<='0'; endif; when"0111"=>--7 if(ps2_byte_r=x"73")then correct<='1'; elsecorrect<='0'; endif; when"1000"=>--8 if(ps2_byte_r=x"79")then correct<='1'; elsecorrect<='0'; endif; when"1001"=>--9 if(ps2_byte_r=x"69")then correct<='1'; elsecorrect<='0'; endif; when"1010"=>--10 if(ps2_byte_r=x"74")then correct<='1'; elsecorrect<='0'; endif; when"1011"=>--11 if(ps2_byte_r=x"6b")then correct<='1'; elsecorrect<='0'; endif; when"1100"=>--12 if(ps2_byte_r=x"72")then correct<='1'; elsecorrect<='0'; endif; when"1101"=>--13 if(ps2_byte_r=x"73")then correct<='1'; elsecorrect<='0'; endif; when"1110"=>--14 if(ps2_byte_r=x"7a")then correct<='1'; elsecorrect<='0'; endif; whenothers=>null; endcase; resss<='1'; endif; endprocess;endarchitectureps2receive;4.5计分器模块判断得到来自键盘控制模块的correct信号是否为1,来确定计分器是否需要加1,并实现在数码管上显示出来。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;ENTITYgradeISPORT(--clk_1:INSTD_LOGIC;clk_1HZ:instd_logic;rst_n:instd_logic;correct:instd_logic;--light:bufferstd_logic_vector(2downto0);seg_en:bufferstd_logic;clr:bufferstd_logic;seg_data:bufferstd_logic_vector(15downto0));ENDgrade;architecturebehavofgradeissignalcnt:std_logic_vector(3downto0);signaltim:std_logic_vector(3downto0):="1111";beginprocess(clk_1HZ,rst_n)beginif(clk_1HZ'eventandclk_1HZ='1')then --clr<='1'; ifcorrect='1'then cnt<=cnt+1; endif;if(cnt>"1001")thenseg_data<="000000000001"&(cnt-"1010");elseseg_data<="000000000000"&cnt;endif;endif;endprocess;endbehav;4.6LCD1602地鼠显示模块首先分频得到一个5Hz的时钟信号,LCD在5Hz时钟信号的驱动下,完成五步操作,第一步,设置8位格式,第二步,整体显示,关光标,光标闪烁,第三步,清屏,第四步,根据得到来自伪随机数产生模块的伪随机数信号numin,读地址,移动光标位置,第五步,在光标位置写特殊字符,代表地鼠出现。libraryieee;useIEEE.std_logic_1164.all;useieee.std_logic_unsigned.all;entitylcddis port(clk,reset:instd_logic; numin:instd_logic_vector(3downto0); LCD_Data:bufferstd_logic_vector(8downto0); en:outstd_logic; rw:outstd_logic; judge:outstd_logic_vector(8downto0); LCD_Clk:bufferstd_logic );endlcdd;architecturegongnengoflcddissignals:integerrange0to5000000;begin--50MHzto5Hzprocess(clk,reset)begin ifreset='0'then LCD_Clk<='0'; s<=0; elsifclk'eventandclk='1'then ifs=5000000then s<=0; LCD_Clk<=notLCD_Clk; else s<=s+1;endif;endif;endprocess;rw<='0';en<=LCD_Clk;process(LCD_Clk)variablecnt1:std_logic_vector(2downto0):="000";beginifReset='0'thenLCD_Data<="000000001";--Resetzanting--LCD_Data[8..0],其中LCD_Data[8]对应1602的RS,--LCD_Data[7..0]对应1602的八根数据线elsifrising_edge(LCD_Clk)thenifcnt1<"101"thencnt1:=cnt1+1;elsecnt1:="001";endif;casecnt1iswhen"001"=>LCD_Data<="000111000";when"010"=>LCD_Data<="000001100";when"011"=>LCD_Data<="000000001";when"100"=>casenuminiswhen"0000"=>LCD_Data<="010000010";---3when"0001"=>LCD_Data<="010001100";---13when"0010"=>LCD_Data<="010000111";--8when"0011"=>LCD_Data<="010001100";--13when"0100"=>LCD_Data<="011000010";--2.3when"0101"=>LCD_Data<="011001100";---2.13when"0110"=>LCD_Data<="011000111";--2.8when"0111"=>LCD_Data<="010000111";---8when"1000"=>LCD_Data<="011001100";--2.13when"1001"=>LCD_Data<="011000010";---2.3when"1010"=>LCD_Data<="010001100";--l3when"1011"=>LCD_Data<="010000010";---3when"1100"=>LCD_Data<="011000111";--2.8when"1101

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论