软件:Quartus
语言:VHDL
代码功能:
设计个可容纳6组参赛的数字式抢答器。
1每组设一个按钮,供抢答使用。
2.抢答器具有第一信号鉴别和锁存功能,使除第一抢答者外的按钮不起作用。
3.设置一个主持人“开始¨按钮。主持人复位后,开始抢答,第一信号鉴别锁存电路得到信号后,有指示灯显示抢答组别,扬声器发出2~3秒的音响。
4.设置一个计分电路,每组开始预置100分,由主持人记分,答对一次加10分,答错一次减10分,
提示此设计问题的关键是准确判断出第一抢答者并将其锁存实现的方法可使用触发器或锁存器.在得到第一信号后将输入封锁,使其它组的抢答信号无效。
2)形成第一抢答信号后,用编码、译码及数码显示电路显示第一抢答者的组别,用第一抢答信号推动扬声器。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 程序编译
4. RTL图
5. 仿真图
整体仿真图
上图仿真了,主持人开始后,3号最先抢答,蜂鸣器响3秒,led3指示灯亮,通过控制分数,将3号分数加10分。
控制模块
上图为控制模块仿真图,按下主持人开始键后,3号最先抢答,led3亮,蜂鸣器响3秒,输出抢答号为3
计分模块
上图为计分模块仿真图,图中起始分数均为100分(仿真图中省略了个位,因为个位恒为0),1号分数两次加分一次减分,最终为110分。5号四次加分两次减分,最终分数120分
显示模块
上图为显示模块仿真,图上分为HEX1显示抢答者,HEX2~3为抢答者的分数。其中HEX4为分数个位,恒为0.图上可知1号分数100分,2号180分,3号60分,4号30分,5号20分,6号60分。
部分代码展示:
LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; --抢答控制模块 ENTITY qiandda_ctrl IS PORT ( clk : IN STD_LOGIC;--10Hz reset_n : IN STD_LOGIC; start_p : IN STD_LOGIC;--主持人按键 key_1 : IN STD_LOGIC;--抢答按键,所有key都是高电平有效 key_2 : IN STD_LOGIC;--抢答按键,所有key都是高电平有效 key_3 : IN STD_LOGIC;--抢答按键,所有key都是高电平有效 key_4 : IN STD_LOGIC;--抢答按键,所有key都是高电平有效 key_5 : IN STD_LOGIC;--抢答按键,所有key都是高电平有效 key_6 : IN STD_LOGIC;--抢答按键,所有key都是高电平有效 qiangda : OUT STD_LOGIC_VECTOR(3 DOWNTO 0);--正常抢答 beep : OUT STD_LOGIC;--蜂鸣器 led_1 : OUT STD_LOGIC;--抢答指示led灯,高亮 led_2 : OUT STD_LOGIC;--抢答指示led灯,高亮 led_3 : OUT STD_LOGIC;--抢答指示led灯,高亮 led_4 : OUT STD_LOGIC;--抢答指示led灯,高亮 led_5 : OUT STD_LOGIC;--抢答指示led灯,高亮 led_6 : OUT STD_LOGIC --抢答指示led灯,高亮 ); END qiandda_ctrl; ARCHITECTURE RTL OF qiandda_ctrl IS TYPE State_type IS (idle, start, qiangda_1, qiangda_2,qiangda_3,qiangda_4,qiangda_5,qiangda_6); -- 定义状态 SIGNAL current_state : State_Type; -- 创建信号 SIGNAL qiangda_temp : STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL huida_time : STD_LOGIC_VECTOR(9 DOWNTO 0) := "0000000000"; BEGIN --状态机-- PROCESS (clk,start_p) BEGIN IF (start_p = '1') THEN--主持人按键 current_state <= start;--开始抢答 ELSIF (clk'EVENT AND clk = '1') THEN CASE current_state IS WHEN idle =>--未开始抢答状态 IF (start_p = '1') THEN--主持人按键 current_state <= start;--开始抢答 ELSE current_state <= idle; END IF; WHEN start =>--开始抢答状态 IF (key_1 = '1') THEN current_state <= qiangda_1;--1号抢答 ELSIF (key_2 = '1') THEN current_state <= qiangda_2;--2号抢答 ELSIF (key_3 = '1') THEN current_state <= qiangda_3;--3号抢答 ELSIF (key_4 = '1') THEN current_state <= qiangda_4;--4号抢答 ELSIF (key_5 = '1') THEN current_state <= qiangda_5;--5号抢答 ELSIF (key_6 = '1') THEN current_state <= qiangda_6;--6号抢答 ELSE current_state <= start; END IF; WHEN qiangda_1 => current_state <= qiangda_1;--1号抢答 WHEN qiangda_2 => current_state <= qiangda_2;--2号抢答 WHEN qiangda_3 => current_state <= qiangda_3;--3号抢答 WHEN qiangda_4 => current_state <= qiangda_4;--4号抢答 WHEN qiangda_5 => current_state <= qiangda_5;--5号抢答 WHEN qiangda_6 => current_state <= qiangda_6;--6号抢答 WHEN OTHERS => current_state <= idle; END CASE; END IF; END PROCESS;
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1055
677