一、概述
抢答器的逻辑结构较简单,它主要由抢答鉴别模块、控制模块、计时模块、选择控制和报警器组成。在整个抢答器中最关键的是如何实现抢答封锁,在控制键按下的同时计数器倒计时显示有效剩余时间。除此之外,整个抢答器还需有一个使能信号和一个归零信号,以便抢答器能实现公平抢答和停止。抢答器共有3个输出显示,选手代号、计数器的个位和十位,他们输出全都为BCD码输出,这样便于和显示译码器连接。当主持人按下控制键、选手按下抢答键或倒计时到时蜂鸣器响起。
二、方案设计与论证
将该任务分成七个模块进行设计,分别为:抢答器鉴别模块、抢答器计时模块、抢答器记分模块、控制模块、译码模块、数选模块、报警模块,最后连接总电路图。
1、抢答器鉴别模块:
在这个模块中主要实现抢答过程中的抢答功能,并能对超前抢答进行警告,还能记录无论是正常抢答还是朝前抢答者的台号,并且能实现当有一路抢答按键按下时,该路抢答信号将其余个绿抢答封锁的功能。其中有四个抢答信号s0、s1、s2、s3;抢答使能信号s;抢答状态显示信号states;抢答与警报时钟信号clk2;系统复位信号rst;警报信号tmp。 2、抢答器计时模块:
在这个模块中主要实现抢答过程中的计时功能,在有抢答开始后进行30秒的倒计时,并且在30秒倒计时后无人抢答显示超时并报警。其中有抢答时钟信号clk2;系统复位信号rst;抢答使能信号s;抢答状态显示信号states;无人抢答警报信号warn;计时十位和个位信号tb,ta。 3、数据选择模块:
在这个模块中主要实现抢答过程中的数据输入功能,输入信号a[3..0]、b[3..0]、c[3..0];计数输出信号s;数据输出信号y;计数脉冲clk2,实现a、b、c按脉冲轮流选通,在数码管上显示。 4、报警模块:
在这个模块中主要实现抢答过程中的报警功能,当主持人按下控制键,有限时间
1
内 人抢答或是计数到时蜂鸣器开始报警,有效电平输入信号i;状态输出信号q;计数脉冲clk。 5、译码模块:
在这个模块中主要实现抢答过程中将BCD码转换成7段的功能。 6、控制模块:
在这个模块中主要实现有人抢答或计数器倒零时使计数器停止计的功能。 7、总电路图:
在这个模块中是对前六个模块的连接。 三、单元电路设计 (一)抢答鉴别模块 1、VHDL源程序 library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity qdjb1 is
port(rst,clk2:in std_logic; s0,s1,s2,s3:in std_logic;
states:buffer std_logic_vector(3 downto 0); tmp:out std_logic); end qdjb1;
architecture one of qdjb1 is
signal st:std_logic_vector(3 downto 0); begin
p1:process(s0,rst,s1,s2,s3,clk2) begin
if rst='0' then tmp<='0';st<=\
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
2
st(0)<='1'; end if ;
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 ;
tmp<=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)) begin
if (st=\ elsif (st<=\ elsif (st<=\ elsif (st<=\ elsif (st<=\end if; end process p2; end one; 2、仿真图:
3
(二)计时模块 1、VHDL源程序 library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity js1 is
port(clk,rst,s:in std_logic;
ta,tb:buffer std_logic_vector(3 downto 0); warn:out std_logic); end js1;
architecture one of js1 is signal co:std_logic; begin
p1:process(clk,rst,s,ta) begin
if rst='0' then ta<=\
elsif clk'event and clk='1' then co<='0'; if s='1' then if ta=\ ta<=\ else ta<=ta-1;
4
end if; end if; end if; end process p1; p2:process(co,rst,s,tb) begin
if rst='0' then tb<=\
elsif co'event and co='1' then if s='1' then
if tb=\ else tb<=tb-1; end if; end if; end if;
if(ta=\ warn<='1'; else warn<='0'; end if; end process p2; END ONE; 2、仿真图
5