本科生科技论文基于VHDL语言的八路数字抢答器设计.doc
题目:基于VHDL语言的八路数字抢答器设计【作者简介】班级: 班号: 姓名: 学号: 摘 要抢答器作为一种电子产品,早已广泛应用于各种智力和知识竞赛场合,是竞赛问答中一种常用的必备装置;从原理上讲,它是一种典型的数字电路,其中包括了组合逻辑电路和时序逻辑电路电路结构形式多种多样,可以利用简单的与非门构成,也可以利用触发器构成,也可以利用单片机来完成利用单片机来设计抢答器,使得结果更简单,功能更优越。本设计是基于单片机控制的六路抢答器,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。用开关做键盘输出,扬声器发生提示。同时系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;抢答限定时间和回答问题的时间可在1-99s设定;可以显示是哪位选手有效抢答和无效抢答,正确按键后有音乐提示;抢答时间和回答问题时间倒记时显示,满时后系统计时自动复位及主控强制复位;按键锁定,在有效状态下,按键无效非法。关键词抢答器;EDA;VHDL语言AbstractAnswer devices as an electronic products, has long been widely used in a variety of occasions, intelligence and knowledge competitions, quiz contests are essential in a commonly used device; from the principle, it is a typical digital circuit, including a combination of logic circuits and sequential logic circuit. Circuit structure of a variety of forms, can make use of simple and non-gate structure can also be used to trigger composition, can also be used to complete single-chip microcomputer. Answer the use of single-chip design, and makes the results more simple function better. The design is based on the six-way SCM Answer, and the use of single-chip timer / counter timing and number of the principles in mind, the hardware and software combine to make the system time correctly, while the digital control able to correctly display the time. Switch the keyboard to do with output, speaker prompted occurred. At the same time, the system can be realized: In the Answer, only after the Answer to be valid, if at the beginning of pre-Answer Answer invalid; Answer to answer the question of limited time and the time can be set in 1-99s; can show who's effective and Answer Answer invalid, the correct button prompt after the music; Answer question time and time倒记时show full time after the system automatically reset and master reset mandatory; keys locked in the effective state, the key is invalid illegal.Key words answer devices;EDA;VHDL language一、 设计原理与技术方法:(一) 整体简介 Max+plusII(或写成Maxplus2,或MP2) 是Altera公司推出的的第三代PLD开发系统(Altera第四代PLD开发系统被称为:QuartusII,主要用于设计新器件和大规模CPLD/FPGA).使用MAX+PLUSII的设计者不需精通器件内部的复杂结构。设计者可以用自己熟悉的设计工具(如原理图输入或硬件描述语言)建立设计,MAX+PLUSII把这些设计转自动换成最终所需的格式。其设计速度非常快。对于一般几千门的电路设计,使用MAX+PLUSII,从设计输入到器件编程完毕,用户拿到设计好的逻辑电路,大约只需几小时。设计处理一般在数分钟内内完成。特别是在原理图输入等方面,Maxplus2被公认为是最易使用,人机界面最友善的PLD开发软件,特别适合初学者使用。使用Maxplus2基本上也是有以下几个步骤:1.设计输入 2.设计编译 3.设计仿真 4.下载 抢答器的逻辑结构主要由抢答鉴别lock模块、定时模块、译码模块和报警器模块组成。在整个抢答器中最关键的是如何实现抢答封锁,在控制键按下的同时计数器倒计时显示有效剩余时间。除此之外,整个抢答器还需有一个“复位开始”信号,以便抢答器能实现清零和开始。抢答器共有3个输出显示,选手代号、计数器的个位和十位,他们输出全都为BCD码输出,这样便于和显示译码器连接。当主持人按下控制键、选手按下抢答键蜂鸣器短暂响起。整体原理框图如图1所示。图1整体原理框图 抢答器同时供8名选手或8个代表队比赛,分别用8个按钮a1a8。设置一个系统清除和抢答控制开关Reset, 该开关由主持人控制。抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,扬声器发出声响提示,数码显示选手号码。其他人再按键,系统进行了优先锁存,不再响应,优先抢答选手的编号一直保持到主持人将系统清除为止,下一次抢答开始。扩展功能:该电路具有犯规报警功能。当主持人未按下开关开始抢答前,参赛选手若按下开关,则抢答系统发出蜂鸣声报警并显示犯规组别。(二)抢答器工作流程 抢答器的基本工作原理:在抢答竞赛或呼叫时,有多个信号同时或不同时送入主电路中,抢答器内部的寄存器工作,并识别、记录第一个号码,同时内部的定时器开始工作,记录有关时间并产生超时信号。在整个抢答器工作过程中,显示电路、语音电路等还要根据现场的实际情况向外电路输出相应信号。抢答器的工作流程分为、系统复位、正常流程、犯规流程等几部分,如图2所示。加载程序运行行开始开始数码管显示30开始抢按时间倒计时开始前有选手抢按显示犯规选手号码并伴有语音报警倒计时结束,超时有选手抢按显示FFF显示选手号码,倒计时时间,语音报警,答题,答题时间倒计时正常流程犯规流程若超过答题时间,则数码管示00答题完根据选手表现由主持人加分图2抢答器工作流程(三)抢答器各部分电路1、 抢答器鉴别模块: 在这个模块中主要实现抢答过程中的抢答功能,并且能实现当有一路抢答按键按下时,该路抢答信号将其余个绿抢答封锁的功能。在这个模块输入端有WARN输入(以时间控制系统的WARN输出信号为信号源)、一个和“时间控制系统”公用的CLEAR端、6人抢答输入信号端S0,S1,S2,S3,S4,S5和有一个时钟信号端CLK,这个时钟信号是个高频信号,用以扫描S0,S1,S2,S3是否有信号输入。输出端有对应于S0,S1,S2,S3,S4,S5编号的6个指示灯LED 和4线2进制输出端STATES(用于锁存当前的状态),还有一个STOP 端用于指示S0,S1,S2,S3,S4,S5按钮状态(控制计时器停止)。在此模块中高频时钟信号一直作用,此时,若主持人按下CLEAR即为开始抢答信号,所有输出端都自动清零。在有效时间范围(N秒)内只要有人抢答,STOP就有高电平输出至“时间控制系统”的STOP端以控制倒计时的停止,并且对应的LED指示灯点亮,STATES锁存输出到译码显示模块,用以显示优先抢答人的组号,并锁定输入端S以阻止系统响应其他抢答者的信号。当有效时间到了之后还没有人抢答,则记时模块发出报警信号,同时反馈回来给抢答鉴别模块,禁止选手在抢答。2、译码模块: 将抢答过程中锁存的BCD码转换成7段码用于LED的显示。3、定时器模块: 这个模块的输入端有时钟信号CLK1、系统复位信号CLEAR和一个STOP输入信号;输出端有秒时间状态显示信号高位HIGH和低位LOW,无人抢答时计时中止警报信号WARN。 这个模块中主要实现抢答过程中的计时功能,在抢答开始后进行N秒的倒计时,并且在N秒倒计时后无人抢答的情况下显示超时并输出信号至WARN报警,或者只要N秒内有人抢答,由抢答鉴别模块输出的STOP信号控制停止计时,并显示优先抢答者的抢答时刻,输出一个信号经WARN传至“抢答鉴别系统”,锁存不再让选手抢答。4、报警模块:在这个模块中主要实现抢答过程中的报警功能,当主持人按下控制键,有限时间内(N秒内)有人抢答或是倒计时到了之后蜂鸣器开始报警,输出SOUND有效电平为高。若有选手提前抢答或者延后抢答同时报警。5、 显示模块:由于试验箱的限制,附加了显示电路的设计。6、 计分模块: 设置一个计分电路,每组开始设置100分,由主持人计分,答对一次加10分,答错一次减10分。(四)单元电路元件设计1、抢答器鉴别模块VHDL程序及模块:在这个模块中主要实现抢答过程中的抢答功能,并且能实现当有一路抢答按键按下时,该路抢答信号将其余个绿抢答封锁的功能。在这个模块输入端有WARN输入(以时间控制系统的WARN输出信号为信号源)、一个和“时间控制系统”公用的CLEAR端、6人抢答输入信号端S0,S1,S2,S3,S4,S5和有一个时钟信号端CLK,这个时钟信号是个高频信号,用以扫描S0,S1,S2,S3,S4,S5是否有信号输入。输出端有对应于S0,S1,S2,S3,S4,S5编号的6个指示灯LED 和4线2进制输出端STATES (用于锁存当前的状态),还有一个STOP 端用于指示S0,S1,S2,S3,S4,S5按钮状态(控制计时器停止)。生成模块如图3所示。 图3 LOCK模块图LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY LOCK IS PORT( CLK,CLEAR:IN STD_LOGIC; WARN:IN STD_LOGIC; S0,S1,S2,S3,S4,S5:IN STD_LOGIC; STATES:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); STOP:OUT STD_LOGIC; LED:OUT STD_LOGIC_VECTOR(5 DOWNTO 0);END LOCK;ARCHITECTURE ONE OF LOCK ISSIGNAL G:STD_LOGIC_VECTOR(5 DOWNTO 0);BEGIN PROCESS(CLEAR,CLK,S0,S1,S2,S3,S4,S5) BEGIN IF CLEAR='1' THEN G<="000000"LED<="000000"STOP<='0' ELSIF CLK'EVENT AND CLK='1' THEN IF WARN='0' THEN IF( S5='1')AND NOT(G(0)='1' OR G(1)='1' OR G(2)='1'OR G(3)='1' OR G(4)='1') THEN G(5)<='1'LED(5)<='1' ELSIF( S4='1')AND NOT(G(0)='1' OR G(1)='1' OR G(2)='1'OR G(3)='1' OR G(5)='1') THEN G(4)<='1'LED(4)<='1'ELSIF( S3='1')AND NOT(G(0)='1' OR G(1)='1' OR G(2)='1'OR G(4)='1' OR G(5)='1') THEN G(3)<='1'LED(3)<='1' ELSIF( S2='1')AND NOT(G(0)='1' OR G(1)='1' OR G(3)='1'OR G(4)='1' OR G(5)='1') THEN G(2)<='1'LED(2)<='1' ELSIF( S1='1')AND NOT(G(0)='1' OR G(2)='1' OR G(3)='1'OR G(4)='1' OR G(5)='1') THEN G(1)<='1'LED(1)<='1' ELSIF( S0='1')AND NOT(G(1)='1' OR G(2)='1' OR G(3)='1'OR G(4)='1' OR G(5)='1') THEN G(0)<='1'LED(0)<='1' END IF; STOP<=G(0) OR G(1) OR G(2) OR G(3) OR G(4) OR G(5); END IF; END IF;CASE G IS WHEN "000001"=>STATES<="0001" WHEN "000010"=>STATES<="0010" WHEN "000100"=>STATES<="0011" WHEN "001000"=>STATES<="0100" WHEN "010000"=>STATES<="0101" WHEN "100000"=>STATES<="0110" WHEN OTHERS=>STATES<="0000"END CASE;END PROCESS;END ARCHITECTURE ONE;2、译码模块VHDL程序及模块:将抢答过程中锁存的BCD码转换成7段码用于LED的显示。生成模块图如图4所示。图4 CODE 模块图LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CODE IS PORT(INSTATES: IN STD_LOGIC_VECTOR(3 DOWNTO 0); QOUT: OUT STD_LOGIC_VECTOR(6 DOWNTO 0);END CODE;ARCHITECTURE TWO OF CODE ISBEGIN PROCESS(INSTATES) BEGIN CASE INSTATES IS WHEN "0000"=>QOUT<="0111111" WHEN "0001"=>QOUT<="0000110" WHEN "0010"=>QOUT<="1011011" WHEN "0011"=>QOUT<="1001111" WHEN "0100"=>QOUT<="1100110" WHEN "0101"=>QOUT<="1101101" WHEN "0110"=>QOUT<="1111101" WHEN "0111"=>QOUT<="0000111" WHEN "1000"=>QOUT<="1111111" WHEN "1001"=>QOUT<="1101111" WHEN OTHERS=>QOUT<="0000000" END CASE; END PROCESS;END ARCHITECTURE TWO;3.定时模块VHDL程序及模块:这个模块的输入端有时钟信号CLK、系统复位信号CLEAR和一个STOP输入信号;输出端有秒时间状态显示信号高位HIGH和低位LOW,无人抢答时计时中止警报信号WARN。这个模块中主要实现抢答过程中的计时功能,在抢答开始后进行N秒的倒计时,并且在N秒倒计时后无人抢答的情况下显示超时并输出信号至WARN报警,或者只要N秒内有人抢答,由抢答鉴别模块输出的STOP信号控制停止计时,并显示优先抢答者的抢答时刻,输出一个信号经WARN传至“抢答鉴别系统”,锁存不再让选手抢答。生成的模块图如图5所示。 图5 COUNT 模块图LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNT IS PORT(CLK,CLEAR,STOP:IN STD_LOGIC; WARN:OUT STD_LOGIC; HIGH,LOW:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END COUNT;ARCHITECTURE THREE OF COUNT ISSIGNAL HS:STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL LS:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(CLK) BEGIN IF CLEAR='1' THEN HS<="1001"LS<="1001"WARN<='0' ELSIF CLK'EVENT AND CLK='1' THEN LS<=LS-1; IF LS="0000" THEN LS<="1001"HS<=HS-1; IF HS="0000" AND LS="0000" THEN WARN<='1'HS<="0000"LS<="0000" IF STOP='1' THEN HS<=HS; LS<=LS; WARN<='1' END IF; END IF; END IF; END IF; HIGH<=HS;LOW<=LS;END PROCESS;END ARCHITECTURE THREE; 4报警模块VHDL:在这个模块中主要实现抢答过程中的报警功能,当主持人按下控制键,有限时间内(N秒内)有人抢答或是倒计时到了之后蜂鸣器开始报警,输出SOUND有效电平为高。生成的模块图如图6所示。图6 ALARM 模块图LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY ALARM IS PORT(CLEAR,WARN:IN STD_LOGIC; SOUND:OUT STD_LOGIC);END ;ARCHITECTURE FOUR OF ALARM ISBEGIN PROCESS(WARN,CLEAR) BEGIN IF CLEAR='1' THEN SOUND<='0' ELSIF WARN='1' THEN SOUND<='1' ELSE SOUND<='0' END IF;END PROCESS;END ALARM;具有犯规设置电路对提前抢答和超时抢答者,则报警并显示组别。生成的模块图如图7所示。图7 FOUL 模块图LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY FOUL IS PORT( CLEAR:IN STD_LOGIC; S0,S1,S2,S3,S4,S5:IN STD_LOGIC; lede:OUT STD_LOGIC_VECTOR(5 DOWNTO 0); warns:OUT STD_LOGIC);END foul;ARCHITECTURE ONE OF foul IS begin PROCESS(CLEAR,S0,S1,S2,S3,S4,S5)BEGINIF CLEAR='1'THEN IF S5='1' THEN lede(5)<='1'warns<='1' ELSIF S4='1'THEN lede(4)<='1'warns<='1' ELSIF S3='1'THEN lede(3)<='1'warns<='1' ELSIF S2='1' THEN lede(2)<='1'warns<='1' ELSIF S1='1' THEN lede(1)<='1'warns<='1' ELSIF S0='1' THEN lede(0)<='1'warns<='1' ELSE LEDe<="000000"warns<='0'END IF;END IF;end process;END ONE; 5、 显示模块设计: 由于试验箱的限制,附加了动态显示模块。模块图如图8所示。 图8 动态显示模块图LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY mux18 ISPORT(aa0,aa1,aa2:IN STD_LOGIC_VECTOR(3 DOWNTO 0); bb0,bb1,bb2:IN STD_LOGIC_VECTOR(3 DOWNTO 0); cc0,cc1,cc2:IN STD_LOGIC_VECTOR(3 DOWNTO 0); dd0,dd1,dd2:IN STD_LOGIC_VECTOR(3 DOWNTO 0); ee0,ee1,ee2:IN STD_LOGIC_VECTOR(3 DOWNTO 0); ff0,ff1,ff2:IN STD_LOGIC_VECTOR(3 DOWNTO 0); xx0,xx1,xx2:IN STD_LOGIC_VECTOR(3 DOWNTO 0); choice:STD_LOGIC_VECTOR(5 DOWNTO 0); g,h,i:IN STD_LOGIC; yyy:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END mux18;ARCHITECTURE rt1 OF mux18 ISSIGNAL sel:STD_LOGIC_VECTOR(2 DOWNTO 0);BEGINsel<=i&h&g;PROCESS(sel,choice)BEGINIF(choice="000001")THEN IF(sel="000")THEN yyy<=aa0; ELSIF(sel="001")THEN yyy<=aa1; ELSIF(sel="010")THEN yyy<=aa2; END IF;ELSIF(choice="000010")THEN IF(sel="000")THEN yyy<=bb0; ELSIF(sel="001")THEN yyy<=bb1; ELSIF(sel="010")THEN yyy<=bb2; END IF;ELSIF(choice="000100")THEN IF(sel="000")THEN yyy<=cc0; ELSIF(sel="001")THEN yyy<=cc1; ELSIF(sel="010")THEN yyy<=cc2; END IF;ELSIF(choice="001000")THEN IF(sel="000")THEN yyy<=dd0; ELSIF(sel="001")THEN yyy<=dd1; ELSIF(sel="010")THEN yyy<=dd2; END IF;ELSIF(choice="010000")THEN IF(sel="000")THEN yyy<=ee0; ELSIF(sel="001")THEN yyy<=ee1; ELSIF(sel="010")THEN yyy<=ee2; END IF;ELSIF(choice="100000")THEN IF(sel="000")THEN yyy<=ff0; ELSIF(sel="001")THEN yyy<=ff1; ELSIF(sel="010")THEN yyy<=ff2; END IF;END IF;IF(sel="011")THEN yyy<=xx0;ELSIF(sel="100")THEN yyy<=xx1;ELSIF(sel="101")THEN yyy<=xx2;END IF;END PROCESS;END rt1;6、计分模块: 设置一个计分电路,每组开始设置100分,由主持人计分,答对一次加10分,答错一次减10分。模块如图9所示。 图9计分模块图LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY score IS PORT( clr,sub,add,clk:IN STD_LOGIC; choose:IN STD_LOGIC_VECTOR(5 DOWNTO 0); aa0,aa1,aa2,bb0,bb1,bb2,cc0,cc1,cc2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); dd0,dd1,dd2,ee0,ee1,ee2,ff0,ff1,ff2:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END score;ARCHITECTURE rt1 OF score ISBEGINPROCESS(choose,clk,add,sub)VARIABLE a1,a2:STD_LOGIC_VECTOR(3 DOWNTO 0);VARIABLE b1,b2:STD_LOGIC_VECTOR(3 DOWNTO 0);VARIABLE c1,c2:STD_LOGIC_VECTOR(3 DOWNTO 0);VARIABLE d1,d2:STD_LOGIC_VECTOR(3 DOWNTO 0);VARIABLE e1,e2:STD_LOGIC_VECTOR(3 DOWNTO 0);VARIABLE f1,f2:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINIF(clr='1')THEN a2:="0001"a1:="0000" -置100 b2:="0001"b1:="0000" c2:="0001"c1:="0000" d2:="0001"d1:="0000" e2:="0001"e1:="0000" f2:="0001"f1:="0000"ELSIF(clk'EVENT AND clk='1')THEN IF(add='1')THEN IF(choose="000001")THEN IF(a1="1001")THEN a1:="0000" IF(a2="1001")THEN a2:="0000" ELSE a2:=a2+'1' END IF; ELSE a1:=a1+'1' END IF; ELSIF(choose="000010")THEN IF(b1="1001")THEN b1:="0000" IF(b2="1001")THEN b2:="0000" ELSE b2:=b2+'1' END IF; ELSE b1:=b1+'1' END IF; ELSIF(choose="000100")THEN IF(c1="1001")THEN c1:="0000" IF(c2="1001")THEN c2:="0000" ELSE c2:=c2+'1' END IF; ELSE c1:=c1+'1' END IF; ELSIF(choose="001000")THEN IF(d1="1001")THEN d1:="0000" IF(d2="1001")THEN d2:="0000" ELSE d2:=d2+'1' END IF; ELSE d1:=d1+'1' END IF; ELSIF(choose="010000")THEN IF(e1="1001")THEN e1:="0000" IF(e2="1001")THEN e2:="0000" ELSE e2:=e2+'1' END IF; ELSE e1:=e1+'1' END IF; ELSIF(choose="100000")THEN IF(f1="1001")THEN f1:="0000" IF(f2="1001")THEN f2:="0000" ELSE f2:=f2+'1' END IF; ELSE f1:=f1+'1' END IF; END IF; ELSIF(sub='1')THEN IF(choose="000001")THEN IF(a1="0000")THEN IF(a2="0000")THEN a1:="0000" a2:="0000" ELSE a1:="1001" a2:=a2-'1' END IF; ELSE a1:=a1-'1' END IF; ELSIF(choose="000010")THEN IF(b1="0000")THEN IF(b2="0000")THEN b1:="0000" b2:="0000" ELSE b1:="1001" b2:=b2-'1' END IF; ELSE b1:=b1-'1' END IF; ELSIF(choose="000100")THEN IF(c1="0000")THEN IF(c2="0000")THEN c1:="0000" c2:="0000" ELSE c1:="1001" c2:=c2-'1' END IF; ELSE c1:=c1-'1' END IF; ELSIF(choose="001000")THEN IF(d1="0000")THEN IF(d2="0000")THEN d1:="0000" d2:="0000" ELSE d1:="1001" d2:=d2-'1' END IF; ELSE d1:=d1-'1' END IF; ELSIF(choose="010000")THEN IF(e1="0000")THEN IF(e2="0000")THEN e1:="0000" e2:="0000" ELSE e1:="1001" e2:=e2-'1'