【文章內(nèi)容簡介】
引 腳 作 用 CLK 10Hz 的時鐘,可由系統(tǒng)時鐘分頻得到。此時時鐘決定了球移動的速度, 可根據(jù)實際需要調(diào)整。 RESET 復位鍵,比賽重新開始,記分器清 0 STARTA、 STARTB A 和 B 雙方的開始的開球鍵 HITA、 HITB A 和 B 雙方的擊球鍵 (可以將其與開球鍵合并 ) CLEAR 將記分器清 0(給記分器的控制信號 ) INCREASEA 、 INCREASEB 分別為 A、 B 雙方的加分信號 (給記分器的控制信號 ) SCOREAL[3..0]SCOREAH[3..0] SCOREBL[3..0]SCOREBH[3..0] SCOREA、 SCOREB A、 B 雙方的分數(shù) (由記分器給出 ) LIGHT[4..0] 接 5 個發(fā)光二極管 AWIN、 BWIN 分別接發(fā)光二極管,表示 A 或 B 方勝出 狀態(tài)機的程序如下: LIBRARY IEEE。 USE 。 USE 。 ENTITY STATEMACHINE IS PORT (CLK: IN STD_LOGIC。 RESET: IN STD_LOGIC。 STARTA, HITA, STARTB, HITB: IN STD_LOGIC。 SCOREA, SCOREB: IN INTEGER RANGE 0 TO 21。 CLEAR, INCREASEA, INCREASEB: OUT STD_LOGIC。 TABLELIGHT: OUT STD_LOGIC_VECTOR (0 TO 4)。 AWIN, BWIN: OUT STD_LOGIC)。 END。 ARCHITECTURE BEHAVIOR OF STATEMACHINE IS TYPE STATE_TYPE IS (WAITSTATE, ATOB, BTOA, ASCORE, BSCORE, FINALRESULT)。 14 SIGNAL STATE: STATE_TYPE。 SIGNAL TABLESTATE: INTEGER RANGE 0 TO 4。 BEGIN PROCESS (CLK, RESET) BEGIN IF RESET=39。139。 THEN 按下復位鍵,比賽開始 STATE=WAITSTATE。 進入等待狀態(tài) CLEAR=39。139。 記分器清零 AWIN=39。039。 BWIN=39。039。 ELSIF RISING_EDGE (CLK) THEN CASE STATE IS WHEN WAITSTATE= CLEAR=39。039。 INCREASEA=39。039。 INCREASEB=39。039。 IF((SCOREA =21 ) OR ( SCOREB=21) )THEN如果一方先得到 21 分 STATE=FINALRESULT。 比賽結束 ELSE IF STARTA=39。139。THEN 如果 A 開球 STATE=ATOB。 球從 A 向 B 方移動 TABLESTATE=0。 A 方第一個燈點亮 ELSE IF STARTB=39。139。THEN 如果 B 開球 (A、 B 開球有 定的優(yōu)先級區(qū)別 STATE=BTOA。 球從 B 向 A 方移動 TABLESTATE=4。 B 方第一個燈亮 ELSE STATE=WAITSTATE。 END IF。 END IF。 15 END IF。 WHEN ATOB= 球從 A 向 B 移動的過程 IF HITB=39。139。THEN 如果檢測到 B 方擊球 IF TABLESTATE=2 THEN 若未過網(wǎng)提前擊球 STATE=ASCORE。 判為 A 勝 ELSE STATE=BTOA。 若過了網(wǎng)擊球,球從 B 向 A 移動 END IF。 ELSE 若未檢測到 B 方擊球 IF TABLESTATE=4 THEN 如果離 B 方最近的燈 已經(jīng)亮 STATE=ASCORE。 判為 A 勝 ELSE TABLESTATE=TABLESTATE+1。 否則球繼續(xù)移動 END IF。 END IF。 WHEN BTOA= 球從 B 向 A 移動的過程 IF HITA=39。139。THEN 如果檢測 A 方擊球 IF TABLESTATE=2 THEN 若未過網(wǎng)提前擊球 STATE=BSCORE。 判為 B 勝 ELSE 若過了網(wǎng)擊球,球從 A STATE=ATOB。 向 B 移動 END IF。 ELSE 若未檢測到 A 擊球 IF TABLESTATE=0 THEN 如果離 A 最近的燈亮了 STATE=BSCORE。 判為 B 勝 ELSE TABLESTATE=TABLESTATE1。 否則球繼續(xù)移動 END IF。 END IF。 16 WHEN ASCORE= 如果 A 勝 INCREASEA=39。139。 A 方加 1分 STATE=WAITSTATE。 回到等待開球狀態(tài) WHEN BSCORE= 如果 B 勝 INCREASEB=39。139。 B 方加 1分 STATE=WAITSTATE。 回到等待開球狀態(tài) WHEN FINALRESULT= 最后結果 IF(SCOREA=21) THEN 若 A 方先達到 21分 AWIN=39。139。 表示 A 方勝出的燈亮 ELSE BWIN=39。139。 否則,表示 B 方勝出的燈亮 END IF。 WHEN OTHERS= STATE=WAITSTATE。 END CASE。 END IF。 END PROCESS。 PROCESS(CLK) 此進程控制 5個發(fā)光二極管的亮滅 BEGIN IF FALLING_EDGE (CLK) THEN IF ((STATE=ATOB) OR (STATE=BTOA)) THEN CASE TABLESTATE IS WHEN 0=TABLELIGHT=10000。 WHEN 1=TABLELIGHT=01000。 WHEN 2=TABLELIGHT=00100。 WHEN 3=TABLELIGHT=00010。 WHEN 4=TABLELIGHT=00001。 WHEN OTHERS=TABLELIGHT=00000。 END CASE。 ELSE TABLELIGHT=00000。 17 END IF。 END IF。 END PROCESS。 END。 記分器設計 圖 8 記分器元件符號 記分器元件符號如圖 8 所示,本設計中記分器比較簡單,只須根據(jù)狀態(tài)機給出的兩個信號 ( INCREASEA和 INCREASEB) 對六個分數(shù)( SCOREAL、 SCOREAH 和 SCOREBL、SCOREBH、 SCOREA、 SCOREB)進行操作,記分器的程序如下: LIBRARY IEEE。 USE 。 USE 。 ENTITY COUNTER IS PORT (CLK: IN STD_LOGIC。 CLEAR: IN STD_LOGIC。 INCREASEA, INCREASEB: IN STD_LOGIC。 SCOREAL, SCOREAH, SCOREBL, SCOREBH: BUFFER STD_LOGIC_VECTOR (3 DOWNTO 0) SCOREA, SCOREB:BUFFER INTRGER RANGE 0 TO 21)。 END。 ARCHITECTURE COUNT OF COUNTER IS BEGIN 18 PROCESS (CLK, CLEAR) IS BEGIN IF CLEAR=39。139。 THEN 清 0 SCOREAL=0000。 SCOREAH=0000。 SCOREBL=0000。 SCOREBH=0000。 SCORES=0。 SCOREB=0。 ELSIF FALLING_EDGE (CLK) THEN IF INCREASEA=39。139。 THEN A 方加 1分 IF SCOREAH0010 THEN 若高位小于 2 IF SCOREAL1001 THEN 如果低位小于 9 SCOREAL=SCOREAL+1。 則低位加 1 ELSE SCOREAL=0000。 當?shù)臀粸?9,則清 0 SCOREAH=SCOREAH+1。 高位加 1 END IF。 ELSIF SCOREAH= 0010 THEN 若高位為 2 IF SCOREAL0001 THEN 如果低位小于 1 SCOREAL=SCOREAL+1。 則低位加 1 ELSE SCOREAL=0000。 否則高位 、 低位都清 0 SCOREAH=0000。 END IF。 END IF。 SCOREA=SCOREA+1。 ELSIF INCREASEB=39。139。 THEN IF SCOREBH2 THEN 若高位小于 2 IF SCOREBL1001 THEN 如果低位小于 9 SCOREBL=SCOREB