• 方案介绍
  • 相关推荐
申请入驻 产业图谱

DE0-lite乒乓球游戏乒乓球VHDL代码

05/10 09:08
565
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

名称: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两条需求。

本代码已在开发板验证,开发板如下,其他开发板只需修改管脚即可:

乒乓球.png

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

相关推荐