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;