名称: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两条需求
本代码已在开发板验证,开发板如下,其他开发板只需要修改关键即可:
代码下载:
部分代码展示
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 =>
FPGA代码Verilog/VHDL代码资源下载网:www.hdlcode.com