乒乓球游戏机研究报告及VHDL源程序.docx
- 文档编号:4057115
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:10
- 大小:74.84KB
乒乓球游戏机研究报告及VHDL源程序.docx
《乒乓球游戏机研究报告及VHDL源程序.docx》由会员分享,可在线阅读,更多相关《乒乓球游戏机研究报告及VHDL源程序.docx(10页珍藏版)》请在冰豆网上搜索。
乒乓球游戏机研究报告及VHDL源程序
乒乓球游戏机研究报告及VHDL源程序
————————————————————————————————作者:
————————————————————————————————日期:
设计报告
课程名称在系统编程技术
任课教师周泽华老师
设计题目乒乓球游戏机
班级11电子信息工程
(1)班
姓名卢海军
学号1105011024
日期2013/12/29
摘要
用VHDL编程模拟乒乓球比赛,电路模块由状态机、记分器、译码显示器等部分组成,对各部分编写VHDL算法,进行编译、仿真、逻辑综合、逻辑适配及程序下栽.通过GW48型EDA实验箱的验证,乒乓游戏机能模拟乒乓球比赛的基本过程和规则,并能自动裁判和记分。
VHDL是高速集成电路硬件描述语言,目前已成为许多设计自动化工具普遍采用的标准化硬件描述语言.VHDL语言功能性强、覆盖面广、灵活性高,具有很好的实用。
本文设计一个基于VHDL的乒乓游戏机模拟乒乓球比赛。
设计的难点是状态机。
并对其进行仿真,给出了仿真波形,完整程序可写入芯片,配合外围元器件,实现乒乓游戏机的功能。
关键词:
VHDL;GW48;乒乓游戏机
一、系统功能概述
1.系统的功能
两人乒乓球游戏机是用7个发光二极管代表乒乓球台,用点亮的发光二极管按一定的方向移动来表示球的运动。
在游戏机的两侧各设置一个开关,即击球开关HitA,HitB。
甲乙二人按乒乓球比赛规则来操作开关。
当甲按动击球开关时,靠近甲的第一个二极管亮,然后发光二极管由甲向乙依次点亮,代表乒乓球的移动。
当球过网(中点)时,乙方可以击球。
若乙方提前或是没击中球则判乙方失分,甲方的计分牌自动加分。
然后重新发球,比赛继续。
比赛直到一方分数达到11分时,比赛结束。
2.各项设计指标
a.用两个开关表示HitA,HitB,当开关值为1时表示击球。
b.设置一个复位信号RESET.当reset有效时,计分牌清0。
二、系统组成以及系统各部分的设计
1、系统结构描述
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entitypingpangis
Port(clk:
inSTD_LOGIC;--时钟,与球飞行速度有关
hita:
inSTD_LOGIC;--A选手击球键
hitb:
inSTD_LOGIC;--B选手击球键
reset:
inSTD_LOGIC;--低电平异步复位,高电平比赛进行中
led0:
outSTD_LOGIC_VECTOR(3downto0);--B选手得分
led1:
outSTD_LOGIC_VECTOR(3downto0);
led2:
outSTD_LOGIC_VECTOR(3downto0);--A选手得分
led3:
outSTD_LOGIC_VECTOR(3downto0);
light:
outSTD_LOGIC_VECTOR(6downto0);--显示球飞行位置
);
endpingpang;
architectureBehavioralofpingpangis
signalascore1,ascore0,bscore1,bscore0:
std_logic_vector(3downto0);--得分
signalnum:
integerrange0to9;--正亮着的light序号
--0表示b侧落地,4表示网,8表示a侧落地,9表示全准备发球
Begin
process(clk,reset,hita,hitb)
variabledir:
integerrange0to2;--0:
A=>B;1:
B=>A;2:
准备发球
begin
ifreset='0'then--低电平异步复位,高电平比赛进行中
num<=9;
dir:
=2;
ascore1<="0000";
ascore0<="0000";
bscore1<="0000";
bscore0<="0000";
elsifrising_edge(clk)then
ifdir=2andascore1<"1010"andbscore1<"1011"then
--准备发球,若已显示名次,则比赛结束,不再发球
if(hita='1')then--A发球
num<=7;
dir:
=0;
elsif(hitb='1')then--B发球
num<=1;
dir:
=1;
elsenum<=9;--无人发球,继续准备
dir:
=2;
endif;
elsifdir=0andnum>0then--A=>B,未落台
ifhita='1'then--A连续击球两次
num<=9;
if(bscore1="0000")then--B得分
if(bscore0="1001")then
bscore0<="0000";
bscore1<="0001";
elsebscore0<=bscore0+'1';
endif;
elsif(bscore1="0001")then--B胜利,显示名次和分数
bscore1<="0001";--1
bscore0<="1011";--b
endif;
dir:
=2;--进入发球状态
elsifhitb='1'then
ifnum<4then--B正常击球
num<=num+1;
dir:
=1;
else--B提前击球
num<=9;
if(ascore1="0000")then--A得分
if(ascore0="1001")then
ascore0<="0000";
ascore1<="0001";
elseascore0<=ascore0+'1';
endif;
elsif(ascore1="0001")then--A胜利,显示名次和分数
ascore1<="0001";--1
ascore0<="1010";--a
endif;
dir:
=2;--进入发球状态
endif;
elsenum<=num-1;--球继续飞行
dir:
=0;
endif;
elsifdir=1andnum<8then--B=>A,未落台
ifhitb='1'then--B连续击球两次
num<=9;
if(ascore1="0000")then--A得分
if(ascore0="1001")then
ascore0<="0000";
ascore1<="0001";
elseascore0<=ascore0+'1';
endif;
elsif(ascore1="0001")then--A胜利,显示名次和分数
ascore1<="0001";--1
ascore0<="1010";--a
endif;
dir:
=2;--进入发球状态
elsifhita='1'then
ifnum>4then--B正常击球
num<=num-1;
dir:
=0;
else--B提前击球
num<=9;
if(bscore1="0000")then--B得分
if(bscore0="1001")then
bscore0<="0000";
bscore1<="0001";
elsebscore0<=bscore0+'1';
endif;
elsif(bscore1="0001")then--B胜利,显示名次和分数
bscore1<="0001";--1
bscore0<="1011";--b
endif;
dir:
=2;--进入发球状态
endif;
elsenum<=num+1;--球继续飞行
dir:
=1;
endif;
elsifdir=0andnum=0then--B侧落台
num<=9;
if(ascore1="0000")then
if(ascore0="1001")then--A得分
ascore0<="0000";
ascore1<="0001";
elseascore0<=ascore0+'1';
endif;
elsif(ascore1="0001")then--A胜利,显示名次和分数
ascore1<="0001";--1
ascore0<="1010";--a
endif;
dir:
=2;--进入发球状态
elsifdir=1andnum=8then--A侧落台
num<=9;
if(bscore1="0000")then--B得分
if(bscore0="1001")then
bscore0<="0000";
bscore1<="0001";
elsebscore0<=bscore0+'1';
endif;
elsif(bscore1="0001")then--B胜利,显示名次和分数
bscore1<="0001";--1
bscore0<="1011";--b
endif;
dir:
=2;--进入发球状态
endif;
endif;
endprocess;
process(num)
begin
light<="0000000";
casenumis
when1=>light(0)<='1';
when2=>light
(1)<='1';
when3=>light
(2)<='1';
when4=>light(3)<='1';
when5=>light(4)<='1';
when6=>light(5)<='1';
when7=>light(6)<='1';
when8=>light<="1111000";--A侧落台
when9=>light<="1111111";--准备发球
when0=>light<="0001111";--B侧落台
endcase;
endprocess;
led3<=ascore1;
led2<=ascore0;
led1<=bscore1;
led0<=bscore0;
endBehavioral;
2.原理图
3.系统的仿真波形
3.下载时选择的开发系统模式以及管脚定义
开发系统模式:
模式5
GW48开发系统工作模式:
接口
名称
类型
(输入/输出)
结构图上
的信号名
引脚号
说明
clk
输入
CLOCK0
2
输入1hz的时钟信号
hita
输入
PIO1
6
A击球
hitb
输入
PIO0
5
B击球
…reset
输入
PIO2
7
复位信号
light
输出
PIO14-PIO8
24-21
19-17
点亮的发光二极管表示球的运动
led0
输出
PIO23-PIO20
38-35
表示B得分
led1
输出
PIO31-PIO28
53-50
表示B名次
led2
输出
PIO19-PIO16
30-27
表示A得分
led3
输出
PIO27-PIO24
49-47
39
表示A名次
三、课程设计过程中遇到的问题以及解决方法
在本次课程设计中,我遇到的问题就是没有设定一个裁判的功能,也就是说不能由裁判去指挥A或者是B先发球。
解决方法就是在设置两个输入,starta,startb作为裁判的选择。
四、实验总结:
1、通过本次实验进一步掌握了使用Quartus2软件的设计流程
2、这次实验综合采用VHDL语言设计程序充分锻炼了编程和调试程序的能力。
实验要求较多,需要足够的耐心和高度谨慎的态度,只要将所有条件理清楚,搞清它们之间的牵制关系,一一列出,并在头脑中形成清晰的条理框架,一点点、一块块攻克。
语句不难,难的是一环扣一环的编程思维,出错不要紧,关键是能坚持下去,一旦将程序调试成功一定会收获很多。
我在实验过程中遇到了很多问题,通过向老师及同学请教都已基本解决,弥补了学习中的不足,受益匪浅。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 乒乓球 游戏机 研究 报告 VHDL 源程序