名稱:DE0-lite乒乓球游戲乒乓球VHDL(代碼在文末下載)
軟件:QuartusII
語言:VHDL
代碼功能:
要求:
1、?初始狀態(tài)是沒有燈亮。
2、?如果按下SW(9)按鈕,則流水燈方向從左到右,此時(shí)如果在0號(hào)燈亮的同時(shí)按下了SW(0)按鈕,則流水燈反向,變?yōu)榱藦挠业阶?,此時(shí)如果在9號(hào)燈亮的同時(shí)按下了SW(9)按鈕,則流水燈又反向,如果在這個(gè)過程中沒有在燈亮的同時(shí)按到按鈕,則該過程結(jié)束,回到了初始狀態(tài):沒有燈亮。
3、?如果按下SW(0)按鈕,則流水燈方向從右到左,此時(shí)如果在9號(hào)燈亮的同時(shí)按下了SW(9)按鈕,則流水燈反向,變?yōu)榱藦淖蟮接?,此時(shí)如果在0號(hào)燈亮的同時(shí)按下了SW(0)按鈕,則流水燈又反向,如果在這個(gè)過程中沒有在燈亮的同時(shí)按到按鈕,則該過程結(jié)束,回到了初始狀態(tài):沒有燈亮。
4、?然后可以重復(fù)2、3兩條需求。
本代碼已在開發(fā)板驗(yàn)證,開發(fā)板如下,其他開發(fā)板只需修改管腳即可:
FPGA代碼Verilog/VHDL代碼資源下載網(wǎng):www.hdlcode.com
部分代碼展示
LIBRARY?ieee; ???USE?ieee.std_logic_1164.all; ???USE?ieee.std_logic_unsigned.all; --游戲控制模塊 ENTITY?game_ctrl?IS ???PORT?( ??????clk_in????????????:?IN?STD_LOGIC; ??????reset_p???????????:?IN?STD_LOGIC;--復(fù)位 ??????led???????????????:?OUT?STD_LOGIC_VECTOR(9?DOWNTO?0);--10個(gè)led ??????button_posedge_1??:?IN?STD_LOGIC;--按鍵1 ??????button_posedge_2??:?IN?STD_LOGIC--按鍵2 ???); END?game_ctrl; ARCHITECTURE?behave?OF?game_ctrl?IS ???TYPE?State_type?IS?(s_idle,s_start_1,s_start_2,s_run_L,s_run_R,s_win_1,s_win_2,s_end);--定義狀態(tài) ???SIGNAL?state?:?State_Type;--?創(chuàng)建信號(hào)? ???SIGNAL?led_buf?????:?STD_LOGIC_VECTOR(9?DOWNTO?0)?:=?"0000000000"; ???SIGNAL?shift_en????:?STD_LOGIC?:=?'0'; ???SIGNAL?time_cnt????:?STD_LOGIC_VECTOR(31?DOWNTO?0)?:=?"00000101111101011110000100000000"; BEGIN --狀態(tài)機(jī)設(shè)計(jì) ???PROCESS?(clk_in) ???BEGIN ??????IF?(clk_in'EVENT?AND?clk_in?=?'1')?THEN ?????????IF?(reset_p?=?'1')?THEN ????????????state?<=?s_idle; ?????????ELSE ????????????CASE?state?IS--初始狀態(tài) ???????????????WHEN?s_idle?=> ??????????????????led_buf?<=?"0000000000"; ??????????????????IF?(button_posedge_1?=?'1')?THEN--1號(hào)發(fā)球 ?????????????????????state?<=?s_start_1; ??????????????????ELSIF?(button_posedge_2?=?'1')?THEN--2號(hào)發(fā)球 ?????????????????????state?<=?s_start_2; ??????????????????ELSE ?????????????????????state?<=?s_idle; ??????????????????END?IF; ???????????????WHEN?s_start_1?=>--1號(hào)發(fā)球起始位置 ??????????????????state?<=?s_run_R; ??????????????????led_buf?<=?"1000000000"; ???????????????WHEN?s_start_2?=>--2號(hào)發(fā)球起始位置 ??????????????????state?<=?s_run_L; ??????????????????led_buf?<=?"0000000001"; ???????????????WHEN?s_run_R?=>--球右移 ??????????????????IF?(shift_en?=?'1')?THEN ?????????????????????led_buf?<='0'?&?led_buf(9?downto?1);--球右移 ??????????????????ELSE ?????????????????????led_buf?<=?led_buf; ??????????????????END?IF; ??????????????????IF?(button_posedge_2?=?'1')?THEN ?????????????????????IF?(led_buf?=?"0000000001")?THEN--判斷對(duì)方是否正確位置擊球????? ????????????????????????state?<=?s_run_L;--改變方向 ?????????????????????ELSE ????????????????????????state?<=?s_win_1;--否則得分 ?????????????????????END?IF; ??????????????????ELSIF?(led_buf?=?"0000000000")?THEN--對(duì)方未在正確位置擊球 ?????????????????????state?<=?s_win_1; ??????????????????ELSE ?????????????????????state?<=?s_run_R; ??????????????????END?IF; ???????????????WHEN?s_run_L?=>--球左移 ??????????????????IF?(shift_en?=?'1')?THEN ?????????????????????led_buf?<=?led_buf(8?downto?0)?&?'0';--球左移 ??????????????????ELSE ?????????????????????led_buf?<=?led_buf; ??????????????????END?IF; ??????????????????IF?(button_posedge_1?=?'1')?THEN ?????????????????????IF?(led_buf?=?"1000000000")?THEN--判斷對(duì)方是否正確位置擊球?? ????????????????????????state?<=?s_run_R;--改變方向 ?????????????????????ELSE ????????????????????????state?<=?s_win_2;--否則得分 ?????????????????????END?IF; ??????????????????ELSIF?(led_buf?=?"0000000000")?THEN--對(duì)方未在正確位置擊球 ?????????????????????state?<=?s_win_2; ??????????????????ELSE ?????????????????????state?<=?s_run_L; ??????????????????END?IF; ???????????????WHEN?s_win_1?=>
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=229