名称:基于FPGA的6路抢答器设计VHDL代码Quartus DE2-115开发板
软件:Quartus
语言:VHDL
代码功能:
设计一个基于FPGA的6路抢答器。
设计要求
1.系统主要外设:自恢复式按键6个、数码管1个、LED灯5个、蜂鸣器1个、系统时钟(1KHZ)
2.系统主要功能:设置一个抢答开关,该开关由主持人控制,只有当主持人按下开始建才能抢答,否则无效;设置6个抢答按钮,该按钮分别代表六个选手,编号为1、2、3、4、5、6,当有选手按下按钮时,该选手编号锁存且显示;设置有5秒抢答倒计时,当主持人按下按钮后开始倒计时显示,选手在设定时间内抢答有效,时间到蜂鸣器响2秒,提示抢答结束。
*备注:抢答倒计时用流水灯进行显示。当主持人启动“开始”键后,5个LED灯全亮,每流失一秒,LED灯熄灭一个,从右到左一次熄灭,直到全部熄灭。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
本代码已在DE2-115开发板验证,DE2-115开发板如下,其他开发板可以修改管脚适配:
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. RTL图
5. 仿真图
Testbench
5.1 整体仿真
5.2 抢答控制模块
5.3 分频模块
5.4 显示模块
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; --抢答器控制模块 ENTITY qiandda_ctrl IS PORT ( clk : IN STD_LOGIC;--时钟 clk_1Hz : IN STD_LOGIC;--1Hz时钟 reset_n : IN STD_LOGIC;--复位 start_p : IN STD_LOGIC;--开始 --6个抢答按键 key_1 : IN STD_LOGIC; key_2 : IN STD_LOGIC; key_3 : IN STD_LOGIC; key_4 : IN STD_LOGIC; key_5 : IN STD_LOGIC; key_6 : IN STD_LOGIC; led_overtime : OUT STD_LOGIC;--超时报警(蜂鸣器) time_down : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--倒计时 qiangda : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)--抢答号 ); END qiandda_ctrl; ARCHITECTURE behavioral OF qiandda_ctrl IS --定义状态 constant s_idle : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0000"; constant s_start : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0001"; constant s_timedown : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0010"; constant s_qianda_1 : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0111"; constant s_qianda_2 : STD_LOGIC_VECTOR(3 DOWNTO 0) := "1000"; constant s_qianda_3 : STD_LOGIC_VECTOR(3 DOWNTO 0) := "1001"; constant s_qianda_4 : STD_LOGIC_VECTOR(3 DOWNTO 0) := "1010"; constant s_qianda_5 : STD_LOGIC_VECTOR(3 DOWNTO 0) := "1011"; constant s_qianda_6 : STD_LOGIC_VECTOR(3 DOWNTO 0) := "1100"; constant s_overtime : STD_LOGIC_VECTOR(3 DOWNTO 0) := "1111"; --内部信号 SIGNAL qiangda_temp : STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL state : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0000"; SIGNAL time_cnt : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0101"; SIGNAL wait_cnt : STD_LOGIC_VECTOR(3 DOWNTO 0) := "0000"; BEGIN --定时电路 --控制倒计时 PROCESS (clk, reset_n) BEGIN IF ((NOT(reset_n)) = '1') THEN time_cnt <= "0000"; ELSIF (clk'EVENT AND clk = '1') THEN IF (state = s_start) THEN time_cnt <= "0101";--起始时间5秒 ELSIF (state = s_timedown and clk_1Hz='1') THEN--倒计时,每秒倒计时1 time_cnt <= time_cnt - "0001"; END IF; END IF; END PROCESS; PROCESS (clk, reset_n) BEGIN IF ((NOT(reset_n)) = '1') THEN wait_cnt <= "0000"; ELSIF (clk'EVENT AND clk = '1') THEN IF (state = s_idle) THEN wait_cnt <= "0000";--0 ELSIF (state = s_overtime and clk_1Hz='1') THEN--超时 wait_cnt <= wait_cnt + "0001"; END IF; END IF; END PROCESS; time_down <= time_cnt;--倒计时
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1062
1086