EDA实训—抢答器设计报告
课题名称:EDA实训——抢答器
专业班级:2017级电子二班
姓 名:
指导老师:贺涛
2019年11月22日
目录
一:EDA抢答器设计逻辑与方案………………3二:设计整体思路……………………………….3
2.1设计要求……………………………………………………… 3
三:单元模块设计部分
3.1 概述……………………………………………………………4
- 1 -
3.2 鉴别模块的设计………………………………………………4
3.3 计时模块的设计………………………………………………6
3.4 报警模块的设计………………………………………………7
3.5 译码模块的设计………………………………………………8
3.6 分频模块的设计………………………………………………9
3.7 顶层文件………………………………………………………10
一:EDA抢答器设计逻辑与方案
- 2 -
抢答器是为智力竞赛参赛者答题时进行抢答而设计的一种优先判决器电路,竞赛者可以分为若干组,抢答时各组对主持人提出的问题要在最短的时间内做出判断,并按下抢的逻辑功能,该电路应包括抢答器鉴别模块、抢答器计数模块、报警模块、译码模块、分频模块。答按键回答问题。当第一个人按下按键后,则在显示器上显示该组的号码,对应的灯亮,同时电路将其他各组按键封锁,使其不起作用。若抢答时间内无人抢答,则报警灯亮。回答完问题后,由主持人将所有按键恢复,重新开始下一轮抢答。因此要完成抢答器
二:设计逻辑思路
(1) 设计一个可以让四组参赛队进行比赛的电子抢答器。
(2) 具有第一抢答信号的鉴别和锁存功能
(3) 具有计时功能
(4) 具有计分功能
(5) 具有报警功能
2.1设计要求
1. 抢答器同时供4名选手或4个代表队比赛,分别用4个按钮S0~ S3表示。
2. 设置一个系统清除和抢答控制开关rst,该开关由主持人控制。
3. 抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,并在LED和数码管上显示,同时提示灯亮。选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。
- 3 -
4. 抢答器具有定时抢答功能,且一次抢答的时间为20秒。
5. 如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示20。
三:单元模块设计部分
1、概述
将该任务分成五个模块进行设计,分别为:抢答器鉴别模块、抢答器计时模块、报警
模块、分频模块、译码模块
2、鉴别模块的设计:
在这个模块中主要实现抢答过程中的抢答功能,并能对超前抢答进行警告,还能记录无论是正常抢答还是朝前抢答者的台号,并且能实现当有一路抢答按键按下时,该路抢答信号将其余的抢答信号封锁的功能。其中有四个抢答信号s0、s1、s2、s3;抢答状态显示信号states;抢答与警报时钟信号clk0;系统复位信号rst;警报信号warm。
1.VHDL源程序
library ieee;
- 4 -
use ieee.std_logic_11.all;
use ieee.std_logic_unsigned.all;
entity jianbie is
port(rst,clk2:in std_logic;
s0,s1,s2,s3:in std_logic;
states:buffer std_logic_vector(3 downto 0);
light:buffer std_logic_vector(3 downto 0);
warm:out std_logic);
end jianbie ;
architecture one of jianbie is
signal st:std_logic_vector(3 downto 0);
begin
p1:process(s0,rst,s1,s2,s3,clk2)
begin
if rst='0' then
warm<='0';st<=\"0000\";
elsif clk2'event and clk2='1' then
if (s0='1' or st(0)='1')and not( st(1)='1' or st(2)='1' or st(3)='1' ) then st(0)<='1';
end if ;
- 5 -
if (s1='1' or st(1)='1')and not( st(0)='1' or st(2)='1' or st(3)='1' )
then st(1)<='1';
end if ;
if (s2='1' or st(2)='1')and not( st(0)='1' or st(1)='1' or st(3)='1' )
then st(2)<='1';
end if ;
if (s3='1' or st(3)='1')and not( st(0)='1' or st(1)='1' or st(2)='1' )
then st(3)<='1';
end if ;
warm<=st(0) or st(1) or st(2) or st(3);
end if ;
end process p1;
p2:process(states(0),states(1),states(2),states(3),light)
- 6 -
begin
if (st=\"0000\") then states<=\"0000\";
elsif (st<=\"0001\") then states<=\"0001\";
elsif (st<=\"0010\") then states<=\"0010\";
elsif (st<=\"0100\") then states<=\"0011\";
elsif (st<=\"1000\") then states<=\"0100\";
end if;
light<=st;
end process p2;
end one;
2.鉴别模块仿真图
- 7 -
图1
3.鉴别模块元件图
图2
3.2计数模块的设计
- 8 -
在这个模块中主要实现抢答过程中的计时功能,在有抢答开始后进行20秒的倒计时,并且在20秒倒计时后无人抢答显示超时并报警。其中有抢答时钟信号clk1;系统复位信号rst;抢答使能信号start;无人抢答警报信号warn;计时中止信号stop;计时十位和个位信号tb,ta。
1.VHDL源程序
library ieee;
use ieee.std_logic_11.all;
use ieee.std_logic_unsigned.all;
entity jishu is
port(clk1,rst,start,stop:in std_logic;
ta,tb:buffer std_logic_vector(3 downto 0));
end jishu;
architecture one of jishu is
signal co:std_logic;
begin
p1:process(clk1,rst,start,stop,ta)
begin
if rst='0' or stop='1' then
ta<=\"0000\";
elsif clk1'event and clk1='1' then
co<='0';
- 9 -
if start='1' then
if ta=\"0000\" then
ta<=\"1001\";co<='1';
else ta<=ta-1;
end if;
end if;
end if;
end process p1;
p2:process(co,rst,start,stop,tb)
begin
if rst='0' or stop='1' then
tb<=\"0010\";
elsif co'event and co='1' then
- 10 -
if start='1' then
if tb=\"0000\" then tb<=\"0011\";
else tb<=tb-1;
end if;
end if;
end if;
end process p2;
end one ;
2.计时模块的仿真图
图3
3.计时元件图
- 11 -
图4
3.4报警模块设计
在这个模块中主要实现抢答过程中的报警功能,当主持人按下控制键,有限时间内 人抢答或是计数到时蜂鸣器开始报警,计数停止信号stop;状态输出信号alm;计数脉冲clk。
1. VHDL源程序
- 12 -
library ieee;
use ieee.std_logic_11.all;
entity baojing is
port(rst:in std_logic;
warn:in std_logic;
clk:in std_logic;
ta,tb:in integer range 0 to 9;
stop:in std_logic;
alm:out std_logic );
end;
architecture bhv of baojing is
begin
process(warn,ta,tb,stop,clk)
begin
if rst='0'then
alm<='0';
elsif stop='1'then
alm<='0';
elsif ta=0 and tb=0 then
- 13 -
alm<=clk;
elsif warn='1'then
alm<=clk;
else alm<='0';
end if;
end process;
end;
2.报警模块仿真图
图5
3.报警模块元件图
- 14 -
图6
3.5译码器模块设计
在这个模块中主要实现抢答过程中将BCD码转换成7段的功能。1. VHDL源程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL;
ENTITY yima IS
PORT(bcd:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
dout:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END yima ;
- 15 -
ARCHITECTURE rtl OF yima IS
BEGIN
PROCESS(bcd)
BEGIN
CASE bcd IS
WHEN \"0000\"=>dout<=\"1000000\";
WHEN \"0001\"=>dout<=\"1111001\";
WHEN \"0010\"=>dout<=\"0100100\";
WHEN \"0011\"=>dout<=\"0110000\";
WHEN \"0100\"=>dout<=\"0011001\";
WHEN \"0101\"=>dout<=\"0010010\";
WHEN \"0110\"=>dout<=\"0000010\";
WHEN \"0111\"=>dout<=\"1111000\";
- 16 -
WHEN \"1000\"=>dout<=\"0000000\";
WHEN \"1001\"=>dout<=\"0010000\";
WHEN OTHERS=>dout<=\"1111111\";
END CASE;
END PROCESS;
END rtl;
2.译码器模块仿真图
图7
3.译码元件图
- 17 -
图8
3.6分频模块设计
在这个模块中主要实现抢答过程中所需的时钟信号。
1. VHDL源程序
这是一个50M分频,将50MHZ的信号分为1HZ
LIBRARY IEEE;
USE IEEE.STD_LOGIC_11.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY fenpin IS
PORT(clk : IN STD_LOGIC;
- 18 -
clk50 : OUT STD_LOGIC);
END fenpin;
ARCHITECTURE rtl OF fenpin IS
SIGNAL count : STD_LOGIC_VECTOR(25 DOWNTO 0);
BEGIN
PROCESS(clk)
BEGIN
IF (clk'event AND clk='1') THEN
IF(count=\"10111110101111000010000000\") THEN
Count <=\"00000000000000000000000000\";
ELSE
Count <= count +1;
END IF ;
- 19 -
END IF ;
END PROCESS;
PROCESS(clk)
BEGIN
IF (clk'event AND clk='1') THEN
IF(count=\"10111110101111000010000000\") THEN
clk50 <= '1';
ELSE
clk50 <= '0';
END IF ;
END IF ;
END PROCESS;
END;
- 20 -
2. 分频模块仿真图
3. 分频模块元件图
3.7顶层文件
顶层原理图:
图9
图10
- 21 -