资源描述:
《基于FPGA乒乓球游戏机Verilog设计》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、基于FPGA乒乓球游戏机Verilog设计整理者:G゛佑咡江西师范大学电子信息工程前言:此类程序鉴于网上大多是VHDL设计,所以我整理一份Verilog设计供初学者参考,因为时间关系,程序没有优化,也没有注释,如有不妥的地方,请大家多提意见。摘要:本文使用FPGA芯片来模拟实际的乒乓球游戏。本设计是基于Altera公司的FPGACycloneII芯片EP2C5T144C8的基础上实现,运用VerilogHDL语言编程,在QuartusII软件上进行编译、仿真,最终在开发板上成功实现下载和调试。1乒乓球游戏机系统组成乒乓球比赛游戏机的组成如图1所示。比赛规则约定:五局三胜;1分一
2、局;裁判发出比赛开始信号,触发FPGA内部随机数发生器模块产生首次发球权方;比赛进行中,选手连续两次获得发球权后,发球权交予对方,如未获发球权方发球,裁判端犯规音响电路鸣响;6个LED排列成行模拟乒乓球台(因为我的开发板上只有6个LED灯,比赛开始时候中间两个灯亮,如果有条件的话有10来个灯最好了);点亮的LED模拟乒乓球,受FPGA控制从左到右或从右到左移动;比赛选手通过按钮输入模拟击球信号,实现LED移位方向的控制;若发亮的LED运动在球台中点至对方终点之间时,对方未能及时按下击球按钮使其向相反方向移动,即失去一分。2功能模块设计图1中,基于FPGA设计的控制端为整个系统的
3、核心,其内部主要由简易随机数发生器、发球权控制器、乒乓球位置控制器、甲乙方计分控制器、犯规音响控制器等模块组成。整个控制端采用模块化设计,先用Verilog语言编写功能模块,然后用顶层原理图将各功能模块连接起来。设计的难点在于协调各模块工作,严格遵守各信号间时序关系。本系统采用50MHz系统时钟。2.1简易随机数发生器比赛首次发球权由随机数发生器产生的数据决定,其随机性要求不严,因此,采用非常简单的模式产生,即一旦FPGA上电,系统时钟百分频产生一方波信号square,当裁判闭合开始比赛开关产生start信号上升沿时,读取此时square信号值作为随机数发生器输出data_ra
4、nd。模块仿真如图2所示,结果满足设计要求。此模块设计时保证了square信号周期应远大于start信号上升沿建立时间,保证随机数据的正确读取。2.2发球权控制器发球权控制器的控制过程为:如果按下复位按钮,发球权数码管显示8,否则,开始比赛开关闭合时,显示随机数发生器的值(0或1,0代表甲方、1代表乙方)。而在比赛中,为遵守发球权交换规则,设计甲乙双方计分器总和信号sum是不为0的偶数时(即计分总次低位变化时),发球权数码管显示由0变为1或由1变为0。此模块设计中,发球权数码管的信号控制受多个时钟的控制,即开始比赛开关start和计分值sum[1]信号,将两个信号组合成一个时钟
5、信号,并统一两个时钟的触发沿。因此最佳时钟触发方式如图3所示的qq_en信号。为满足这种时序要求,借助计分总和次低位sum_1信号和启动信号start设计qq_en信号。图3pp_en信号产生模块仿真pp_en信号产生模块如下:modulepp_en(clk,start,sum_1,pp_en,cnt);inputclk;inputstart;//裁判启动信号inputsum_1;//总局数sum次低位sum[1]outputpp_en;output[4:0]cnt;//pp_en信号个数//-------------------------------------------
6、---------regsum_1_a,sum_1_b;regstart_a,start_b;reg[4:0]cnt_r;always@(posedgeclk)beginstart_a<=start;start_b<=start_a;sum_1_a<=sum_1;sum_1_b<=sum_1_a;end//----------------------------------------------------always@(posedgeclk)beginif(pp_en)cnt_r<=cnt_r+4'b1;elsecnt_r<=cnt_r;end//-------------
7、---------------------------------------assigncnt=cnt_r;assignpp_en=(start_a^start_b)
8、(sum_1_a^sum_1_b);endmodule根据pp_en信号和随机数data_rand控制甲乙球权模块:modulepp_possession(clk,reset,data_rand,pp_en,cnt,led_pose);inputclk;inputreset;inputdata_rand;inputpp_en