Quartus拔河游戏机VHDL代码仿真
名称:Quartus拔河游戏机VHDL代码仿真
软件:Quartus
语言:VHDL
代码功能:
题目五 电子拔河游戏机
电子拔河游戏机是一种能容纳甲乙双方参赛游戏电路。由一排发光二极管表
示拔河的“电子绳”。由甲乙双方通过按纽开关使发光二极管向一方的终点延伸,
当延伸到某方的最后一个发光二极管时,则该方获胜,连续比赛多局以定胜负。
基本要求:
1、设计一个能进行拔河游戏的电路。
2、电路使用 9 个发光二极管,开机后只有中间一个发亮,此即拔河
的中心点。
3、游戏双方各持一个按钮,迅速地、不断地按动,产生脉冲,谁按
得快, 亮点就向谁的方向移动,每按一次,亮点移动一次。
4、亮点移到任一方终端二极管时,这一方就获胜,此时双方按钮均
无作用, 输出保持,只有复位后才使亮点恢复到中心。
5、用数码管显示获胜者的盘数
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件

2. 程序文件
顶层电路

代码



3. 程序编译

4. RTL图

状态图

5. 仿真图
整体仿真图
功能:电路使用 9 个发光二极管,开机后只有中间一个发亮,此即拔河的中心点。 游戏双方各持一个按钮,迅速地、不断地按动,产生脉冲,谁按得快, 亮点就向谁的方向移动,每按一次,亮点移动一次。 亮点移到任一方终端二极管时,这一方就获胜,此时双方按钮均无作用, 输出保持,只有复位后才使亮点恢复到中心。用数码管显示获胜者的盘数。

按键检测模块
模块功能:按键按下后,输出一个脉冲信号指示按键按键

拔河控制模块
模块功能:控制led灯根据按键移动,左移或者右移,发光二极管向一方的终点延伸,
当延伸到某方的最后一个发光二极管时,则该方获胜,此时双方按钮均 无作用, 输出保持,记录此时的分数

显示模块
模块功能:用数码管显示获胜者的盘数 ,分别显示游戏双方的或者盘数,采用扫描式的数码管,数码管为共阳极。

部分代码展示:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.std_logic_unsigned.all;
--控制模块
ENTITY bahe_ctrl IS
PORT (
clk : IN STD_LOGIC;--标准时钟
reset_n : IN STD_LOGIC;--复位信号,低有效
reset_cnt : IN STD_LOGIC;--计数复位信号,低有效
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号获胜次数
win2_times :OUT STD_LOGIC_VECTOR(15 DOWNTO 0)--2号获胜次数
);
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); -- 定义状态
SIGNAL state : State_Type; -- 创建信号
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 =>--复位状态
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--复位
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--复位
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--复位
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;代码文件(付费下载):
![]()
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » Quartus拔河游戏机VHDL代码仿真