智力竞赛抢答器的设计.docx
《智力竞赛抢答器的设计.docx》由会员分享,可在线阅读,更多相关《智力竞赛抢答器的设计.docx(9页珍藏版)》请在冰豆网上搜索。
智力竞赛抢答器的设计
黑龙江科技学院
课程设计任务书
一、设计题目:
二、设计的主要内容:
指导教师:
日期:
教师评语:
评阅成绩:
评阅人:
日期:
黑龙江科技学院
课程设计任务书
一、设计题目:
智力竞赛抢答器的设计
二、设计的主要内容:
设计一个智力竞赛抢答器要求具有四路抢答输入,能够识别最先抢答的信号,显示该台号;对回答问题所用的时间进行计时、显示、超时报警;可以预置回答问题的时问;同时具有复位功能,倒计时启动功能。
指导教师:
郝维来
日期:
教师评语:
评阅成绩:
评阅人:
日期:
摘要
本文介绍了一种智力竞赛抢答器的基本原理和功能要求,并采用VHDL语言实现了这种抢答器的程序设计。
本文所采用的模块化、逐步细化的设计方法有利于系统的分工合作、并且能够及早发现各子模块及系统中的错误,提高系统设计的效率,特别适用于可编程逻辑器件的应用设计。
把要设计的系统划分为五个功能模块:
抢答信号判别电路,最先抢答的台号显示控制电路,分频电路,倒计时及计时值显示电路,扬声器控电路.
关键词:
VHDL自顶向下的设计方法抢答器可编程逻辑器件
第1章概述
1.1简单介绍
20世纪90年代,引起数字系统设计方法发生突破性变革的技术是VHDL(VeryHighSpeedIntegratedCircuitHardwareDescriptionLanguage,超高速集成电路硬体描述语言)。
它是一种以IEEE一1076标准所规范的硬件描述语言,主要用于从算法级、寄存器级到门级的多种抽象设计层次的数字系统建模,已成为电子设计自动化(EDA)的一种重要手段。
现代数字系统的设计多采用自顶向下的设计方法,属阶层式设计‘1'。
自顶向下设计的各个阶层,可全部用图形也可全部用VHDL语言进行描述,还可采用混合方式,即顶层模块用图形描述,底层元件用VHDL描述等。
1.2实际应用
工厂、学校和电视台等单位常举办各种智力竞赛,抢答记分器是必要设备。
在我校举行的各种竞赛中我们经常看到有抢答的环节,举办方多数采用让选手通过举答题板的方法判断选手的答题权,这在某种程度上会因为主持人的主观误断造成比赛的不公平性。
为解决这个问题,我们小组准备就本次大赛的机会制作一个低成本但又能满足学校需要的四路智力竞赛抢答器。
抢答器在竞赛中有很大用处,它能准确、公正、直观地判断出第1抢答者。
通过抢答器的指示灯显示、数码显示和警示蜂鸣等手段指示出第1抢答者。
第2章智力抢答器的设计思想
2.1智力竞赛抢答器的基本原理
设计一个智力竞赛抢答器要求具有四路抢答输入,能够识别最先抢答的信号,显示该台号;对回答问题所用的时间进行计时、显示、超时报警;可以预置回答问题的时问;同时具有复位功能,倒计时启动功能。
2.2功能模块划分
根据对抢答器的功能要求,把要设计的系统划分为五个功能模块:
抢答信号判别电路,最先抢答的台号显示控制电路,分频电路,倒计时及计时值显示电路,扬声器控电路.
2.3功能分析
抢答信号判别电路在系统复位后,对A、B、c、D四路抢答信号进行判别,输出端G3一G0与A—D一一对应,优胜者对应的G为“1”,其余的G为“0”,且将结果锁存。
完成抢答判别的同时,输出端R输出有效信号,对扬声器进行选通。
分频电路用于产生倒计时电路所需的周期为ls的时钟脉冲,分频系数视输入时钟cLK的频率而定。
台号显示控制电路将输入信号G3一G0转换为BCD码,以驱动数码管,显示台号。
倒计时及时间显示控制电路由ti,tset信号预置答题时问;由复位信号INI将答题时间作为初值赋给倒计时计数器;由计数允许信号EN启动计数。
输出信号为time,sel与out,其中sel与out为扬声器选通控制信号。
扬声器控制电路使系统只在两种情况下输出驱动扬声器的脉冲信号:
一种是倒计时计数器处于禁止计数状态(EN无效),并且完成初始化,开始对抢答信号进行判别,当某参赛组抢先按下按键,系统在输出该组台号信息的同时,输出脉冲信号;一种是确认优先抢答的参赛组后,启动倒计时计数器计数(使EN有效),当计数到“0”时,输出脉冲信号。
根据上述分析得出了各功能模块间的接口关系,见图1
至此,已从设计要求出发生成了抢答器的顶层文件。
2.4用VHDL自顶向下实现智能抢答器的设计
采用VHDL、以层次化设计的方法对抢答器进行逻辑功能描述。
本设计用单个VHDL实体进行逻辑设计,以若干进程分别对各功能模块进行描述。
对外部端口在实体中定义,对各模块间的接口信号,作为内部节点,在结构体中用SIGNAL定义。
抢答器的VHDL源文件qdq.Vhd见程序清单。
仿真结果如下:
第3章结论
用VHDL设计的智力竞赛抢答器在计算机上仿真通过后,下载到可编程逻辑器件中,整个设计过程相对于传统的设计方法,有较大的突破,重要体现在:
1)VHDL的设计采用自顶向下的设计方法⋯。
这种模块化、逐步细化的方法有利于系统的分工合作、并且能够及早发现各子模块及系统中的错误,提高系统设计的效率。
2)VHDL有非常丰富的数据类型:
位、位矢量、整数、实数、数组、结构等,可以非常灵活地描述系统总线和实现算法。
3)VHDL引入工作库,存放各种已编译的资源,使得一个设计的子模块可以被另一设计引用,达到资源共享的目的。
4)VHDL是标准化硬件描述语言,屏蔽了具体工艺及器件的差异,不会因工艺及器件的变化而变化。
嵋f同时由于VHDL是国际标准,易于ASIC和EDA领域的国际交流。
VHDL作为先进的硬件描述语言,以其灵活、简洁的设计风格在电路设计中发挥着越来越重要的作用。
参考文献
[l]侯伯亨,顾新.VHDL硬件描述语言与数字逻辑电路设计.西安:
西安电子科技大学出版社,1997
[2]常青,陈辉煌.可变成专用集成电路及其应用与设计实践经验.北京:
国防工业出版社,1998
[3]张千里,陈光英.网络安全新技术[M].北京:
人民邮电出版社,2003
[4]李镇江,戴荚伙,陈越.IDs入侵检测系统研究.计算机工程[J].200l,27(4),7—9
[5]赵轩,王勇军等.基于状态检测的硬件防火墙实现技术研究,全国网络与信息安全技术研讨会,2004,296—300
程序清单:
LIBRARYieee;
USEieee.std_logic_1164.all;
USEieee.std_logic_unsigned.all;
ENTITYResponderis
PORT(A,B,C,D,test,INI,EN,clk:
instd_logic;
tih:
instd_logic_vector(5downto4);
til:
instd_logic_vector(3downto0);
bell:
outstd_logic;
timeh:
bufferstd_logic_vector(5downto4);
timel:
bufferstd_logic_vector(3downto0);
obcd:
outstd_logic_vector(2downto0));
endResponder;
ARCHITECTUREoneofResponderis
signalG:
std_logic_vector(3downto0);
signalR:
std_logic;
signalclk1:
std_logic;
signalsel,outc:
std_logic;
signaltah:
std_logic_vector(5downto4);
signaltal:
std_logic_vector(3downto0);
begin
LOCK:
PROCESS(A,B,C,D,INI,CLK)
--"描述LOCK模块的进程"
begin
if(INI='1')thenR<='0';G<="0000";
elsifrising_edge(clk)then
if(A='1'ORG(3)='1')ANDNOT(G(0)='1'ORG
(1)='1'ORG
(2)='1')
THENG(3)<='1';
ENDIF;
IF(B='1'ORG
(2)='1')ANDNOT(G(0)='1'ORG(3)='1'ORG
(1)='1')
THENG
(2)<='1';
ENDIF;
if(C='1'ORG
(1)='1')ANDNOT(G(0)='1'ORG(3)='1'ORG
(2)='1')
THENG
(1)<='1';
ENDIF;
if(D='1'ORG(0)='1')ANDNOT(G
(1)='1'ORG(3)='1'ORG
(2)='1')
THENG(0)<='1';
ENDIF;
R<=AORBORCORD;
ENDIF;
ENDPROCESSLOCK;
CB:
PROCESS(CLK)
variableQ:
std_logic_vector(8downto0);
BEGIN
IF(CLK'EVENTANDCLK='1')THEN
IF(Q="111111111")THENQ:
="000000000";
ELSEQ:
=Q+1;
ENDIF;
ENDIF;
CLK1<=Q(8);
ENDPROCESSCB;
COUNT:
PROCESS(tih,til,test,timeh,timel,INI,EN,CLK1)
--"描述COUNT模块的进程"
BEGIN
IFrising_edge(CLK1)THEN
IF(TEST='1')THEN
tah<=tih;
tal<=til;
ENDIF;
IF(INI='1')THEN
TIMEH<=TIMEH;
TIMEL<=TIMEL;
ELSIF(TIMEH=0ANDTIMEL=0)THEN
TIMEH<=TIMEH;
TIMEL<=TIMEL;
ELSIF(TIMEL=0)THEN
TIMEL<="1001";
TIMEH<=TIMEH-1;
ELSE
TIMEL<=TIMEL-1;
TIMEH<=TIMEH;
ENDIF;
ENDIF;
ENDPROCESS;
OBCD<="001"WHENG="1000"ELSE
--"用并行语句描述"
"010"WHENG="0100"ELSE
--"DECODER模块"
"011"WHENG="0010"ELSE
"100"WHENG="0001"ELSE
"000";
bell<=((RANDsel)OROUTC)ANDCLK;
--"用并行语句描述BELL模块"
sel<='1'when(TIMEH=TAHANDTIMEL=TAL)ELSE'0';
OUTC<='1'WHEN((TIMEH=0)AND(TIMEL=0)AND(EN='0')AND(INI='0'))ELSE'0';
ENDONE;