APP下载

基于FPGA“乒乓球比赛游戏机”的设计

2010-01-20曹莉凌刘雨青

现代电子技术 2009年21期
关键词:状态机

曹莉凌 刘雨青

摘 要:FPGA的低成本正推动其在消费电子产品中的应用,为进一步挖掘其在娱乐产品应用中的巨大商机,基于Altera公司FPGA,在Quartus Ⅱ8.1环境下,运用VHDL语言、采用有限状态机等设计方法设计了一款乒乓球比赛游戏机。介绍了该游戏机系统功能模块划分及关键模块具体设计方案,给出设计和调试中遇到的问题及解决途径,并进行了仿真测试。仿真结果表明,该乒乓球游戏机工作正常,具有发球权控制、自动计分、犯规提示等多种功能,能有效模拟实际乒乓球比赛。

关键词:乒乓球比赛游戏机;FPGA;VHDL;状态机

中图分类号:TN40 文献标识码:A

文章编号:1004-373X(2009)21-131-04

Design of Table Tennis Game Player Based on FPGA

CAO Liling,LIU Yuqing

(College of Engineering Science and Technology,Shanghai Ocean University,Shanghai,201306,China)

Abstract:Low-cost of FPGA has promoted its applications in consumer electronic products.To further grasp its enormous business opportunities in entertainment products,a table tennis game player has been designed which is based on Altera Corporation FPGA,using Quartus Ⅱ8.1 and VHDL language,adopting some design methods such as the finite state machine,the functional modules division of the game player and the specific design schemes of main modules are introduced,problems and appropriate solutions during designing and debugging are summaried,the simulation and tests are given,the results show that the design of such table tennis game player is correct,it gets many functions such as control of right to serve,automatic counting and signal of illegality so that it can simulate the actual table tennis effectively.

Keywords:table tennis game player;FPGA;VHDL;state machine

可编程逻辑器件FPGA以其开发周期短、成本低、功耗低、可靠性高等优势,广泛应用于通信、航空、医疗等领域[1-3],近年来在消费电子领域[4]中的应用也日渐增加。为进一步挖掘FPGA在家庭娱乐如游戏机开发与应用中的巨大商机,介绍了一款以Altera公司FPGA芯片为控制核心,附加少量外围电路组成的乒乓球比赛游戏机[5]。整个系统设计模块划分清晰:包括裁判端、选手端、控制端、显示端及模拟乒乓球台;功能齐全:包括发球权控制、犯规提示、局数比分显示等,模拟实际乒乓球比赛相似程度高。采用了VHDL[6,7]语言编程实现,在Quartus Ⅱ8.1[8,9]集成环境下进行了模拟仿真,结果表明在设定的比赛规则下,游戏机运行正常,通过进一步优化可将其商品化,推入市场。

1 系统组成

乒乓球比赛游戏机的组成如图1所示。比赛规则约定:五局三胜;11分一局;裁判发出比赛开始信号,触发FPGA内部随机数发生器模块产生首次发球权方;比赛进行中,选手连续两次获得发球权后,发球权交予对方,如未获发球权方发球,裁判端犯规音响电路鸣响;13个LED排列成行模拟乒乓球台;点亮的LED模拟乒乓球,受FPGA控制从左到右或从右到左移动;比赛选手通过按钮输入模拟击球信号,实现LED移位方向的控制;若发亮的LED运动在球台中点至对方终点之间时,对方未能及时按下击球按钮使其向相反方向移动,即失去一分。

图1 基于FPGA乒乓球比赛游戏机组成框图

2 功能模块设计

图1中,基于FPGA设计的控制端为整个系统的核心,其内部主要由简易随机数发生器、发球权控制器、乒乓球位置控制器、甲乙方计分控制器、犯规音响控制器等模块组成。整个控制端采用模块化设计,先用VHDL语言编写功能模块,然后用顶层原理图将各功能模块连接起来。设计的难点在于协调各模块工作,严格遵守各信号间时序关系。本系统采用1 kHz系统时钟。

2.1 简易随机数发生器

比赛首次发球权由随机数发生器产生的数据决定,其随机性要求不严,因此,采用非常简单的模式产生,即一旦FPGA上电,系统时钟百分频产生一方波信号square,当裁判闭合开始比赛开关产生start信号上升沿时,读取此时square信号值作为随机数发生器输出randq。模块仿真如图2所示,结果满足设计要求。此模块设计时保证了square信号周期应远大于start信号上升沿建立时间,保证随机数据的正确读取。

图2 简易随机数发生器模块仿真

2.2 发球权控制器

发球权控制器的控制过程为:如果按下复位按钮,发球权数码管显示8,否则,开始比赛开关闭合时,显示随机数发生器的值(0或1,0代表甲方、1代表乙方)。而在比赛中,为遵守发球权交换规则,设计甲乙双方计分器总和信号sum_sc是不为0的偶数时(即计分总和最低位sum_sc0下降沿到来时),发球权数码管显示由0变为1或由1变为0。

此模块设计中,发球权数码管的信号控制受多个时钟的控制,即开始比赛开关start和计分值sum_sc0信号,这在VHDL编程语言中无法用一个进程实现,必须将两个信号组合成一个时钟信号,并统一两个时钟的触发沿。因此最佳时钟触发方式如图3所示的fqq_en信号。为满足这种时序要求,借助计分总和次低位sum_sc1信号设计entity sum_sc_mod2,由于start和sum_sc1的频率都远低于系统时钟信号clk频率,则可借助clk 高频信号捕捉其边沿产生新的时钟信号fqq_en,并产生其计数值,仿真波形如图4(a)所示。为保证发球权数码管显示正确,设计 entity led_fqq_ctl在fqq_en下降沿时,根据其计数值产生相应的数码管输出信号led_fqq,仿真波形如图4(b)所示。

发球权控制器的VHDL核心程序如下:

entity sum_sc_mod2:

process(clk)

begin

if clk′event and clk=′1′ then--系统时钟

mod2_en1<=sum_sc1;mod2_en2<=mod2_en1;

start1<=start;start2<=start1;

end if;

end process;

fqq_en<=(mod2_en1 xor mod2_en2) or (start1 xor start2);

mod2_en<=(mod2_en1 xor mod2_en2) or (start1 xor start2);

process(mod2_en)

begin

if mod2_en′event and mod2_en=′1′ then

cnt1<=cnt1+1;

end if;

end process;

cnt<=cnt1;

entity led_fqq_ctl:

process(reset,cnt)

begin

if reset =′0′ then led<="1000";--复位按钮按下,发球权数码管显示8

elsif fqq_en′event and fqq_en=′0′ then

if cnt=1 then led<="000"&rand;

else led<="000"¬ led(0);

--fqq_en第一个下降沿显示随机数的值,其他下降沿交换发球权

end if;

end if;

end process;

图3 发球权显示控制器控制时钟

图4 发球权控制器模块仿真

2.3 乒乓球位置控制、甲乙计分、犯规音响控制

乒乓球位置控制电路为FPGA控制端的核心,依据比赛规则,采用了Mealy型状态机[10]来实现,大大降低了设计难度。状态机共定义了7个状态,各状态定义如表1所示,状态转换如图5所示,转换条件如表2所示,具体程序如下。

表1 Mealy型状态机状态定义

状态定义

s0发球权为0时,乒乓球位置为最左端;发球权为1时,乒乓球位置为最右端

s1如果甲击球,乒乓球右移;如果乙击球,犯规音响电路鸣响

s2判断乒乓球进入乙方台面后,乙是否击球; 判断乒乓球是否仍处于甲方台面及中点;否则,甲方得分

s3乒乓球右移

s4如果乙击球,乒乓球左移;如果甲击球,犯规音响电路鸣响

s5判断乒乓球进入甲方台面后,甲是否击球; 判断乒乓球是否仍处于乙方台面及中点;否则,乙方得分

s6乒乓球左移

表2 状态转换条件

源状态目的状态转换条件

s0s1发球权归甲方:(!led_fqq)

s0s4发球权归乙方:(led_fqq)

s1s0乙方击球:(!fq_b)

s1s1等待甲方击球:(fq_b).(fq_a)

s1s2甲方击球:(!fq_a).(fq_b)

s2s0球至最右乙未击球:ppq(0)=′1′ and fq_b=′1′

s2s3 球仍在甲方台面及中点位置或进入乙方台面但乙方尚未击球:(ppq(5)=′1′ or ppq(4)=′1′ or ppq(3)=′1′ or ppq(2)=′1′ or ppq(1)=′1′) and fq_b=′1′) or ppq(12)=′1′ or ppq(11)=′1′ or ppq(10)=′1′ or ppq(9)=′1′ or ppq(8)=′1′ or ppq(7)=′1′ or ppq(6)=′1′

s2s6球移至乙方台面乙击球:(ppq(5)=′1′ or ppq(4)=′1′ or ppq(3)=′1′ or ppq(2)=′1′ or ppq(1)=′1′ or ppq(0)=′1′) and fq_b=′0′

s3s2乒乓球右移后无条件转移

s4s0甲方击球:(!fq_a)

s4s4等待乙方击球(fq_b).(fq_a)

s4s5乙方击球(!fq_b).(fq_a)

s5s0球至最左甲未击球:ppq(12)=′1′ and fq_a=′1′

s5s3球移至甲方台面甲击球:(ppq(12)=′1′ or ppq(11)=′1′ or ppq(10)=′1′ or ppq(9)=′1′ or ppq(8)=′1′ or ppq(7)=′1′) and fq_a=′0′

s5s6球仍在乙方台面及中点位置或进入甲方台面但甲方尚未击球:(ppq(11)=′1′ or ppq(10)=′1′ or ppq(9)=′1′ or ppq(8)=′1′ or ppq(7)=′1′ )and fq_a=′1′) or ppq(6)=′1′ or ppq(5)=′1′ or ppq(4)=′1′ or ppq(3)=′1′ or ppq(2)=′1′ or ppq(1)=′1′ or ppq(0)=′1′

s6s5乒乓球左移后无条件转移

图5 乒乓球位置控制电路状态转换图

library ieee;

use ieee.std_logic_1164.all;

entity position is

port(reset:in std_logic;

led_fqq,fq_a,fq_b,clk: in std_logic ;

--fq_a,fp_b选手击球信号,clk:1Hz信号

led_ppq: out std_logic_vector(12 downto 0);

--模拟乒乓球台

cnta,cntb: inout integer range 0 to 11;

--甲乙双方计分输出

speaker: out std_logic);

end position;

architecture pst_st of position is

type states is (s0,s1,s2,s3,s4,s5,s6);

signal state: states;

signal ppq: std_logic_vector(12 downto 0);

signal ca,cb:integer range 0 to 11;

begin

process(clk)

begin

if reset=′0′ then state<=s0;

elsif (clk′event and clk=′1′) then

case state is

when s0 =>

speaker<=′0′;

if cnta=11 or cntb=11 then ca<=0;cb<=0;

end if;--任一方先得11分,一局结束,计分清零

if led_fqq=′0′ then ppq<="1000000000000";

state<=s1;

end if;

if led_fqq=′1′ then ppq<="0000000000001";

state<=s4;

end if;--依据发球权数码管显示判断状态转换

when s1=>

if fq_a=′0′ then ppq<=′0′&ppq;(12 downto 1);

state<=s2;

end if;--若甲击球,乒乓球右移

if fq_b=′0′ then speaker<=′1′;

state<=s0;

end if;--若乙击球,犯规音响电路鸣响

when s2=>

if (ppq(5)=′1′ or ppq(4)=′1′ or ppq(3)=′1′ or ppq(2)=′1′ or ppq(1)=′1′ or ppq(0)=′1′) and fq_b=′0′ then state<=s6;

--若右移到乙方台面,乙方接球,进入s5状态

elsif((ppq(5)=′1′ or ppq(4)=′1′ or ppq(3)=′1′ or ppq(2)=′1′ or ppq(1)=′1′) and fq_b=′1′) or ppq(12)=′1′ or ppq(11)=′1′ or ppq(10)=′1′ or ppq(9)=′1′ or ppq(8)=′1′ or ppq(7)=′1′ or ppq(6)=′1′ then state<=s3;

--若右移还未过中点,进入s3状态

else ca<=ca+1;

state<=s0;--若右移到最右位置乙方未接球,甲方得分

end if;

when s3=>

ppq<=′0′&ppq;(12 downto 1);

state<=s2;--控制乒乓球右移

when s4=>

if fq_b=′0′ then ppq<=ppq(11downto 0)&′0′;

state<=s5;

end if;--若乙击球,乒乓球左移

if fq_a=′0′ then speaker<=′1′;

state<=s0;

end if;--若甲击球,犯规音响电路鸣响

when s5=>

if (ppq(12)=′1′ or ppq(11)=′1′ or ppq(10)=′1′ or ppq(9)=′1′ or ppq(8)=′1′ or ppq(7)=′1′) and fq_a=′0′ then state<=s3;

--若左移到对方台面,对方接球,进入s2状态

elsif ((ppq(11)=′1′ or ppq(10)=′1′ or ppq(9)=′1′ or ppq(8)=′1′ or ppq(7)=′1′ )and fq_a=′1′) or ppq(6)=′1′ or ppq(5)=′1′ or ppq(4)=′1′ or ppq(3)=′1′ or ppq(2)=′1′ or ppq(1)=′1′ or ppq(0)=′1′ then state<=s6;

--若左移还未过中点,进入s6状态

else cb<=cb+1;

state<=s0;

--若左移到最左位置甲方未接球,乙方得分

end if;

when s6=>

ppq<=ppq(11 downto 0)&′0′;

state<=s5;--控制乒乓球左移

end case;

end if;

end process;

led_ppq<=ppq;cnta<=ca;

cntb<=cb;

end pst_st;

3 顶层模块仿真测试

由于篇幅限制,本系统中的分频器、译码器等常用模块的设计就不再此赘述,最终顶层原理图设计如图6所示,仿真波形如图7所示,分析波形可知,图中开始比赛信号产生后,首次发球权方为乙方,甲方发球造成犯规音响电路鸣响,即speaker 信号为高电平,然后乙方发球,乒乓球依次移位,甲方接球成功后乙方未接球成功,甲方得分,cnta信号为“0110000”,注意,此处输出为驱动数码管输出信号,代表数字“1”。通过仿真可知,该系统设计满足游戏机比赛规则要求。

图6 基于FPGA“乒乓球比赛游戏机”顶层原理图

图7 顶层文件仿真波形

4 结 语

采用VHDL语言编程,基于FPGA成功设计了一款乒乓球比赛游戏机,通过仿真验证可知,结果满足设计需求,系统具有发球权控制、自动计分、犯规提示等多种功能,能有效模拟实际乒乓球比赛。该系统进一步改进思路为:改用人体感应传感器来采集击球信号,采用FPGA产生视频信号传送到电视机或监视器,更直观地展示乒乓球运动轨迹,从而真正实现人机互动,优化虚拟效果。

参考文献

[1]李果.基于FPGA的扩频通信芯片设计及应用[D].武汉:武汉理工大学,2008.

[2]张帆.基于FPGA的航电总线适配器设计[D].南京:南京理工大学,2006.

[3]高士峰.医疗机器人主操作手接口研究与开发[D].天津:天津大学,2005.

[4]Lattice Semiconductor Corporation.利用低成本FPGA设计下一代游戏控制台[EB/OL].http://www.eeworld.com.cn/FPGA/2009/0424/article_574.html,2009.

[5]彭介华.电子技术课程设计指导[M].北京:高等教育出版社,1997.

[6]潘松,黄继业.EDA技术与VHDL[M].北京:清华大学出版社,2007.

[7] Pedroni V A.VHDL数字电路设计教程[M].乔庐峰,译.北京:电子工业出版社,2005.

[8]Altera International Limited.Quartus II Handbook v9.0[EB/OL].http://www.altera.com.cn/literature/lit-qts.jsp,2009.

[9]周立功.EDA实验与实践[M].北京:北京航空航天大学出版社,2007.

[10] 克里兹.高级FPGA设计结构、实现和优化[M].孟宪元,译.北京:机械工业出版社,2009.

作者简介

曹莉凌 女,1982年出生,助理实验师,硕士。研究方向为EDA技术的应用。

刘雨青 女,1976年出生,讲师,博士。研究方向为自动化控制。

猜你喜欢

状态机
基于有限状态机的交会对接飞行任务规划方法
基于状态机比对的状态机推断方案
双口RAM读写正确性自动测试的有限状态机控制器设计方法
FPGA设计中状态机安全性研究
基于反熔丝FPGA的有限状态机加固设计