名称:DE0-lite乒乓球游戏乒乓球VHDL(代码在文末下载)
软件:QuartusII
语言:VHDL
代码功能:
要求:
1、?初始状态是没有灯亮。
2、?如果按下SW(9)按钮,则流水灯方向从左到右,此时如果在0号灯亮的同时按下了SW(0)按钮,则流水灯反向,变为了从右到左,此时如果在9号灯亮的同时按下了SW(9)按钮,则流水灯又反向,如果在这个过程中没有在灯亮的同时按到按钮,则该过程结束,回到了初始状态:没有灯亮。
3、?如果按下SW(0)按钮,则流水灯方向从右到左,此时如果在9号灯亮的同时按下了SW(9)按钮,则流水灯反向,变为了从左到右,此时如果在0号灯亮的同时按下了SW(0)按钮,则流水灯又反向,如果在这个过程中没有在灯亮的同时按到按钮,则该过程结束,回到了初始状态:没有灯亮。
4、?然后可以重复2、3两条需求。
本代码已在开发板验证,开发板如下,其他开发板只需修改管脚即可:
FPGA代码Verilog/VHDL代码资源下载网: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;--复位 ??????led???????????????:?OUT?STD_LOGIC_VECTOR(9?DOWNTO?0);--10个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);--定义状态 ???SIGNAL?state?:?State_Type;--?创建信号? ???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 --状态机设计 ???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--初始状态 ???????????????WHEN?s_idle?=> ??????????????????led_buf?<=?"0000000000"; ??????????????????IF?(button_posedge_1?=?'1')?THEN--1号发球 ?????????????????????state?<=?s_start_1; ??????????????????ELSIF?(button_posedge_2?=?'1')?THEN--2号发球 ?????????????????????state?<=?s_start_2; ??????????????????ELSE ?????????????????????state?<=?s_idle; ??????????????????END?IF; ???????????????WHEN?s_start_1?=>--1号发球起始位置 ??????????????????state?<=?s_run_R; ??????????????????led_buf?<=?"1000000000"; ???????????????WHEN?s_start_2?=>--2号发球起始位置 ??????????????????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--判断对方是否正确位置击球????? ????????????????????????state?<=?s_run_L;--改变方向 ?????????????????????ELSE ????????????????????????state?<=?s_win_1;--否则得分 ?????????????????????END?IF; ??????????????????ELSIF?(led_buf?=?"0000000000")?THEN--对方未在正确位置击球 ?????????????????????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--判断对方是否正确位置击球?? ????????????????????????state?<=?s_run_R;--改变方向 ?????????????????????ELSE ????????????????????????state?<=?s_win_2;--否则得分 ?????????????????????END?IF; ??????????????????ELSIF?(led_buf?=?"0000000000")?THEN--对方未在正确位置击球 ?????????????????????state?<=?s_win_2; ??????????????????ELSE ?????????????????????state?<=?s_run_L; ??????????????????END?IF; ???????????????WHEN?s_win_1?=>
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=229