抢答计时器设计摘要:利用FPGA芯片集成设计方法及VHDL语言,设计一个有八位选手的抢答计时器,该抢答器的开始和清零由一名主持人控制。1实验目的利用VHDL语言、ISE软件和Xilinx公司的Spartan系列FPGA实验板,完成智力抢答器的设计。使学生掌握现代设计工具、手段和方法的应用技能。2试验任务与要求2.1基本功能(1)编号1~8的选手在规定时间内按键抢答。(2)抢中编号锁定显示,其他无效。(3)主持按键控制清零和开始。(4)具有报警提示功能,分别提示抢答开始,有人抢答,定时时间到。2.2指标要求(1)显示数组:1~8。(2)报警延时:300ms。(3)抢答时间:15s。3实验原理、设计思路与方案3.1工作原理抢答信号输入系统后,系统必须对最先抢到的选手进行编码,而后锁存这个编码,并将这个编码显示输出,所以要用到编码器、锁存器和译码显示电路。而选手抢答的有效时间为20s,而且系统在有人抢中、主持人按下开关以及20s计时到但无人抢答这三种情况下要发出警报,且报警时间延迟300ms后自动停止,故需定时电路来确定这些时限,并用时序控制电路来协调各个部分的工作,计时时间也要显示出来。3.2设计方案系统由编码锁存器、定时器、七段译码器、扫描显示器、报警器五部分组成。系统原理图4单元模块设计与仿真4.1编码锁存电路4.1.1【模块功能】当主持人启动开始抢答的按键,开始倒计时,同时时钟信号上升沿持续扫描4个选手的按键端口。当定时时间未到,若有选手抢答时,则对选手按键进行编码,并锁存该号码将其输出,其他选手按键无效,同时输出抢中控制信号给警报器和定时器。4.1.2【源程序】libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitybmscisport(clk:instd_logic;start:instd_logic;--start/clearxs:instd_logic_vector(7downto0);--选手按键sjd:instd_logic;--时间到信号qz:outstd_logic;--抢中信号s:outstd_logic_vector(3downto0));--抢中选手的号码endbmsc;architectureBehavioralofbmscissignalq_z:std_logic;signalen:std_logic:='0';signalq:std_logic_vector(3downto0):=0000;begin-------------------------开始/清零状态检测----------------------state:process(start)beginifstart'eventandstart='0'thenen=noten;endif;endprocess;-------------------------------------------------------------------------------------检测及锁存抢中选手的号码----------------bm_sc:process(clk,en,sjd,xs)beginifclk'eventandclk='1'thenifen='1'andsjd='1'thenifq_z='1'thencasexsiswhen11111110=q=0001;q_z='0';when11111101=q=0010;q_z='0';when11111011=q=0011;q_z='0';when11110111=q=0100;q_z='0';when11101111=q=0101;q_z='0';when11011111=q=0110;q_z='0';when10111111=q=0111;q_z='0';when01111111=q=1000;q_z='0';whenothers=q=0000;endcase;endif;elseq=0000;q_z='1';endif;endif;endprocess;--------------------------------------------------------------s=q;qz=q_z;endBehavioral;4.1.3【仿真程序】LIBRARYieee;USEieee.std_logic_1164.ALL;USEieee.std_logic_unsigned.all;USEieee.numeric_std.ALL;ENTITYbmsc_test_vhdISENDbmsc_test_vhd;ARCHITECTUREbehaviorOFbmsc_test_vhdISconstantclk_period:time:=10ns;--clockperiod--ComponentDeclarationfortheUnitUnderTest(UUT)COMPONENTbmscPORT(clk:INstd_logic;start:INstd_logic;xs:INstd_logic_vector(7downto0);sjd:INstd_logic;qz:OUTstd_logic;s:OUTstd_logic_vector(3downto0));ENDCOMPONENT;--InputsSIGNALclk:std_logic:='0';SIGNALstart:std_logic:='0';SIGNALsjd:std_logic:='0';SIGNALxs:std_logic_vector(7downto0):=(others='0');--OutputsSIGNALqz:std_logic;SIGNALs:std_logic_vector(3downto0);BEGIN--InstantiatetheUnitUnderTest(UUT)uut:bmscPORTMAP(clk=clk,start=start,xs=xs,sjd=sjd,qz=qz,s=s);--------------------------激励信号--------------------------clk_process:processbeginclk='0';waitforclk_period/2;clk='1';waitforclk_period/2;endprocess;stim_proc:processbeginstart='1';xs=11111111;sjd='1';waitfor50ns;start='0';waitfor100ns;start='1';waitfor200ns;xs=11111011;waitfor300ns;xs=11011111;waitfor300ns;start='0';waitfor100ns;start='1';xs=11111111;waitfor500ns;start='0';waitfor100ns;start='1';waitfor200ns;sjd='0';waitfor200ns;xs=01111111;waitfor300ns;endprocess;---------------------------------------------------------------end;4.1.4【仿真结果】4.1.5【仿真结果分析】Sjd=‘1’且start偶数次为‘0’时,若qz=‘1’,则记录xs的值,并输出对应的s值。4.2抢答定时电路4.2.1【模块功能】实现15s的定时功能。主持人按下开始键之后开始计时。若计时过程中有选手抢答,计时器停止计时,若没有人按下则计满时间后停止计时。4.2.2【源程序】libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entityqd_dsqisport(clk:instd_logic;qz:instd_logic;start:instd_logic;sjd:outstd_logic;t10:outstd_logic_vector(3downto0);t0:outstd_logic_vector(3downto0));endqd_dsq;architectureBehavioralofqd_dsqissignalcnt:integerrange1to24000000:=1;signalclk_1hz:std_logic:='1';signalen:std_logic:='0';signalm10,m0:std_logic_vector(3downto0);begin-----------------------分频:产生1hzclk-----------------fp:process(clk)isbeginifclk'eventandclk='1'thenifcnt=24000000thencnt=1;clk_1hz=notclk_1hz;elsecnt=cnt+1;endif;endif;endprocess;---------------------------------------------------------------------------------------开始/清零状态检测--------------------state:process(start)beginifstart'eventandstart='0'thenen=noten;endif;endprocess;-------------------------------------------------------------------------------------------计时器---------------------------jsq:process(en,qz,clk_1hz)isbeginifen='0'thenm10=0001;m0=0101;sjd='1';elsifclk_1hz'eventandclk_1hz='1'thenifqz='1'thenifm10=0andm0=0thenm10=0000;m0=0000;sjd='0';elseifm0=0andm10/=0thenm0=1001;m10=m10-1;elsem0=m0-1;endif;endif;endif;endif;endprocess;------------------------------------------------------------t0=m0;t10=m10;endBehavioral;4.2.3【仿真程序】LIBRARYieee;USEieee.std_logic_1164.ALL;USEieee.std_logic_unsigned.all;USEieee.numeric_std.ALL;ENTITYqd_dsp_test_vhdISENDqd_dsp_test_vhd;ARCHITECTUREbehaviorOFqd_dsp_test_vhdISconstantclk_period:time:=10ns;--ComponentDeclarationfortheUnitUnderTest(UUT)COMPONENTqd_dsqPORT(clk:INstd_logic;qz:INstd_logic;start:INstd_logic;sjd:OUTstd_logic;t10:OUTstd_logic_vector(3downto0);t0:OUTstd_logic_v