一、 设计任务与要求
1. 抢答器同时供8名选手或8个代表队比赛,分别用8个按钮S0 ~ S7表示。
2. 设置一个系统清除和抢答控制开关S,该开关由主持人控制。
3. 抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,并在LED数码管上显示,同时扬声器发出报警声响提示。选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。
4. 抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如30秒)。当主持人启动"开始"键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续的时间0.5秒左右。
5. 参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。
6. 如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。
二、预习要求
1.复习编码器、十进制加/减计数器的工作原理。
2.设计可预置时间的定时电路。
3.分析与设计时序控制电路。
4. 画出定时抢答器的整机逻辑电路图
三、设计原理与参考电路
1.数字抢答器总体方框图
如图所示为总体方框图。其工作原理为:接通电源后,主持人将开关拨到"清除"状态,抢答器处于禁止状态,编号显示器灭灯,定时器显示设定时间;主持人将开关置?quot;开始"状态,宣布"开始"抢答器工作。定时器倒计时,扬声器给出声响提示。选手在定时时间内抢答时,抢答器完成:优先判断、编号锁存、编号显示、扬声器提示。当一轮抢答之后,定时器停止、禁止二次抢答、定时器显示剩余时间。如果再次抢答必须由主持人再次操作"清除"和"开始"状态开关。
2.单元电路设计
(1) 抢答器电路
参考电路如图所示。该电路完成两个功能:一是分辨出选手按键的先后,并锁存优先抢答者的编号,同时译码显示电路显示编号;二是禁止其他选手按键操作无效。工作过程:开关S置于"清除"端时,RS触发器的 端均为0,4个触发器输出置0,使74LS148的 =0,使之处于工作状态。当开关S置于"开始"时,抢答器处于等待工作状态,当有选手将键按下时(如按下S5),74LS148的输出 经RS锁存后,1Q=1, =1,74LS48处于工作状态,4Q3Q2Q=101,经译码显示为"5"。此外,1Q=1,使74LS148 =1,处于禁止状态,封锁其他按键的输入。当按键松开即按下时,74LS148的 此时由于仍为1Q=1,使 =1,所以74LS148仍处于禁止状态,确保不会出二次按键时输入信号,保证了抢答者的优先性。如有再次抢答需由主持人将S开关重新置?quot;清除"然后再进行下一轮抢答。74LS148为8线-3线优先编码器,表11、1为其功能表。
上面这个被多家网站和许多电子制作大赛组委会广泛使用的抢答器居然有严重的错误,就是没法锁存,或锁存后没法重启,造成这一错误的关键是主持人开关有个清零动作,这个清0动作要确保锁存器清0,而这个电路的缺陷是清零动作不能保证存储器一定清零,因为清零是利用基本RS触发器的置0功能,基本RS触发器的置 0功能要求R端一定为0,S端一定为1,这样才能确保清零,而上述电路主持人按下清0按钮后,不能确RS的状态一定为01,只能保证在主持人按下清零按键后R端为零,所以上述电路存在严重缺陷,以至于有些仿真软件不能仿真出正确的结果,改正的办法是将清零信号“非”以后,再和148的输出端“或”后接入基本RS触发器的S端。上述抢答器电路经修改后的VHDL程序如下:
74LS148的功能真值表:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY QDQ111 IS
PORT( START,D1,D2,D3,D4,D5,D6,D7,D8:IN STD_LOGIC;
QO0,QO1,QO2,QO3,W1:OUT STD_LOGIC;
XS:OUT STD_LOGIC_VECTOR(6 DOWNTO 0));
END QDQ111;
ARCHITECTURE QDQ OF QDQ111 IS
SIGNAL EI,EIO:STD_LOGIC;
SIGNAL Q0,Q1,Y:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL QD3,QD2,QD1,QD0:STD_LOGIC;
COMPONENT RSd is
port(Rd,Sd:in std_logic;
Q:out std_logic);
END COMPONENT;
BEGIN
PROCESS(D1,D2,D3,D4,EI,START)
BEGIN
IF EI='0' then
IF D1='0' THEN Q0<= "1110";EIO<='0';
ELSIF D2='0' THEN Q0<="1101";EIO<='0';
ELSIF D3='0' THEN Q0<="1100";EIO<='0';
ELSIF D4='0' THEN Q0<="1011";EIO<='0';
ELSIF D5='0' THEN Q0<="1010";EIO<='0';
ELSIF D6='0' THEN Q0<="1001";EIO<='0';
ELSIF D7='0' THEN Q0<="1000";EIO<='0';
ELSIF D8='0' THEN Q0<="0111";EIO<='0';
ELSE Q0<="1111";EIO<='1';
END IF;
ELSE Q0<="1111";
END IF;
END PROCESS;
U1:RSd PORT MAP(START,((NOT START)OR Q0(0)),QD0);
U2:RSd PORT MAP(START,((NOT START)OR Q0(1)),QD1);
U3:RSd PORT MAP(START,((NOT START)OR Q0(2)),QD2);
U4:RSd PORT MAP(START,((NOT START)OR EIO),QD3);
EI<=QD3;
QO0<=QD0;QO1<=QD1;QO2<=QD2;QO3<=QD3;
--***********以上锁存,以下编码显示****************--
Y<=QD3&QD2&QD1&QD0;
PROCESS(Y)
BEGIN
CASE Y IS
WHEN "1111"=>XS<="1001111";
WHEN "1110"=>XS<="0010010";
WHEN "1101"=>XS<="0000110";
WHEN "1100"=>XS<="1001100";
WHEN "1011"=>XS<="0100100";
WHEN "1010"=>XS<="0100000";
WHEN "1001"=>XS<="0001111";
WHEN "1000"=>XS<="0000000";
WHEN OTHERS=>XS<="0000001";
END CASE;
W1<='0';
END PROCESS;
END;
*******************************************************************
上面程序还需编写一个基本RS触发器以便调用,即component调用语句
library ieee;
use ieee.std_logic_1164.all;
entity RSd is
port(Rd,Sd:in std_logic;
Q:out std_logic);
end RSd;
architecture ca of RSd is
signal RS:std_logic_vector(1 downto 0);
SIGNAL Q0,A,B:std_logic;
begin
A<=NOT(Sd AND B);B<=NOT(Rd AND A);
Q<=A;
end;
***********************************************************************
定时电路:
由节目主持人根据抢答题的难易程度,设定一次抢答的时间,通过预置时间电路对计数器进行预置,计数器的时钟脉冲由秒脉冲电路提供。可预置时间的电路选用十进制同步加减计数器74LS192进行设计,具体电路如上图所示。
(3)报警电路
由555定时器和三极管构成的报警电路如图11、4所示。其中555构成多谐振荡器,振荡频率fo=1.43/[(RI+2R2)C],其输出信号经三极管推动扬声器。PR为控制信号,当PR为高电平时,多谐振荡器工作,反之,电路停振。
4)时序控制电路
时序控制电路是抢答器设计的关键,它要完成以下三项功能:
①主持人将控制开关拨到"开始"位置时,扬声器发声,抢答电路和定时电路进人正常抢答工作状态。
②当参赛选手按动抢答键时,扬声器发声,抢答电路和定时电路停止工作。
③当设定的抢答时间到,无人抢答时,扬声器发声,同时抢答电路和定时电路停止工作。
根据上面的功能要求,设计的时序控制电路如上图所示。图中,门G1 的作用是控制时钟信号CP的放行与禁止,门G2的作用是控制74LS148的输人使能端 。图11、4的工作原理是:主持人控制开关从"清除"位置拨到"开始"位置时,来自于图11、2中的74LS279的输出 1Q=0,经G3反相, A=1,则时钟信号CP能够加到74LS192的CPD时钟输入端,定时电路进行递减计时。同时,在定时时间未到时,则"定时到信号"为 1,门G2的输出 =0,使 74LS148处于正常工作状态,从而实现功能①的要求。当选手在定时时间内按动抢答键时,1Q=1,经 G3反相, A=0,封锁 CP信号,定时器处于保持工作状态;同时,门G2的输出 =1,74LS148处于禁止工作状态,从而实现功能②的要求。当定时时间到时,则"定时到信号"为0, =1,74LS148处于禁止工作状态,禁止选手进行抢答。同时, 门G1处于关门状态,封锁 CP信号,使定时电路保持00状态不变,从而实现功能③的要求。集成单稳触发器74LS121用于控制报警电路及发声的时间,其工作原理请读者自行分析。
四、实验仪器设备
1. 数字实验箱。
2. 集成电路74LS148 1片,74LS279 1片,74LS48 3片,74LS192 2片,NE555 2片,74LS00 1片,74LS121 1片。
3. 电阻 510Ω 2只,1KΩ 9只,4.7kΩ l只,5.1kΩ l只,100kΩ l只,10kΩ 1只, 15kΩ 1只, 68kΩ l只。
4. 电容 0.1uF 1只,10uf 2只,100uf 1只。
5. 三极管 3DG12 1只。
6. 其它:发光二极管2只,共阴极显示器3只。五、实验内容及方法1.组装调试抢答器电路。
2.设计可预置时间的定时电路,并进行组装和调试。当输人1Hz的时钟脉冲信号时,要求电路能进行减计时,当减计时到零时,能输出低电平有效的定时时间到信号。
3.组装调试报警电路。
4.完成定时抢答器的联调,注意各部分电路之间的时序配合关系。然后检查电路各部分的功能,使其满足设计要求。
抢答器PLD程序
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY QDQ IS
PORT(D:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CP,CR,Start:IN STD_LOGIC;
A,B,C,DD,E,F,G,BP:OUT STD_LOGIC);
END QDQ;
ARCHITECTURE QDQ OF QDQ IS
SIGNAL CLK,DDD:STD_LOGIC;
SIGNAL Y:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL DO,YS:STD_LOGIC_VECTOR(7 DOWNTO 0);
COMPONENT QDLED7 is
PORT(DATA:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
a,b,c,d,e,f,g:out std_logic);
END COMPONENT;
BEGIN
PROCESS(CP,CLK,CR,DO,start)
BEGIN
IF Start='1' then
IF CLK'EVENT AND CLK='1' THEN
DO<=D;
END IF;
IF CR='0' THEN DO<="11111111";
END IF;
IF DO="11111111" THEN DDD<='1';
ELSE DDD<='0';
END IF;
END if;
END PROCESS;
CLK<=CP AND DDD;
YS<=DO;
PROCESS(YS)
BEGIN
CASE YS IS
WHEN "11111110" =>Y<="0001";
WHEN "11111101" =>Y<="0010";
WHEN "11111011" =>Y<="0011";
WHEN "11110111" =>Y<="0100";
WHEN "11101111" =>Y<="0101";
WHEN "11011111" =>Y<="0110";
WHEN "10111111" =>Y<="0111";
WHEN "01111111" =>Y<="1000";
WHEN OTHERS =>Y<="0000";
END CASE;
END PROCESS;
UU:QDLED7 PORT MAP(Y,A,B,C,DD,E,F,G);--组数显示
BP<=NOT DDD; --驱动发声装置工作信号输出
END;
八位锁存器:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY SUOCQ IS
PORT(D:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
CP,CR:IN STD_LOGIC;
Yout:OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END SUOCQ;
ARCHITECTURE QDQ OF SUOCQ IS
SIGNAL CLK,DDD:STD_LOGIC;
SIGNAL DO:STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
PROCESS(CP,CLK,CR,DO)
BEGIN
IF CLK'EVENT AND CLK='1' THEN
DO<=D;
END IF;
IF CR='0' THEN DO<="11111111";
END IF;
IF DO="11111111" THEN DDD<='1';
ELSE DDD<='0';
END IF;
END PROCESS;
CLK<=CP AND DDD;
Yout<=DO;
END;