目录一、总体思路............................................................................................1二、各级模块设计....................................................................................21、抢答启动模块................................................................................22、选手抢答模块................................................................................73、加减分模块..................................................................................114、显示模块......................................................................................175、蜂鸣器..........................................................................................19三、调试步骤..........................................................................................21四、总结与体会......................................................................................23五、原理图..............................................................................................23六、参考文献..........................................................................................251一、总体思路CPLD为复杂可编程逻辑器件,通过EDA技术对其进行编程,可将一个较复杂的数字系统集成于一个芯片中,制成专用集成电路芯片,并可随时在系统修改其逻辑功能。智力竞赛抢答器,分为5个模块:选手抢答模块、抢答启动模块、加减分模块、显示模块、蜂鸣器控制模块。图(一)总体框图抢答启动模块包括:复位和记时,用于启动抢答和启动定时。输出信号给选手识别模块,并显示剩余时间。选手抢答模块具有识别与锁存功能,并输出选手号给显示模块。加减分模块用于存选手抢答模块显示模块(抢答剩余时间、抢答选手号、选手得分)选手得分)加减分模块抢答启动模块蜂鸣器控制模块2储各个选手的分数,并输出给显示模块。蜂鸣器控制模块则对超时和抢答成功鸣声报警。显示模块用于输出抢答剩余时间、抢答模块、选手得分。二、各级模块设计1、抢答启动模块抢答启动模块由控制抢答启动的复位键和控制定时的两个定时启动键。定时时间为5秒和20秒两种,分别由两个键控制。主持人按下复位键启动抢答,并完成置数。定时启动键则在置数信号有效的情况下,读入定时初值,进行减1操作,开始倒计时。CLK1CLK2L_CRRSTSTART5START20TIMEB[3..0]TIMEA[3..0]TIMEOUTSR1STARTERinst2本模块程序:抢答启动LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYSTART_5_20IS3PORT(CLK1,RST,START5,START20:INSTD_LOGIC;B,A:OUTSTD_LOGIC_VECTOR(3DOWNTO0);--输出定时初值S_FLAG:OUTSTD_LOGIC);--置数信号ENDENTITY;ARCHITECTUREONEOFSTART_5_20ISSIGNALDATAIN:STD_LOGIC_VECTOR(1DOWNTO0);TYPEST_TYPEIS(ST0,ST1,ST2);--定义状态SIGNALC_ST:ST_TYPE;BEGINDATAIN=START5&START20;--两个输入信号放在一起判断PROCESS(RST,CLK1)BEGINIFRST='0'THEN--复位B=0000;A=0000;C_ST=ST0;S_FLAG='0';ELSIFCLK1'EVENTANDCLK1='1'THENCASEC_STISWHENST0=IFDATAIN=01THENC_ST=ST1;--输入信号为01,转ST1状态S_FLAG='1';--置数信号有效B=0000;A=0101;--定时初值“05”ELSIFDATAIN=10THENC_ST=ST2;--输入信号为10,转ST1状态S_FLAG='1';--置数信号有效B=0010;A=0000;--定时初值“20”ELSEC_ST=ST0;--输入信号为11,保持ST0状态ENDIF;WHENST1=IFDATAIN=11THENC_ST=ST0;--防按键抖动,为11时才转ST0状态S_FLAG='0';--置数信号无效ELSEC_ST=ST1;--按键没弹起,继续等待ENDIF;WHENST2=IFDATAIN=11THENC_ST=ST0;S_FLAG='0';ELSEC_ST=ST2;ENDIF;WHENOTHERS=C_ST=ST0;B=0000;A=0000;ENDCASE;ENDIF;ENDPROCESS;4ENDARCHITECTURE;定时控制LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYDE_COUNTISPORT(CLK2,LOAD,L_CR,RST:INSTD_LOGIC;B,A:INSTD_LOGIC_VECTOR(3DOWNTO0);TIMEB,TIMEA:OUTSTD_LOGIC_VECTOR(3DOWNTO0);TIMEOUT,SR1:OUTSTD_LOGIC);ENDENTITY;ARCHITECTURETWOOFDE_COUNTISBEGINPROCESS(LOAD,L_CR,RST,CLK2)VARIABLEP1,P0:STD_LOGIC_VECTOR(3DOWNTO0);BEGINIFLOAD='1'THENP1:=B;P0:=A;--指数信号有效,将B、A值读入P1、P0ELSIFL_CR='0'THEN--有选手抢答成功,L_CR输入为0,定时时间清0P1:=0000;P0:=0000;TIMEOUT='0';SR1='1';ELSIFRST='0'THENP1:=0000;P0:=0000;TIMEOUT='0';SR1='0';ELSIF(CLK2'EVENTANDCLK2='1')THENIFP0=0000THENIFP10THENP1:=P1-1;P0:=1001;--若个位为0,十位减1,个位赋为9ENDIF;ELSEP0:=P0-1;--若个位不为0,个位直接减一IFP0=0000ANDP1=0000THENTIMEOUT='0';SR1='1';--若时间到,输出锁存信号ENDIF;ENDIF;ENDIF;TIMEB=P1;TIMEA=P0;ENDPROCESS;ENDARCHITECTURE;5实现两个子模块组合LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYDE_COUNTISPORT(CLK2,LOAD,L_CR,RST:INSTD_LOGIC;B,A:INSTD_LOGIC_VECTOR(3DOWNTO0);TIMEB,TIMEA:OUTSTD_LOGIC_VECTOR(3DOWNTO0);TIMEOUT,SR1:OUTSTD_LOGIC);ENDENTITY;ARCHITECTURETWOOFDE_COUNTISBEGINPROCESS(LOAD,L_CR,RST,CLK2)VARIABLEP1,P0:STD_LOGIC_VECTOR(3DOWNTO0);BEGINIFLOAD='1'THENP1:=B;P0:=A;--指数信号有效,将B、A值读入P1、P0ELSIFL_CR='0'THEN--有选手抢答成功,L_CR输入为0,定时时间清0P1:=0000;P0:=0000;TIMEOUT='0';SR1='1';ELSIFRST='0'THENP1:=0000;P0:=0000;TIMEOUT='0';SR1='0';ELSIF(CLK2'EVENTANDCLK2='1')THENIFP0=0000THENIFP10THENP1:=P1-1;P0:=1001;--若个位为0,十位减1,个位赋为9ENDIF;ELSEP0:=P0-1;--若个位不为0,个位直接减一IFP0=0000ANDP1=0000THENTIMEOUT='0';SR1='1';--若时间到,输出锁存信号ENDIF;ENDIF;ENDIF;TIMEB=P1;TIMEA=P0;ENDPROCESS;ENDARCHITECTURE;6抢答启动子模块仿真如下:图(二)抢答定时子模块仿真如下:图(三)7整个模块仿真如下图:图(四)2、选手抢答模块选手有8名,在一个结构体中用8个进程同时对8个选手按键电平变化的监测是不可实现的,因为若出现检测上升沿或下降沿的语句,编译软件会认为所检测的信号为实体的时钟信号,而一个实体只允许用一个时钟信号控制。故可将本模块分为两部分:单个选手按键和判断抢答。将8位选手按键模块和判断选手连接起来得到整个选手抢答模块。8P1P2P3P4P5P6P7P8RSTLOCKP_NUM[3..0]LOCK_SSR1BUTTONinst4本模块程序如下:单个选手按键模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;ENTITYBUTTON1ISPORT(LOCK,BUTTON,RST:INSTD_LOGIC;PRESSED:OUTSTD_LOGIC);ENDENTITY;ARCHITECTUREB1OFBUTTON1ISBEGINPROCESS(RST,BUTTON)--使用进程时刻监测RST、BUTTON信号BEGINIFRST='0'THENPRESSED='0';--复位ELSIFBUTTON'EVENTANDBUTTON='0'THENIFLOCK='1'THEN--键被按下并且LOCK信号无效PRESSED='1';--则输出信号给判断模块ENDIF;ENDIF;ENDPROCESS;ENDARCHITECTURE;判断选手模块LIBRARYIEEE;9USEIEEE.STD_LOGIC_1164.ALL;ENTITYIDENTIFIERISPORT(PP1,PP2,PP3,PP4,PP5,PP6,PP7,PP8:INSTD_LOGIC;P_NUM:OUTSTD_LOGIC_VECTOR(3DOWNTO0);LOCK,SR1:OUTSTD_LOGIC);ENDENTITY;ARCHITECTUREONEOFIDENTIFIERISSIGNALP:STD_LOGIC_VECTOR(7DOWNTO0);BEGINP=P