名稱:Quartus拔河游戲機VHDL代碼
軟件:Quartus
語言:VHDL
代碼功能:
題目五 電子拔河游戲機
電子拔河游戲機是一種能容納甲乙雙方參賽游戲電路。由一排發(fā)光二極管表示拔河的“電子繩”。由甲乙雙方通過按紐開關(guān)使發(fā)光二極管向一方的終點延伸,當(dāng)延伸到某方的最后一個發(fā)光二極管時,則該方獲勝,連續(xù)比賽多局以定勝負。
基本要求:
1、設(shè)計一個能進行拔河游戲的電路。
2、電路使用 9 個發(fā)光二極管,開機后只有中間一個發(fā)亮,此即拔河的中心點。
3、游戲雙方各持一個按鈕,迅速地、不斷地按動,產(chǎn)生脈沖,誰按得快, 亮點就向誰的方向移動,每按一次,亮點移動一次。
4、亮點移到任一方終端二極管時,這一方就獲勝,此時雙方按鈕均無作用, 輸出保持,只有復(fù)位后才使亮點恢復(fù)到中心。
5、用數(shù)碼管顯示獲勝者的盤數(shù)。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
演示視頻:
設(shè)計文檔:
1. 工程文件
2. 程序文件
頂層電路
代碼
3. 程序編譯
4. RTL圖
狀態(tài)圖
5. 仿真圖
整體仿真圖
功能:電路使用 9 個發(fā)光二極管,開機后只有中間一個發(fā)亮,此即拔河的中心點。 游戲雙方各持一個按鈕,迅速地、不斷地按動,產(chǎn)生脈沖,誰按得快, 亮點就向誰的方向移動,每按一次,亮點移動一次。 亮點移到任一方終端二極管時,這一方就獲勝,此時雙方按鈕均無作用, 輸出保持,只有復(fù)位后才使亮點恢復(fù)到中心。用數(shù)碼管顯示獲勝者的盤數(shù)。
按鍵檢測模塊
模塊功能:按鍵按下后,輸出一個脈沖信號指示按鍵按鍵
拔河控制模塊
模塊功能:控制led燈根據(jù)按鍵移動,左移或者右移,發(fā)光二極管向一方的終點延伸,
當(dāng)延伸到某方的最后一個發(fā)光二極管時,則該方獲勝,此時雙方按鈕均 無作用, 輸出保持,記錄此時的分?jǐn)?shù)
顯示模塊
模塊功能:用數(shù)碼管顯示獲勝者的盤數(shù) ,分別顯示游戲雙方的或者盤數(shù),采用掃描式的數(shù)碼管,數(shù)碼管為共陽極。
部分代碼展示:
LIBRARY?ieee; ???USE?ieee.std_logic_1164.all; ???USE?ieee.std_logic_unsigned.all; --控制模塊 ENTITY?bahe_ctrl?IS ???PORT?( ??????clk???????:?IN?STD_LOGIC;--標(biāo)準(zhǔn)時鐘 ??????reset_n????????:?IN?STD_LOGIC;--復(fù)位信號,低有效? reset_cnt????????:?IN?STD_LOGIC;--計數(shù)復(fù)位信號,低有效? ??????shift1???????:?IN?STD_LOGIC;--選手1 ??????shift2???????:?IN?STD_LOGIC;--選手2 ??????led????????????:?OUT?STD_LOGIC_VECTOR(8?DOWNTO?0);--9個led ???win1_times?????:OUT?STD_LOGIC_VECTOR(15?DOWNTO?0);--1號獲勝次數(shù) ???win2_times?????:OUT?STD_LOGIC_VECTOR(15?DOWNTO?0)--2號獲勝次數(shù) ???); END?bahe_ctrl; ARCHITECTURE?behave?OF?bahe_ctrl?IS ??? ???TYPE?State_type?IS?(s_idle,?s_start,?s_left_shift,?s_right_shift,?s_win_1,?s_win_2);??--?定義狀態(tài) ???SIGNAL?state?:?State_Type;????--?創(chuàng)建信號 ???SIGNAL?game_led??????:?STD_LOGIC_VECTOR(8?DOWNTO?0)?:=?"000010000"; SIGNAL?win1_num??????:?STD_LOGIC_VECTOR(15?DOWNTO?0)?:=?"0000000000000000"; SIGNAL?win2_num??????:?STD_LOGIC_VECTOR(15?DOWNTO?0)?:=?"0000000000000000"; BEGIN ???PROCESS?(clk) ???BEGIN ??????IF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????IF?((NOT(reset_n))?=?'1')?THEN ????????????state?<=?s_idle; ?????????ELSE ????????????CASE?state?IS ???????????????WHEN?s_idle?=>--復(fù)位狀態(tài) ?????????????????????state?<=?s_start; ???????????????WHEN?s_start?=>--游戲中 ??????????????????IF?(game_led?=?"100000000")?THEN ?????????????????????state?<=?s_win_1;--1號贏 ??????????????????ELSIF?(game_led?=?"000000001")?THEN ?????????????????????state?<=?s_win_2;--2號贏 ??????????????????ELSIF?(shift1?=?'1')?THEN ?????????????????????state?<=?s_left_shift;--led左移 ??????????????????ELSIF?(shift2?=?'1')?THEN ?????????????????????state?<=?s_right_shift;--led右移 ??????????????????ELSE ?????????????????????state?<=?s_start; ??????????????????END?IF; ???????????????WHEN?s_left_shift?=>--led左移 ??????????????????state?<=?s_start; ???????????????WHEN?s_right_shift?=>--led右移 ??????????????????state?<=?s_start; ???????????????WHEN?s_win_1?=> ??????????????????state?<=?s_win_1;--1號贏 ???????????????WHEN?s_win_2?=> ??????????????????state?<=?s_win_2;--2號贏 ???????????????WHEN?OTHERS?=> ????????????END?CASE; ?????????END?IF; ??????END?IF; ???END?PROCESS; ??? ??? ???PROCESS?(clk) ???BEGIN ??????IF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????IF?((NOT(reset_n))?=?'1')?THEN--復(fù)位 ????????????game_led?<=?"000010000"; ?????????ELSIF?(state?=?s_left_shift)?THEN ????????????game_led?<=?(game_led(7?DOWNTO?0)?&?'0');--led左移 ?????????ELSIF?(state?=?s_right_shift)?THEN ????????????game_led?<=?('0'?&?game_led(8?DOWNTO?1));--led右移 ?????????END?IF; ??????END?IF; ???END?PROCESS; ???PROCESS?(clk) ???BEGIN ??????IF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????IF?((NOT(reset_cnt))?=?'1')?THEN--復(fù)位 ????????????win1_num?<=?"0000000000000000"; ?????????ELSIF?(state?=?s_start?and?game_led?=?"100000000")?THEN----1號贏 ????????????win1_num?<=win1_num+?"0000000000000001";--加1 ?????????ELSE win1_num?<=win1_num; ?????????END?IF; ??????END?IF; ???END?PROCESS;??? ???PROCESS?(clk) ???BEGIN ??????IF?(clk'EVENT?AND?clk?=?'1')?THEN ?????????IF?((NOT(reset_cnt))?=?'1')?THEN--復(fù)位 ????????????win2_num?<=?"0000000000000000"; ?????????ELSIF?(state?=?s_start?and?game_led?=?"000000001")?THEN----2號贏 ????????????win2_num?<=win2_num+?"0000000000000001";--加1 ?????????ELSE win2_num?<=win2_num; ?????????END?IF; ??????END?IF; ???END?PROCESS; --輸出 win1_times<=win1_num; win2_times<=win2_num; ???led?<=?game_led; END?behave;
點擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=385