乒乓球游戏的FPGA实现.doc

上传人:sk****8 文档编号:3527013 上传时间:2019-06-02 格式:DOC 页数:25 大小:1.77MB
下载 相关 举报
乒乓球游戏的FPGA实现.doc_第1页
第1页 / 共25页
乒乓球游戏的FPGA实现.doc_第2页
第2页 / 共25页
乒乓球游戏的FPGA实现.doc_第3页
第3页 / 共25页
乒乓球游戏的FPGA实现.doc_第4页
第4页 / 共25页
乒乓球游戏的FPGA实现.doc_第5页
第5页 / 共25页
点击查看更多>>
资源描述

1、基于 FPGA 的乒乓球游戏系统设计文档系统说明: 我们组主要完成的是乒乓球游戏的实现,此游戏是在两个人之间进行的,两个开关键决定了开始是由左右哪一方先发球,按空格键表示发球开始;接下来,球在矩形框图内(相当于球桌)运动,游戏设计成:如果球碰到了矩形上下边界会弹会矩形内继续运动,在球出左右边界之前,如果有一方的球拍未能碰到球,那么对方得分。每两球后换对方发球,如果有一方先得到十分,那么该局游戏结束;然后按空格键开始下一局的游戏。拍子的移动通过键盘输入控制,可以进行上下左右的移动;显示部分则通过 VGA 接口连接到显示器上,主要包括:背景部分,矩形边框,拍子,球运动四部分显示。系统模块和任务分配

2、:1. 键盘输入(read_ps2) 徐敬德2. VGA 显示(vga_display)许科3. 拍子移动(bat) 杜俊蛟4. 游戏主控与随机数产生(ctrl_fsm & random)黄磊系统顶层框图: 乒乓球游戏的 FPGA 实现reset_iclk_iserve_1_iserve_2_ips2_clk_ips2_data_ir_ob_og_ovga_vs_o vga_hs_o系统接口说明:接口名称 类型 封装管脚 说明clk_i In P54 系统时钟reset_i In P 连接到按钮,进行全局复位ps2_clk_i In P96 键盘输入时钟ps2_data_i In P97 键盘

3、输入数据serve_1_i In P 开关 1,高电平左方先发球serve_2_i In P 开关 2,高电平右方先发球vga_vs_o Out P35 场同步信号,输出到显示器vga_hs_o Out P39 行同步信号,输出到显示器r_o Out P67 红色信号g_o Out P50 绿色信号b_o Out P43 蓝色信号系统说明:系统仿真:由于整个系统分成了四个模块,每个人各自完成自己的部分,并且每个人都做好自己的仿真与测试工作,系统级联时,如果各个部分都做好了,只要把相应的管脚连接设置清楚,就可以进行整体调试了,而没必要再做系统仿真了。系统模块原理图:系统整体资源Selected

4、Device : 3s100etq144-5 Number of Slices: 456 out of 960 47% Number of Slice Flip Flops: 210 out of 1920 10% Number of 4 input LUTs: 852 out of 1920 44% Number of IOs: 16Number of bonded IOBs: 16 out of 108 14% Number of GCLKs: 1 out of 24 4% Timing constraint: Default period analysis for Clock clk_i

5、Clock period: 11.208ns (frequency: 89.223MHz)Total number of paths / destination ports: 62084 / 317实验结果:以下是我们的实验结果的照片显示:总结与说明:自从这门课结束后,我们组就一直在讨论实验的主题,大家也都各自去查找相关资料,最终敲定了乒乓球游戏。对于系统框架,我们做了精心的讨论,最终把整个系统分成四个模块,由四个同学分别独立完成,把游戏最核心部分游戏控制模块交给黄磊同学来完成。就这样,两个星期前我们开始动手实验,经过两个星期的努力,整个系统最终大功告成;可以说,经过这次实验,我们的收获还是很

6、大的,不仅在编程能力和经验上有了很大的提高,也对系统设计有了大致的框图,并且进一步锻炼了团队合作能力。在编程中,由于对语法和指令不甚熟悉,刚开始的进度还是比较缓慢的,在调试过程中,更是遇到了很多问题,最终也都一一得以解决了。当然,由于时间和水平有限,整个系统还是有一些问题,今后可以进一步改进:1.我们设计的游戏规则还是相对简单,距离实际的乒乓游戏还是有一定差距,比如没有考虑球碰到桌面反弹的过程,也没有考虑中间有拦截网的问题;2.在一局游戏结束后,原本设想把获胜一方显示在屏幕上,由于时间有限,这部分最终没有去实现;以上就是整个系统的设计文档,请老师指正!键盘模块文档徐敬德模块描述:此模块使用 v

7、erilog 语言,主要完成的是键盘与游戏主控部分的接口,先接收键盘的时钟和数据信号,以此来接收通码,然后与程序中已保存的通码做比较,从而达到识别按键的目的,如果输入的按键是 w,s,a,d(左拍子的上下左右) ,y,h,g,jt(右拍子的上下左右) ,space 中的某一个,那么相应的把输出信号left_dir,right_dir ,serve 设置为高电平,传给下一个模块,作为游戏主控模块的输入信号。按键原理介绍:当一个键被按下,这个键的通码就被发送到计算机。多数第二套通码只有一个字节宽,但也有少数扩展按键的通码是两字节或四字节宽,这类通码的第一个字节总是E0h。只要键一释放,断码就会被发

8、送。每个键都有它自己唯一的通码和唯一的断码。多数第二套断码有两字节长,它们的第一个字节是F0h 第二个字节是这个键的通码。扩展按键的断码通常有三个字节,它们前两个字节是E0h,F0h ,最后一个字节是这个按键通码的最后一个字节。如果按了一个键,这个键的通码被发送到计算机;当你按下并按住这个键,则键盘将一直发送这个键的通码直到它被释放或者其他键被按下。以下就是从键盘发送数据的时序图:值得一提的是:这里可以用键盘时钟,也可以用高速的系统时钟来进行数据的采集。模块管脚说明:键盘模块包含两个部分,read_ps2_new 和 ps2_ctrl_new。ps2_ctrl_new 部分的管脚说明如下:接口

9、名称 类型 说明Clk in 时钟Reset in 复位PS2_Clk in 键盘输入时钟PS2_Data in 键盘输入数据enable out 使能信号,通知主模块来调用Scan_Code out 通码或者断码read_ps2_new 部分的管脚说明如下:接口名称 类型 说明Reset in 复位PS2_Clk in 键盘输入时钟PS2_Data in 键盘输入数据Clk in 时钟输入left_dir out 3 位输出信号,001,010,100,011分别表示左拍子上下左右的移动right_dir out 3 位输出信号,001,010,100,011分别表示右拍子上下左右的移动se

10、rve out 为 1 时,表示开始发球ps2_code out 按键的通码或者断码值模块说明: 根据如上的管脚说明,可以看出 ps2_ctrl_new 主要完成按键通码与断码的采集。程序中,第一个 always 主要是根据系统时钟以及键盘输入来的时钟,产生一个稳定的时钟信号 filter_clk,在此时钟的上升沿采集键盘输入的数据,因此把它做为第二个 always 的敏感表;第二个 always 中采用了状态机的方法,分为 idle 与 shifting 两个状态,其中 shifting 主要用作数据的输入,以及寄存器的移位。当输入数据计算器计到 8 时,就可以判定输入的断码与通码发送完成了

11、,这个时候把使能信号 enable 设置为 1,并把此通码或者断码赋给 Scan_Code 做为输出;而当计数器计到 9 时,就把 enable 设置为 0,并把 Scan_Code 清 0,这样,Scan_Code 就有值的时间就仅为一个 filter_clk 周期。read_ps2_new 做为主模块,调用了 ps2_ctrl_new 模块,并把 ps2_ctrl_new的输出信号 Scan_Code 和 enable 做为输入,来获得通码或短码值以及相应的使能信号。在该模块中,使用三段式状态机的写法:第一段使用时序逻辑,进行状态转移;第二段使用组合逻辑,根据状态标志位进行状态转移的判断。

12、第三断也使用时序逻辑,根据输入信号的不同,作出相应的输出。采用三段状态机的写法,不仅有利与阅读和理解,更重要的是有利于综合器的优化代码,有利于添加合适的时序约束条件,有利于布局布线。状态转移部分分成了四个状态:通码输入状态 make_code_begin;断码值F0 输入状态 break_code;断码值输入状态 make_code_end 以及最后的状态标志位,输出清空状态 clear_state。模块状态机:make_code_begin:完成通码输入判断功能。把输入的通码与事先保存好的拍子上下左右移动的通码做比较,如果吻合,就进入 break_code,并且把 fsm1 设置为 1,相应

13、的输出 left_dir,right_dir 或 serve 设置为相应的高电平,指示给游戏主控部分和拍子模块;如果不吻合,也就是输出的不是我们想要的拍子移动的按键,那么继续处于此状态。break_code:进入此状态,说明已经有通码输入了,那么判断接下来的输入数据是否为 F0h,如果是的话,就表示按键松开了,那么就把 fsm2 设置为 1,进入下一个状态 make_code_en,如果不是,就表示按键一直按住,这个时候返回上一个状态 make_code_begin。make_code_end:判断接下来的输入是不是与刚才输入的通码值一致,如果是的话,进入下一个状态,把 fsm3 设置为 1,

14、否则,处于等待状态。clear_state:这个状态主要完成的是几个标志位的清 0,以及把left_dir,right_dir 或 serve 清 0。仿真波形:对于该模块的仿真,原本打算在 modesim 下完成的,但是考虑到该部分仿真比较简单,因此决定用 xinlinx 自带的仿真工具来进行。以上是 ps2_ctrl_new 模块的仿真波形图,有四个输入信号,分别是Clk,Reset,PS2_Clk,PS2_Data。我们产生相应的波形来做为键盘输入时钟与数据的时序,当发送完毕后,enable 就设置为了 1,且 Scan_Code 有了通码或者断码值了。以上是 read_ps2_new 模块的仿真波形图,此处的时序仿真为了方便,只输入一个通码来做仿真,我们也可以看出 able 信号设置为 1 了。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。