EDA 乒乓球游戏课程设计报告_第1页
EDA 乒乓球游戏课程设计报告_第2页
EDA 乒乓球游戏课程设计报告_第3页
EDA 乒乓球游戏课程设计报告_第4页
EDA 乒乓球游戏课程设计报告_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

EDA乒乓球游戏课程设计报告课程名称:EDA技术及应用设计题目:基于FPGA的乒乓球游戏设计与实现学生姓名:XXX学号:XXXXXX班级:XXX指导教师:XXX完成日期:202X年X月X日摘要本设计基于EDA技术,以FPGA为核心控制器,采用VHDL语言实现了一款简易乒乓球游戏。游戏通过按键控制左右球拍移动,VGA接口输出游戏画面(包括球、球拍、分数显示),具备球的自动运动、碰撞检测、计分、输赢判断及游戏重置等功能。设计采用模块化思想,将系统划分为球运动控制、球拍控制、碰撞检测、计分、VGA显示等子模块,通过QuartusII软件进行编译与仿真,最终在DE10-Lite开发板上验证了功能的正确性。该设计有助于加深对数字逻辑电路、VHDL编程及FPGA应用的理解,具备较强的实践性与趣味性。一、引言1.1设计背景与意义EDA(电子设计自动化)技术是现代电子系统设计的核心技术,其以FPGA/CPLD为载体,通过硬件描述语言(HDL)实现数字系统的设计与验证。乒乓球游戏是经典的人机交互案例,将其与EDA技术结合,可将抽象的数字逻辑设计转化为直观的互动系统,既符合课程实践要求,又能提升学习兴趣。本设计通过FPGA实现乒乓球游戏的核心逻辑,旨在掌握模块化设计方法、VHDL编程技巧及VGA显示、按键输入等外设接口的设计,为复杂数字系统设计奠定基础。1.2设计目标实现球的自动运动:球在屏幕内按一定速度移动,方向可随碰撞改变;球拍控制:通过两个独立按键分别控制左右球拍上下移动,且球拍不超出屏幕边界;碰撞检测:实现球与上下边界、左右球拍的碰撞判断,碰撞后球的运动方向自动调整;计分与输赢判断:若球未被球拍接住(超出左右边界),则对方得1分;当某方分数达到10分时,判定该方获胜,游戏暂停;游戏重置:支持通过复位按键重新开始游戏;VGA显示:清晰显示球、左右球拍及双方分数(分辨率设为640×480)。1.3设计环境硬件平台:AlteraDE10-LiteFPGA开发板(主芯片为CycloneV5CSEMA5F31C6);软件工具:QuartusII18.0(代码编写、编译、综合)、ModelSim(功能仿真)、SignalTapII(在线调试);编程语言:VHDL(Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage)。二、总体设计方案2.1系统整体结构本设计采用模块化设计思想,将系统划分为6个核心子模块,各模块通过信号交互协同工作,整体结构如图2-1所示。**图2-1系统整体结构时钟分频模块:将FPGA板载50MHz时钟分频为VGA驱动所需的25MHz时钟(640×480分辨率对应刷新率60Hz,需25MHz像素时钟),同时为游戏逻辑提供低速时钟(如10Hz,控制球的运动速度);球运动控制模块:生成球的实时坐标(x_pos,y_pos),根据碰撞信号调整运动方向(dx,dy,dx为水平方向步长,dy为垂直方向步长);球拍控制模块:接收左右按键输入(消抖后),生成左右球拍的y坐标(left_racket_y,right_racket_y),限制球拍移动范围(不超出屏幕上下边界);碰撞检测模块:接收球坐标、球拍坐标,判断球是否与上下边界、左右球拍碰撞,输出碰撞信号(border_collision,left_racket_collision,right_racket_collision);计分与输赢判断模块:根据球是否超出左右边界(失分信号)更新双方分数(left_score,right_score),当某方分数达10分时输出获胜信号(game_over,winner);VGA显示控制模块:接收球、球拍坐标及分数信息,生成VGA行同步(hsync)、场同步(vsync)信号,同时根据当前像素坐标输出RGB颜色信号,实现游戏画面的实时渲染。2.2关键参数定义屏幕分辨率:640×480(像素),对应VGA时序参数:行同步脉宽96μs,行前沿48μs,行后沿16μs;场同步脉宽2ms,场前沿33ms,场后沿10ms;球的参数:尺寸为8×8像素,初始位置为屏幕中心(320,240),初始运动方向为斜向右上方(dx=1,dy=-1),运动速度由10Hz时钟控制(每100ms移动1次);球拍参数:尺寸为10×60像素(宽×高),左右球拍初始x坐标分别为20、610(距屏幕左右边界20像素),移动步长为5像素(每按1次按键移动5像素);分数显示:采用2位数字显示(0-9),左分数显示在屏幕左上角(50,30),右分数显示在右上角(550,30),数字尺寸为32×48像素。三、硬件电路设计3.1FPGA与外设连接本设计需用到的外设包括:2个按键(控制左球拍上下移动)、2个按键(控制右球拍上下移动)、1个复位按键、VGA接口(连接显示器)。硬件连接如表3-1所示。表3-1FPGA与外设连接表外设接口FPGA引脚功能说明左球拍上移按键KEY[0]按下时左球拍上移左球拍下移按键KEY[1]按下时左球拍下移右球拍上移按键KEY[2]按下时右球拍上移右球拍下移按键KEY[3]按下时右球拍下移复位按键KEY[4]按下时游戏重置(分数清零、球复位)VGA行同步VGA_HS连接显示器HSYNC引脚VGA场同步VGA_VS连接显示器VSYNC引脚VGA红基色VGA_R[2:0]3位红基色信号(低分辨率)VGA绿基色VGA_G[2:0]3位绿基色信号VGA蓝基色VGA_B[2:0]3位蓝基色信号注:按键采用“高电平有效”(未按下时为低电平,按下时为高电平),需通过内部消抖电路处理;VGA基色信号为3位(共27级灰度),满足基本显示需求。3.2电源与时钟电路FPGA开发板由外部5V电源供电,板载稳压器输出3.3V为FPGA及外设供电;板载50MHz晶振为系统提供基准时钟,通过内部PLL或分频电路生成所需时钟(25MHz、10Hz)。四、软件模块设计(VHDL实现)4.1时钟分频模块功能:将50MHz时钟分频为25MHz(VGA驱动)和10Hz(游戏逻辑)。核心逻辑:采用计数器实现分频,50MHz→25MHz需计数至1(每2个时钟周期输出1个脉冲),50MHz→10Hz需计数至4,999,999(每500,000个时钟周期输出1个脉冲)。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityclk_divisport(clk_50m:instd_logic;--输入50MHz时钟rst_n:instd_logic;--复位(低电平有效)clk_25m:outstd_logic;--输出25MHz时钟clk_10hz:outstd_logic--输出10Hz时钟);endclk_div;architecturebehavioralofclk_divissignalcnt_25m:std_logic_vector(1downto0);--25MHz分频计数器signalcnt_10hz:std_logic_vector(22downto0);--10Hz分频计数器signalclk_25m_reg,clk_10hz_reg:std_logic;begin--25MHz分频:50MHz/2=25MHzprocess(clk_50m,rst_n)beginifrst_n='0'thencnt_25m<="00";clk_25m_reg<='0';elsifrising_edge(clk_50m)thenifcnt_25m="01"then--计数到1时翻转cnt_25m<="00";clk_25m_reg<=notclk_25m_reg;elsecnt_25m<=cnt_25m+1;endif;endif;endprocess;clk_25m<=clk_25m_reg;--10Hz分频:50MHz/5,000,000=10Hzprocess(clk_50m,rst_n)beginifrst_n='0'thencnt_10hz<=(others=>'0');clk_10hz_reg<='0';elsifrising_edge(clk_50m)thenifcnt_10hz=4999999then--计数到4,999,999时翻转cnt_10hz<=(others=>'0');clk_10hz_reg<=notclk_10hz_reg;elsecnt_10hz<=cnt_10hz+1;endif;endif;endprocess;clk_10hz<=clk_10hz_reg;endbehavioral;4.2球拍控制模块功能:接收按键输入(消抖后),更新左右球拍y坐标,限制移动范围(y≥20,y≤420,避免超出屏幕上下边界)。核心逻辑:按键消抖采用“10ms延时判断”(连续10ms检测到按键高电平则确认按下);每检测到1次有效按键,球拍y坐标±5像素(上移减5,下移加5),并通过比较器限制边界。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityracket_controlisport(clk_10hz:instd_logic;--10Hz时钟(按键扫描)rst_n:instd_logic;--复位key_l_up:instd_logic;--左球拍上移按键(消抖后)key_l_dn:instd_logic;--左球拍下移按键(消抖后)key_r_up:instd_logic;--右球拍上移按键(消抖后)key_r_dn:instd_logic;--右球拍下移按键(消抖后)left_racket_y:outstd_logic_vector(9downto0);--左球拍y坐标(0-479)right_racket_y:outstd_logic_vector(9downto0)--右球拍y坐标);endracket_control;architecturebehavioralofracket_controlissignalleft_y,right_y:std_logic_vector(9downto0);--内部寄存器beginprocess(clk_10hz,rst_n)beginifrst_n='0'thenleft_y<="0111100000";--初始y=240(屏幕中心)right_y<="0111100000";elsifrising_edge(clk_10hz)then--左球拍控制ifkey_l_up='1'thenifleft_y>20then--上边界限制(≥20)left_y<=left_y-5;endif;elsifkey_l_dn='1'thenifleft_y<420then--下边界限制(≤420,因球拍高60,420+60=480)left_y<=left_y+5;endif;endif;--右球拍控制(逻辑同上)ifkey_r_up='1'thenifright_y>20thenright_y<=right_y-5;endif;elsifkey_r_dn='1'thenifright_y<420thenright_y<=right_y+5;endif;endif;endif;endprocess;left_racket_y<=left_y;right_racket_y<=right_y;endbehavioral;4.3碰撞检测模块功能:根据球坐标(x_pos,y_pos)和球拍坐标,判断碰撞类型(上下边界、左右球拍),输出碰撞信号。核心逻辑:上下边界碰撞:当球的y坐标≤10(上边界)或≥470(下边界)时,触发垂直方向碰撞(dy反向);球拍碰撞:当球的x坐标≤左球拍x+10(左球拍右边界)且球的y坐标在左球拍y~y+60范围内时,触发左球拍碰撞(dx反向);右球拍碰撞逻辑类似(球x≥右球拍x-10,y在右球拍y~y+60范围内)。libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entitycollision_detectisport(ball_x:instd_logic_vector(9downto0);--球x坐标ball_y:instd_logic_vector(9downto0);--球y坐标left_racket_y:instd_logic_vector(9downto0);--左球拍y坐标right_racket_y:instd_logic_vector(9downto0);--右球拍y坐标border_collision:outstd_logic;--上下边界碰撞(1有效)left_collision:outstd_logic;--左球拍碰撞(1有效)right_collision:outstd_logic;--右球拍碰撞(1有效)score_left:outstd_logic;--左方失分(球出右边界,1有效)score_right:outstd_logic--右方失分(球出左边界,1有效));endcollision_detect;architecturebehavioralofcollision_detectis--球拍x坐标固定:左球拍x=20,右球拍x=610constantleft_racket_x:std_logic_vector(9downto0):="0000101000";--20constantright_racket_x:std_logic_vector(9downto0):="1001100110";--610beginprocess(ball_x,ball_y,left_racket_y,right_racket_y)begin--初始化信号border_collision<='0';left_collision<='0';right_collision<='0';score_left<='0';score_right<='0';--上下边界碰撞(球y≤10或≥470)ifball_y<=10orball_y>=470thenborder_collision<='1';endif;--左球拍碰撞(球x≤30(20+10),且球y在左球拍y~y+60之间)ifball_x<=30andball_y>=left_racket_yandball_y<=(left_racket_y+60)thenleft_collision<='1';endif;--右球拍碰撞(球x≥600(610-10),且球y在右球拍y~y+60之间)ifball_x>=600andball_y>=right_racket_yandball_y<=(right_racket_y+60)thenright_collision<='1';endif;--失分判断:球出左边界(x≤10)→右方得分;球出右边界(x≥630)→左方得分ifball_x<=10thenscore_right<='1';--右方得1分elsifball_x>=630thenscore_left<='1';--左方得1分endif;endprocess;endbehavioral;4.4VGA显示控制模块功能:生成VGA同步信号(hsync,vsync),根据当前像素坐标(px,py)绘制游戏元素(球、球拍、分数),输出RGB颜色信号。核心逻辑:VGA时序生成:根据640×480分辨率时序参数,通过计数器生成行/场同步信号;图形绘制:当(px,py)处于球的坐标范围内时,RGB输出白色("111111111");处于球拍范围内时,输出蓝色("000000111");分数通过ROM存储的字模实现显示(此处简化为固定位置显示数字)。五、仿真与测试5.1功能仿真在ModelSim中对各模块进行单独仿真及系统联合仿真,以“球运动与碰撞检测”为例,仿真结果如图5-1所示(注:实际报告需插入仿真波形图)。仿真条件:球初始位置(320,240),初始方向(dx=1,dy=-1),左球拍y=240,右球拍y=240;关键波形:当球y坐标减小至10时,border_collision信号变为1,随后dy反向(球开始向下运

温馨提示

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

评论

0/150

提交评论