曹莉凌 劉雨青
摘 要:FPGA的低成本正推動(dòng)其在消費(fèi)電子產(chǎn)品中的應(yīng)用,為進(jìn)一步挖掘其在娛樂產(chǎn)品應(yīng)用中的巨大商機(jī),基于Altera公司FPGA,在Quartus Ⅱ8.1環(huán)境下,運(yùn)用VHDL語言、采用有限狀態(tài)機(jī)等設(shè)計(jì)方法設(shè)計(jì)了一款乒乓球比賽游戲機(jī)。介紹了該游戲機(jī)系統(tǒng)功能模塊劃分及關(guān)鍵模塊具體設(shè)計(jì)方案,給出設(shè)計(jì)和調(diào)試中遇到的問題及解決途徑,并進(jìn)行了仿真測試。仿真結(jié)果表明,該乒乓球游戲機(jī)工作正常,具有發(fā)球權(quán)控制、自動(dòng)計(jì)分、犯規(guī)提示等多種功能,能有效模擬實(shí)際乒乓球比賽。
關(guān)鍵詞:乒乓球比賽游戲機(jī);FPGA;VHDL;狀態(tài)機(jī)
中圖分類號(hào):TN40 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):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以其開發(fā)周期短、成本低、功耗低、可靠性高等優(yōu)勢,廣泛應(yīng)用于通信、航空、醫(yī)療等領(lǐng)域[1-3],近年來在消費(fèi)電子領(lǐng)域[4]中的應(yīng)用也日漸增加。為進(jìn)一步挖掘FPGA在家庭娛樂如游戲機(jī)開發(fā)與應(yīng)用中的巨大商機(jī),介紹了一款以Altera公司FPGA芯片為控制核心,附加少量外圍電路組成的乒乓球比賽游戲機(jī)[5]。整個(gè)系統(tǒng)設(shè)計(jì)模塊劃分清晰:包括裁判端、選手端、控制端、顯示端及模擬乒乓球臺(tái);功能齊全:包括發(fā)球權(quán)控制、犯規(guī)提示、局?jǐn)?shù)比分顯示等,模擬實(shí)際乒乓球比賽相似程度高。采用了VHDL[6,7]語言編程實(shí)現(xiàn),在Quartus Ⅱ8.1[8,9]集成環(huán)境下進(jìn)行了模擬仿真,結(jié)果表明在設(shè)定的比賽規(guī)則下,游戲機(jī)運(yùn)行正常,通過進(jìn)一步優(yōu)化可將其商品化,推入市場。
1 系統(tǒng)組成
乒乓球比賽游戲機(jī)的組成如圖1所示。比賽規(guī)則約定:五局三勝;11分一局;裁判發(fā)出比賽開始信號(hào),觸發(fā)FPGA內(nèi)部隨機(jī)數(shù)發(fā)生器模塊產(chǎn)生首次發(fā)球權(quán)方;比賽進(jìn)行中,選手連續(xù)兩次獲得發(fā)球權(quán)后,發(fā)球權(quán)交予對方,如未獲發(fā)球權(quán)方發(fā)球,裁判端犯規(guī)音響電路鳴響;13個(gè)LED排列成行模擬乒乓球臺(tái);點(diǎn)亮的LED模擬乒乓球,受FPGA控制從左到右或從右到左移動(dòng);比賽選手通過按鈕輸入模擬擊球信號(hào),實(shí)現(xiàn)LED移位方向的控制;若發(fā)亮的LED運(yùn)動(dòng)在球臺(tái)中點(diǎn)至對方終點(diǎn)之間時(shí),對方未能及時(shí)按下?lián)羟虬粹o使其向相反方向移動(dòng),即失去一分。
圖1 基于FPGA乒乓球比賽游戲機(jī)組成框圖
2 功能模塊設(shè)計(jì)
圖1中,基于FPGA設(shè)計(jì)的控制端為整個(gè)系統(tǒng)的核心,其內(nèi)部主要由簡易隨機(jī)數(shù)發(fā)生器、發(fā)球權(quán)控制器、乒乓球位置控制器、甲乙方計(jì)分控制器、犯規(guī)音響控制器等模塊組成。整個(gè)控制端采用模塊化設(shè)計(jì),先用VHDL語言編寫功能模塊,然后用頂層原理圖將各功能模塊連接起來。設(shè)計(jì)的難點(diǎn)在于協(xié)調(diào)各模塊工作,嚴(yán)格遵守各信號(hào)間時(shí)序關(guān)系。本系統(tǒng)采用1 kHz系統(tǒng)時(shí)鐘。
2.1 簡易隨機(jī)數(shù)發(fā)生器
比賽首次發(fā)球權(quán)由隨機(jī)數(shù)發(fā)生器產(chǎn)生的數(shù)據(jù)決定,其隨機(jī)性要求不嚴(yán),因此,采用非常簡單的模式產(chǎn)生,即一旦FPGA上電,系統(tǒng)時(shí)鐘百分頻產(chǎn)生一方波信號(hào)square,當(dāng)裁判閉合開始比賽開關(guān)產(chǎn)生start信號(hào)上升沿時(shí),讀取此時(shí)square信號(hào)值作為隨機(jī)數(shù)發(fā)生器輸出randq。模塊仿真如圖2所示,結(jié)果滿足設(shè)計(jì)要求。此模塊設(shè)計(jì)時(shí)保證了square信號(hào)周期應(yīng)遠(yuǎn)大于start信號(hào)上升沿建立時(shí)間,保證隨機(jī)數(shù)據(jù)的正確讀取。
圖2 簡易隨機(jī)數(shù)發(fā)生器模塊仿真
2.2 發(fā)球權(quán)控制器
發(fā)球權(quán)控制器的控制過程為:如果按下復(fù)位按鈕,發(fā)球權(quán)數(shù)碼管顯示8,否則,開始比賽開關(guān)閉合時(shí),顯示隨機(jī)數(shù)發(fā)生器的值(0或1,0代表甲方、1代表乙方)。而在比賽中,為遵守發(fā)球權(quán)交換規(guī)則,設(shè)計(jì)甲乙雙方計(jì)分器總和信號(hào)sum_sc是不為0的偶數(shù)時(shí)(即計(jì)分總和最低位sum_sc0下降沿到來時(shí)),發(fā)球權(quán)數(shù)碼管顯示由0變?yōu)?或由1變?yōu)?。
此模塊設(shè)計(jì)中,發(fā)球權(quán)數(shù)碼管的信號(hào)控制受多個(gè)時(shí)鐘的控制,即開始比賽開關(guān)start和計(jì)分值sum_sc0信號(hào),這在VHDL編程語言中無法用一個(gè)進(jìn)程實(shí)現(xiàn),必須將兩個(gè)信號(hào)組合成一個(gè)時(shí)鐘信號(hào),并統(tǒng)一兩個(gè)時(shí)鐘的觸發(fā)沿。因此最佳時(shí)鐘觸發(fā)方式如圖3所示的fqq_en信號(hào)。為滿足這種時(shí)序要求,借助計(jì)分總和次低位sum_sc1信號(hào)設(shè)計(jì)entity sum_sc_mod2,由于start和sum_sc1的頻率都遠(yuǎn)低于系統(tǒng)時(shí)鐘信號(hào)clk頻率,則可借助clk 高頻信號(hào)捕捉其邊沿產(chǎn)生新的時(shí)鐘信號(hào)fqq_en,并產(chǎn)生其計(jì)數(shù)值,仿真波形如圖4(a)所示。為保證發(fā)球權(quán)數(shù)碼管顯示正確,設(shè)計(jì) entity led_fqq_ctl在fqq_en下降沿時(shí),根據(jù)其計(jì)數(shù)值產(chǎn)生相應(yīng)的數(shù)碼管輸出信號(hào)led_fqq,仿真波形如圖4(b)所示。
發(fā)球權(quán)控制器的VHDL核心程序如下:
entity sum_sc_mod2:
process(clk)
begin
if clk′event and clk=′1′ then--系統(tǒng)時(shí)鐘
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";--復(fù)位按鈕按下,發(fā)球權(quán)數(shù)碼管顯示8
elsif fqq_en′event and fqq_en=′0′ then
if cnt=1 then led<="000"&rand;
else led<="000"? led(0);
--fqq_en第一個(gè)下降沿顯示隨機(jī)數(shù)的值,其他下降沿交換發(fā)球權(quán)
end if;
end if;
end process;
圖3 發(fā)球權(quán)顯示控制器控制時(shí)鐘
圖4 發(fā)球權(quán)控制器模塊仿真
2.3 乒乓球位置控制、甲乙計(jì)分、犯規(guī)音響控制
乒乓球位置控制電路為FPGA控制端的核心,依據(jù)比賽規(guī)則,采用了Mealy型狀態(tài)機(jī)[10]來實(shí)現(xiàn),大大降低了設(shè)計(jì)難度。狀態(tài)機(jī)共定義了7個(gè)狀態(tài),各狀態(tài)定義如表1所示,狀態(tài)轉(zhuǎn)換如圖5所示,轉(zhuǎn)換條件如表2所示,具體程序如下。
表1 Mealy型狀態(tài)機(jī)狀態(tài)定義
狀態(tài)定義
s0發(fā)球權(quán)為0時(shí),乒乓球位置為最左端;發(fā)球權(quán)為1時(shí),乒乓球位置為最右端
s1如果甲擊球,乒乓球右移;如果乙擊球,犯規(guī)音響電路鳴響
s2判斷乒乓球進(jìn)入乙方臺(tái)面后,乙是否擊球; 判斷乒乓球是否仍處于甲方臺(tái)面及中點(diǎn);否則,甲方得分
s3乒乓球右移
s4如果乙擊球,乒乓球左移;如果甲擊球,犯規(guī)音響電路鳴響
s5判斷乒乓球進(jìn)入甲方臺(tái)面后,甲是否擊球; 判斷乒乓球是否仍處于乙方臺(tái)面及中點(diǎn);否則,乙方得分
s6乒乓球左移
表2 狀態(tài)轉(zhuǎn)換條件
源狀態(tài)目的狀態(tài)轉(zhuǎn)換條件
s0s1發(fā)球權(quán)歸甲方:(!led_fqq)
s0s4發(fā)球權(quán)歸乙方:(led_fqq)
s1s0乙方擊球:(!fq_b)
s1s1等待甲方擊球:(fq_b).(fq_a)
s1s2甲方擊球:(!fq_a).(fq_b)
s2s0球至最右乙未擊球:ppq(0)=′1′ and fq_b=′1′
s2s3 球仍在甲方臺(tái)面及中點(diǎn)位置或進(jìn)入乙方臺(tái)面但乙方尚未擊球:(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球移至乙方臺(tái)面乙擊球:(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乒乓球右移后無條件轉(zhuǎn)移
s4s0甲方擊球:(!fq_a)
s4s4等待乙方擊球(fq_b).(fq_a)
s4s5乙方擊球(!fq_b).(fq_a)
s5s0球至最左甲未擊球:ppq(12)=′1′ and fq_a=′1′
s5s3球移至甲方臺(tái)面甲擊球:(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球仍在乙方臺(tái)面及中點(diǎn)位置或進(jìn)入甲方臺(tái)面但甲方尚未擊球:(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乒乓球左移后無條件轉(zhuǎn)移
圖5 乒乓球位置控制電路狀態(tài)轉(zhuǎn)換圖
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選手擊球信號(hào),clk:1Hz信號(hào)
led_ppq: out std_logic_vector(12 downto 0);
--模擬乒乓球臺(tái)
cnta,cntb: inout integer range 0 to 11;
--甲乙雙方計(jì)分輸出
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分,一局結(jié)束,計(jì)分清零
if led_fqq=′0′ then ppq<="1000000000000";
state<=s1;
end if;
if led_fqq=′1′ then ppq<="0000000000001";
state<=s4;
end if;--依據(jù)發(fā)球權(quán)數(shù)碼管顯示判斷狀態(tài)轉(zhuǎn)換
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;--若乙擊球,犯規(guī)音響電路鳴響
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;
--若右移到乙方臺(tái)面,乙方接球,進(jìn)入s5狀態(tài)
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;
--若右移還未過中點(diǎn),進(jìn)入s3狀態(tài)
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;--若甲擊球,犯規(guī)音響電路鳴響
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;
--若左移到對方臺(tái)面,對方接球,進(jìn)入s2狀態(tài)
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;
--若左移還未過中點(diǎn),進(jìn)入s6狀態(tài)
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 頂層模塊仿真測試
由于篇幅限制,本系統(tǒng)中的分頻器、譯碼器等常用模塊的設(shè)計(jì)就不再此贅述,最終頂層原理圖設(shè)計(jì)如圖6所示,仿真波形如圖7所示,分析波形可知,圖中開始比賽信號(hào)產(chǎn)生后,首次發(fā)球權(quán)方為乙方,甲方發(fā)球造成犯規(guī)音響電路鳴響,即speaker 信號(hào)為高電平,然后乙方發(fā)球,乒乓球依次移位,甲方接球成功后乙方未接球成功,甲方得分,cnta信號(hào)為“0110000”,注意,此處輸出為驅(qū)動(dòng)數(shù)碼管輸出信號(hào),代表數(shù)字“1”。通過仿真可知,該系統(tǒng)設(shè)計(jì)滿足游戲機(jī)比賽規(guī)則要求。
圖6 基于FPGA“乒乓球比賽游戲機(jī)”頂層原理圖
圖7 頂層文件仿真波形
4 結(jié) 語
采用VHDL語言編程,基于FPGA成功設(shè)計(jì)了一款乒乓球比賽游戲機(jī),通過仿真驗(yàn)證可知,結(jié)果滿足設(shè)計(jì)需求,系統(tǒng)具有發(fā)球權(quán)控制、自動(dòng)計(jì)分、犯規(guī)提示等多種功能,能有效模擬實(shí)際乒乓球比賽。該系統(tǒng)進(jìn)一步改進(jìn)思路為:改用人體感應(yīng)傳感器來采集擊球信號(hào),采用FPGA產(chǎn)生視頻信號(hào)傳送到電視機(jī)或監(jiān)視器,更直觀地展示乒乓球運(yùn)動(dòng)軌跡,從而真正實(shí)現(xiàn)人機(jī)互動(dòng),優(yōu)化虛擬效果。
參考文獻(xiàn)
[1]李果.基于FPGA的擴(kuò)頻通信芯片設(shè)計(jì)及應(yīng)用[D].武漢:武漢理工大學(xué),2008.
[2]張帆.基于FPGA的航電總線適配器設(shè)計(jì)[D].南京:南京理工大學(xué),2006.
[3]高士峰.醫(yī)療機(jī)器人主操作手接口研究與開發(fā)[D].天津:天津大學(xué),2005.
[4]Lattice Semiconductor Corporation.利用低成本FPGA設(shè)計(jì)下一代游戲控制臺(tái)[EB/OL].http://www.eeworld.com.cn/FPGA/2009/0424/article_574.html,2009.
[5]彭介華.電子技術(shù)課程設(shè)計(jì)指導(dǎo)[M].北京:高等教育出版社,1997.
[6]潘松,黃繼業(yè).EDA技術(shù)與VHDL[M].北京:清華大學(xué)出版社,2007.
[7] Pedroni V A.VHDL數(shù)字電路設(shè)計(jì)教程[M].喬廬峰,譯.北京:電子工業(yè)出版社,2005.
[8]Altera International Limited.Quartus II Handbook v9.0[EB/OL].http://www.altera.com.cn/literature/lit-qts.jsp,2009.
[9]周立功.EDA實(shí)驗(yàn)與實(shí)踐[M].北京:北京航空航天大學(xué)出版社,2007.
[10] 克里茲.高級(jí)FPGA設(shè)計(jì)結(jié)構(gòu)、實(shí)現(xiàn)和優(yōu)化[M].孟憲元,譯.北京:機(jī)械工業(yè)出版社,2009.
作者簡介
曹莉凌 女,1982年出生,助理實(shí)驗(yàn)師,碩士。研究方向?yàn)镋DA技術(shù)的應(yīng)用。
劉雨青 女,1976年出生,講師,博士。研究方向?yàn)樽詣?dòng)化控制。