【文章內(nèi)容簡介】
Clk10Hz的時鐘,可由系統(tǒng)時鐘分頻得到。此時時鐘決定了球移動的速度, 可根據(jù)實際需要調(diào)整。Reset復(fù)位鍵,比賽重新開始,記分器清0Sever[1..0]發(fā)球信號Hithit2甲和乙雙方的擊球鍵(可以將其與開球鍵合并)StartStart控制游戲是否開始Tmp、tmgtmp,tmg為輸入輸出類型,作為分頻后的信號,供給數(shù)碼管掃描和發(fā)光二極管點亮使用Score11[6..0]score12[6..0]Score21[6..0]score22[6..0]甲、乙雙方的分數(shù)(由記分器給出)Light[6..0]接7個發(fā)光二極管甲發(fā)球? 乙發(fā)球?靠近甲的L1燈亮靠近乙的L7燈亮球向乙移動球向甲移動乙擊球? 球移動到L7?球移動到L1?等待發(fā)球甲擊球?乙得分甲得分YesYesNoYesYesNoNoNo圖7 乒乓游戲機狀態(tài)轉(zhuǎn)移圖狀態(tài)機的主要部分源程序如下:p3:process(tmp) 狀態(tài)機部分 begin case state is when waitserve = 等待狀態(tài)下 進程處于等待發(fā)球狀態(tài) case serve is when 00 = i=0。 when 10 = i=1。state=light1on。 when 01 = i=7。state=light7on。 when 11 = i=0。 when others = i=0。 end case。 when light1on = i=2。 light1on狀態(tài)下 進程處于第一盞燈亮狀態(tài) if hit2=39。139。 then i=0。 count1=count1+1。state=waitserve。 else state=ballmoveto2。end if。 when light7on = i=6。 light7on狀態(tài)下 進程處于第八盞燈亮狀態(tài) if hit1=39。139。 then i=0。 count2=count2+1。state=waitserve。 else state=ballmoveto1。 end if。 when ballmoveto1 = 進程處于球向2移動狀態(tài) if hit1=39。139。 then i=0。 count2=count2+1。state=waitserve。 elsif i=2 then i=1。 state=allow1hit。 else i=i1。 end if。 when ballmoveto2 = 進程處于球向1移動狀態(tài) if hit2=39。139。 then i=0。 count1=count1+1。state=waitserve。 elsif i=6 then i=7。 state=allow2hit。 else i=i+1。 end if。 when allow1hit = 進程處于允許1擊球狀態(tài) if hit1=39。139。 then i=2。 state=ballmoveto2。 else count2=count2+1。i=0。 state=waitserve。 end if。 when allow2hit = 進程處于允許2擊球狀態(tài) if hit2=39。139。 then i=6。state=ballmoveto1。 else count1=count1+1。i=0。 state=waitserve。 end if。 end case。 end if。 end if。end process。 end one。數(shù)碼管的動態(tài)掃描顯示就是指我們采用分時的方法,輪流控制各個顯示器的公共端,使各個顯示器輪流點亮。 在輪流點亮掃描過程中,每位顯示器的點亮?xí)r間是極為短暫的,但由于人的視覺暫留現(xiàn)象及發(fā)光二極管的余輝效應(yīng),盡管實際上各位顯示器并非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩(wěn)定的顯示數(shù)據(jù),不會有閃爍感[7]。如圖8數(shù)碼管顯示電路圖,圖中1K電阻起限流作用,保護發(fā)光二極管。圖8 數(shù)碼管顯示圖、乒乓球路徑顯示電路設(shè)計乒乓球游戲機用按鍵控制擊、發(fā)球以及開始游戲鍵,當甲(開關(guān)3)發(fā)球,LED燈由左向右依次點亮(DD6常亮);到D9時,乙(開關(guān)6)擊球,LED燈向甲移動。同理,當乙發(fā)球,點甲(開關(guān)5)擊球。如圖9按鍵控制LED燈。其按鍵閉合與釋放瞬間,輸入的信號會有毛刺。如果不進行消抖處理,系統(tǒng)會將這些毛刺誤以為是用戶的另一次輸入,導(dǎo)致系統(tǒng)的誤操作。防抖電路有很多種,最簡單、最容易理解的就是計數(shù)法。其原理是對鍵值進行計數(shù),當某一鍵值保持一段時間不改變時(計數(shù)器達到一定值后),才確認它為有效值;否則將其判為無效鍵值,重新對鍵值進行計算[8]。圖9 按鍵控制LED燈基于計數(shù)法的防抖電路部分源程序: p1:process(pre,nex,din) 按鍵去抖狀態(tài)機 begin case pre is when s0=dout=39。139。 if din=39。139。 then nex=s0。 else nex=s1。 end if。 when s1=dout=39。139。 if din=39。139。 then nex=s0。 else nex=s2。 end if。 when s2=dout=39。139。 if din=39。139。 then nex=s0。 else nex=s3。 end if。 when s3=dout=39。039。 if din=39。139。 then nex=s0。 else nex=s3。 end if。 end case。 end process。 end one。 設(shè)計該乒乓球游戲機的輸入/輸出端口。首先考慮輸入端口,一般都應(yīng)該設(shè)置一個異步置位端口reset,用于在系統(tǒng)不正常時回到初始狀態(tài);兩個發(fā)球輸入端serve0和serve1,邏輯‘1’分別表示甲方和乙方的發(fā)球;兩個擊球輸入端hit1和hit2,邏輯‘1’分別表示甲擊球和乙擊球;一個開始游戲按鈕start,處于邏輯‘1’表示可以游戲;還得有一個時鐘輸入端口clk。實體部分源程序如下: entity game is 實體部分 port(reset: in std_logic。 reset是記分牌清零信號 clk: in std_logic。 start: in std_logic。 Start控制游戲是否開始 serve: in std_logic_vector(0 to 1)。 發(fā)球信號 hit1,hit2: in std_logic。 擊球鍵 light: out std_logic_vector(0 to 6)。 發(fā)光二極管的輸出信號 tmp: buffer std_logic。 tmp,tmg為輸入輸出類型,作為分頻后的信號,供給 數(shù)碼管掃描和發(fā)光二極管點亮使用 tmg: buffer std_logic。 score11,score12,score21,score22: out std_logic_vector(0 to 6))。end game。元件例化部分源程序如下:u0: myd port map(count1,score11,score12)。u1: myd port map(count2,score21,score22)。u2: qdd port map(clk,start,ht,dt)。 本章小結(jié) 本章主要介紹了基于FPGA的乒乓球游戲機設(shè)計的模塊及實現(xiàn)功能,其中包括時鐘分頻設(shè)計、狀態(tài)機/球臺控制器、記分牌譯碼顯示器、按鍵去抖和乒乓球路徑顯示電路、頂層實體描述的介紹。全面的簡述了系統(tǒng)的軟硬件結(jié)合,以及通過軟硬件結(jié)合時序了設(shè)計的功能。4系統(tǒng)的調(diào)試、仿真、下載、測試 調(diào)試FPGA在調(diào)試FPGA電路時要遵循一定的原則和技巧,才能減少調(diào)試時間,避免誤操作損壞電路。一般情況下,可以參考以下步驟進行FPGA硬件系統(tǒng)的調(diào)試[9]。 (1)首先在焊接硬件電路時,只焊接電源部分。使用萬用表進行測試,排除電源短路等情況后,上電測量電壓是否正確。 (2)然后連接好FPGA及相關(guān)的下載電路。再次測量電源地之間是否有短路現(xiàn)象,上電測試電壓是否正確,然后將手排除靜電后觸摸FPGA有無發(fā)燙現(xiàn)象。 (3)以上步驟均通過后,將電路板上電運行。然后把下載電纜接到JTAG接口上,在主機中運行Quartus II軟件,并打開Programmer編程器,單擊其中的“Auto Detect”按鈕進行FPGA下載鏈路自動檢測。若能正確檢測到FPGA,說明配置電路是正確連接的。(4)檢查時鐘電路、復(fù)位電路及數(shù)碼管電路,向FPGA下載一個數(shù)碼管跑馬燈程序。若程序能夠正確運行,說明FPGA已經(jīng)可以正常工作了。仿真:用modelsim等等仿真工具做仿真驗證功能、時序的正確性。硬件在線調(diào)試:一般采用JTAG電路協(xié)議結(jié)構(gòu),進行在線調(diào)試。、仿真,模塊LIGHT是狀態(tài)機/球臺控制,當復(fù)位鍵為低電平時,當甲方或乙方開始發(fā)球,模塊light的發(fā)光二極管L0、LLL3(LL5)LLL8在下降沿來臨時正向或反向依次點亮,當有方得分時,加分情況將通過四個數(shù)碼管來顯示,并將其反饋回狀態(tài)機模塊,當有一方先達到11時,其游戲結(jié)束。在按鍵與FPGA相連的引腳需要設(shè)置下拉電阻(300~1000Ω即可)以便在沒有按鍵按下時將輸入也穩(wěn)