FPGA设计实践报告 抢答器设计设计
- 格式:doc
- 大小:220.50 KB
- 文档页数:14
课程设计报告
课程设计名称: FPGA设计实践
设计课题名称: 抢答器设计设计
抢答器设计设计报告
一、 设计目的:
本课程的授课对象是电子科学与技术专业本科生,是电子类专业的一门重要的实践课程,是理论与实践相结合的重要环节。
本课程有助于培养学生的数字电路设计方法、掌握模块划分、工程设计思想与电路调试能力,为以后从事各种电路设计、制作与调试工作打下坚实的基础。
二、 实验器材和工具软件: - 2 - 实验器材:PC机一台、DE2板;
工作软件:QuartusII9.0。
三、 设计内容:
(1)抢答器可容纳四组12位选手,每组设置三个抢答按钮供选手使用。
(2)电路具有第一抢答信号的鉴别和锁存功能。在主持人将系统复位并发出抢答指令后,蜂鸣器提示抢答开始,时显示器显示初始时间并开始倒计时,若参赛选手按抢答按钮,则该组指示灯亮并用组别显示器显示选手的组别,同时蜂鸣器发出“嘀嘟”的双音频声。此时,电路具备自锁功能,使其它抢答按钮不起作用。
(3)如果无人抢答,计时器倒计时到零,蜂鸣器有抢答失败提示,主持人可以按复位键,开始新一轮的抢答。
(4)设置犯规功能。选手在主持人按开始键之前抢答,则认为犯规,犯规指示灯亮和显示出犯规组号,且蜂鸣器报警,主持人可以终止抢答执行相应惩罚。
(5)抢答器设置抢答时间选择功能。为适应多种抢答需要,系统设有10秒、15秒、20秒和3O秒四种抢答时间选择功能 。
四、 设计具体步骤:
具体的功能模块的实现:
- 3 -
(一) 组别判断电路模块
(1)实现功能:实现四组十二位选手的组别判断功能,每组设置三个抢答按钮。若选手成功抢答,则输出选手所在组别。同时电路自锁功能,使其它抢答按钮不起作用。如下图所示:
(2)端口说明
1)输入端
a[2..0]:外接第一组三位选手的抢答按钮;
b[2..0]:外接第二组三位选手的抢答按钮;
c[2..0]:外接第三组三位选手的抢答按钮;
d[2..0]:外接第四组三位选手的抢答按钮;
clk:外接模块时钟信号; - 4 - clr:外接模块复位按钮。
2)输出端
s[3..0]:抢答四组输出端。
3)内部信号
h:存放小组抢答信号。
reset:复位功能。
(3)原理:在每次时钟上升沿时判断按键,将扫描到的组别赋给内部信号“h”,若没有按键被按下,则h=“0000”;当复位按钮按下时,即clr=‘1’,则输出s=“0000”并且将另一内部信号reset置1;当复位后,即reset=‘1’,则当有按键按下时将h的值给输出信号s,并且将标志信号reset清零,完成按键组别的输出与组别锁存功能。
(4)用VHDL语言实现如下:
组别判断电路模块oro
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY oro IS
PORT(a,b,c,d:IN STD_LOGIC_VECTOR(2 DOWNTO 0); --四组十二人输入端
s :OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --四组输出端
clk,clr :IN STD_LOGIC
);
END oro;
ARCHITECTURE behave_oro OF oro IS
SIGNAL h : STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL reset :STD_LOGIC;
BEGIN
h<="0000" WHEN (a="000" AND b="000" AND c="000" AND d="000") ELSE
"0001" WHEN (a/="000" AND b="000" AND c="000" AND d="000") ELSE
"0010" WHEN (a="000" AND b/="000" AND c="000" AND d="000") ELSE
"0100" WHEN (a="000" AND b="000" AND c/="000" AND d="000") ELSE
"1000" WHEN (a="000" AND b="000" AND c="000" AND d/="000") ELSE
"0000"; --判断选中小组
PROCESS(clk)
BEGIN
IF(clk'EVENT AND clk='1')THEN
IF clr='1' THEN - 5 - reset<='1';
s<="0000"; --复位清零
END IF;
IF h/="0000" THEN
IF reset='1' THEN
s<=h; --选中小组输出
reset<='0';
END IF;
END IF;
END IF;
END PROCESS;
END behave_oro;
(二) 犯规控制电路模块
(1)实现功能:选手在主持人开始倒计时之前抢答,则认为犯规,犯规指示灯亮并输出犯规组号,且蜂鸣器报警。如下图所示:
(2)端口说明
1)输入端
en:倒计时启动输入端;
a[3..0]:按键组别的信息输入端;
2)输出端
s[3..0]:
hex[3..0]:
y:连接外部违规指示灯输出端;
bell:连接外部蜂鸣器输出端;
(3)原理:组别判别模块的s输入至a,则a为按键组别的信息;en接主持人 - 6 - 的“开始”按键;由于无论是在正常情况还是犯规情况下按下按键,都必须显示按键的组别且蜂鸣器响,所以将a的值给hex以输出按键组别,且在有按键被按下,即a/="0000"时,bell输出为‘1’,否则为‘0’;若在开始之前有按键按下,即en='0'且a/="0000"时,y输出为‘1’,否则为‘0’;若在开始之后有按键按下,将a的值给s,使该组指示灯亮,开始之前s输出“0000”。
(4)用VHDL语言实现如下:
--犯规控制电路模块WG
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY wg IS
PORT( en :IN STD_LOGIC;
a :in std_logic_vector(3 downto 0);
s :OUT STD_LOGIC_VECTOR(3 DOWNTO 0); --led显示组别号
hex :OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
y,bell:OUT STD_LOGIC); --犯规灯输出端,蜂鸣器输出端
END wg;
ARCHITECTURE behave_wg OF wg IS
BEGIN
hex<=a;
s<=a WHEN en='1' ELSE "0000";
y<='1' WHEN en='0' AND a/="0000" ELSE '0';
bell<='1' WHEN a/="0000" ELSE '0';
END behave_wg;
(三) 抢答信号判别电路模块
(1) 实现功能:将抢答到的组别信息显示在7段数码管上。如下图所示:
(2)端口说明 - 7 - 1)输入端
s:抢答组别输入端;
2)输出端
ex:抢答组别号输出端。
(3)原理:
数码管由7段显示输出,利用7个位的组合输出,可以形成0-9的数字对应显示。试验中所用到的为低电平有效,故此,输出‘0’为亮,‘1’为暗。
(4)用VHDL语言实现如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY qd IS
PORT(s :IN STD_LOGIC_VECTOR(3 DOWNTO 0); --抢答组别输入端
ex :OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); --抢答组别号输出端
END qd;
ARCHITECTURE behave_qd OF qd IS
BEGIN
WITH s(3 DOWNTO 0) SELECT
ex<= "1111001" WHEN "0001" , --第一组
"0100100" WHEN "0010" , --第二组
"0110000" WHEN "0100" , --第三组
"0011001" WHEN "1000" , --第四组
"1111111" WHEN OTHERS; --没人选择
END behave_qd;
(四) 分频电路模块
(1)实现功能:将抢答到的组别信息显示在7段数码管上。如下图所示:
(2)端口说明
1)输入端 - 8 - clkin:频率输入端;
2)输出端
clkout:频率输出端。
(3)原理: 对一个2X分频的电路电路来说,counter上限是N=x-1。50MHz分频为1Hz频率时钟即每1秒亮一下
(4)用VHDL语言实现如下:
--分频电路模块DIV
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY div IS
PORT(clkin : IN STD_LOGIC;
clkout: OUT STD_LOGIC);
END div;
ARCHITECTURE behave_div OF div IS
constant N:Integer:=24999999; --50MHz分频为1Hz频率时钟即每1秒亮一下
SIGNAL counter:Integer RANGE 0 TO N;