数电课程设计报告抢答器.docx
《数电课程设计报告抢答器.docx》由会员分享,可在线阅读,更多相关《数电课程设计报告抢答器.docx(49页珍藏版)》请在冰豆网上搜索。
![数电课程设计报告抢答器.docx](https://file1.bdocx.com/fileroot1/2023-4/17/29f31fd8-5d2e-4a66-b7f6-9d9b285a65bf/29f31fd8-5d2e-4a66-b7f6-9d9b285a65bf1.gif)
数电课程设计报告抢答器
湖南大学电气与信息工程学院
本科生课程设计
题 目:
抢答器
课 程:
数电课程设计
专 业:
电气工程及其自动化
班 级:
学 号:
姓 名:
指导 老师:
设计 时间:
2012年6月
一、设计任务……………………………………………………………2
二、原理框图……………………………………………………………2
三、液晶显示器及相关按键……………………………………………4
四、设计的逻辑结构及基本逻辑源程序………………………………5
五、思考题………………………………………………………………34
六、心得体会……………………………………………………………34
一、设计任务
基本要求:
1、设计制作一个可容纳8个组参赛的抢答器,每组控制一个抢答开关。
2、设置主持人控制键:
J0控制整个系统清零,J1用于发布抢答开始命令。
3、系统具有第一抢答信号鉴别和锁存功能
4、系统以三种方式指示第一抢答者:
第一是点亮对应组的发光二极管;第二是液晶屏显示组别;第三是第一抢答者产生时,扬声器以“嘀嘟”双频音响。
附加功能:
1、系统具有提前抢答的犯规记录功能,扬声器发出特殊的高频音响。
同时,组别显示数码管和LED指示灯都指示出该犯规组别。
2、设计积分电路。
3、限时抢答。
二、原理框图
三、液晶显示器及相关按键
1、液晶显示示意图
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
3
0
0
2、开关示意图
1
2
3
4
5
6
7
8
8:
START使能为高电平时抢答有效,有抢答则为正确输出,否则为错误输出
7:
RST清零重新开始一道题目时的清零,为高电平时清零,正常工作时为低电平
1:
RST1分数清零为高电平时将分数清零,正常工作时为低电平
键盘示意图
3、键盘示意图
1
2
3
4
5
6
7
8
ADD
SUB
1-8号键:
选手抢答按键
ADD:
加计分
SUB:
减计分
四、设计的逻辑结构及基本逻辑源程序
1、主抢答器模块
包括LOCK模块、Vfangui模块和计时模块。
思路:
WARN为高电平表示计时时间到,START由开关控制,由低电平变为高电平时计时开始,为高电平时抢答有效。
RST由开关控制,为高电平时清零,正常工作时应置为低电平。
CLK为工作时钟,频率为10MHZ。
工作时先将模块清零,则JS、G1、G2输出都为低电平,计时时间初始化,这里设置为30s。
再将START置为高电平,JS变为高电平,开始计时,在计时结束之前WARN为低电平,此时若有人抢答,抢答有效且为正常抢答,LOCK模块有输出,G1相应的位变为高电平,且JS变为低电平,计时停止。
LOCK模块有输出的必要条件是START为高电平且WARN为低电平。
犯规抢答的情况:
计时还没开始,即清零后START为低电平时抢答视为犯规,或者计时已经结束,即WARN由低电平变为高电平后抢答视为犯规。
这两种情况Vfangui模块有输出,G2相应的位变为高电平。
Vfangui模块有输出的必要条件是START为低电平或者WARN为高电平。
特别强调:
对于每一道抢答题,无论是正常抢答或者是犯规抢答,都只能记录一组,即只针对第一组抢答的选手,后面再次抢答无效,则需在VHDL程序中加入锁定的功能,对于如何实现,详见下面的程序。
LOCK模块(正常抢答):
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYLOCKIS
PORT(clk,CLEAR,START,WARN:
INSTD_LOGIC;
S:
INSTD_LOGIC_VECTOR(7DOWNTO0);
G:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
JS:
OUTSTD_LOGIC);
ENDLOCK;
ARCHITECTUREONEOFLOCKIS
signala:
STD_LOGIC;
BEGIN
PROCESS(CLEAR,START,S,WARN,clk)
BEGIN
if(clk'eventandclk='1')then
IFCLEAR='1'THENG<="00000000";JS<='0';a<='0';
ELSIFSTART='1'THEN
JS<='1';
IFWARN='0'THEN
IF(S(7)='1'ANDs(0)='0'ANDs
(1)='0'ANDs
(2)='0'ANDs(3)='0'ANDs(4)='0'ANDs(5)='0'ANDs(6)='0'anda='0')THEN
G<="10000000";a<='1';
ELSIF(S(6)='1'ANDS(0)='0'ANDS
(1)='0'ANDS
(2)='0'ANDS(3)='0'ANDS(4)='0'ANDS(5)='0'ANDS(7)='0'anda='0')THEN
G<="01000000";a<='1';
ELSIF(S(5)='1'ANDS(0)='0'ANDS
(1)='0'ANDS
(2)='0'ANDS(3)='0'ANDS(4)='0'ANDS(6)='0'ANDS(7)='0'anda='0')THEN
G<="00100000";a<='1';
ELSIF(S(4)='1'ANDS(0)='0'ANDS
(1)='0'ANDS
(2)='0'ANDS(3)='0'ANDS(7)='0'ANDS(5)='0'ANDS(6)='0'anda='0')THEN
G<="00010000";a<='1';
ELSIF(S(3)='1'ANDS(0)='0'ANDS
(1)='0'ANDS
(2)='0'ANDS(7)='0'ANDS(4)='0'ANDS(5)='0'ANDS(6)='0'anda='0')THEN
G<="00001000";a<='1';
ELSIF(S
(2)='1'ANDS(0)='0'ANDS
(1)='0'ANDS(7)='0'ANDS(3)='0'ANDS(4)='0'ANDS(5)='0'ANDS(6)='0'anda='0')THEN
G<="00000100";a<='1';
ELSIF(S
(1)='1'ANDS(0)='0'ANDS(7)='0'ANDS
(2)='0'ANDS(3)='0'ANDS(4)='0'ANDS(5)='0'ANDS(6)='0'anda='0')THEN
G<="00000010";a<='1';
ELSIF(S(0)='1'ANDS(7)='0'ANDS
(1)='0'ANDS
(2)='0'ANDS(3)='0'ANDS(4)='0'ANDS(5)='0'ANDs(6)='0'anda='0')THEN
G<="00000001";a<='1';
ENDIF;
JS<=NOTa;
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
ENDONE;
注:
通过变量a实现锁定功能。
(省略激励)
分析:
清零后输出都为0,在CLEAR为低电平,START为高电平时,JS变为1,开始计时,1号选手抢答后,输出G的最低位变为1,JS变为0,停止计时,此时再有选手抢答,输出不改变,实现了锁定功能。
Vfangui模块(犯规抢答)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
ENTITYFANIS
PORT(clk,START,WARN,CLEAR:
INSTD_LOGIC;
P:
INSTD_LOGIC_VECTOR(7DOWNTO0);
G:
OUTSTD_LOGIC_VECTOR(7DOWNTO0));
ENDFAN;
ARCHITECTURESEVENOFFANIS
--SIGNALGS:
STD_LOGIC_VECTOR(7DOWNTO0);
signala:
STD_LOGIC;
BEGIN
PROCESS(START,P,clk,CLEAR)
BEGIN
if(clk'eventandclk='1')then
IFCLEAR='1'THENG<="00000000";a<='0';
ELSIFSTART='0'ORWARN='1'THEN
IF(P(7)='1'ANDP(0)='0'ANDP
(1)='0'ANDP
(2)='0'ANDP(3)='0'ANDP(4)='0'ANDP(5)='0'ANDP(6)='0'anda='0')THEN
G<="10000000";a<='1';
ELSIF(P(6)='1'ANDP(0)='0'ANDP
(1)='0'ANDP
(2)='0'ANDP(3)='0'ANDP(4)='0'ANDP(5)='0'ANDP(7)='0'anda='0')THEN
G<="01000000";a<='1';
ELSIF(P(5)='1'ANDP(0)='0'ANDP
(1)='0'ANDP
(2)='0'ANDP(3)='0'ANDP(4)='0'ANDP(6)='0'ANDP(7)='0'anda='0')THEN
G<="00100000";a<='1';
ELSIF(P(4)='1'ANDP(0)='0'ANDP
(1)='0'ANDP
(2)='0'ANDP(3)='0'ANDP(7)='0'ANDP(5)='0'ANDP(6)='0'anda='0')THEN
G<="00010000";a<='1';
ELSIF(P(3)='1'ANDP(0)='0'ANDP
(1)='0'ANDP
(2)='0'ANDP(7)='0'ANDP(4)='0'ANDP(5)='0'ANDP(6)='0'anda='0')THEN
G<="00001000";a<='1';
ELSIF(P
(2)='1'ANDP(0)='0'ANDP
(1)='0'ANDP(7)='0'ANDP(3)='0'ANDP(4)='0'ANDP(5)='0'ANDP(6)='0'anda='0')THEN
G<="00000100";a<='1';
ELSIF(P
(1)='1'ANDP(0)='0'ANDP(7)='0'ANDP
(2)='0'ANDP(3)='0'ANDP(4)='0'ANDP(5)='0'ANDP(6)='0'anda='0')THEN
G<="00000010";a<='1';
ELSIF(P(0)='1'ANDP(7)='0'ANDP
(1)='0'ANDP
(2)='0'ANDP(3)='0'ANDP(4)='0'ANDP(5)='0'ANDP(6)='0'anda='0')THEN
G<="00000001";a<='1';
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
ENDSEVEN;
分析:
当START为0(计时没有开始)和WARN为1(计时结束)时,有选手抢答都能有相应的输出,且再有选手抢答时,输出不改变,实现了锁定功能。
COUNT模块(计时模块)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCOUNTIS
PORT(CLK,JS,SET:
INSTD_LOGIC;
HI,LO:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
WARN:
OUTSTD_LOGIC);
ENDCOUNT;
ARCHITECTURESIXOFCOUNTIS
SIGNALHS:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALLS:
STD_LOGIC_VECTOR(3DOWNTO0);
CONSTANTFPB:
INTEGER:
=9999999;
CONSTANTTEMP:
INTEGER:
=4999999;
SIGNALAQI:
INTEGERRANGE0TOFPB;
SIGNALCLKOUT:
STD_LOGIC;
BEGIN
PROCESS(CLK,JS,hs,ls,SET,CLKOUT)
BEGIN
IFSET='1'THEN
HS<="0011";LS<="0000";WARN<='0';
ELSIFCLKOUT'EVENTANDCLKOUT='1'THEN
IFJS='1'then
IFLS/="0000"then
LS<=LS-1;
ELSIFLS="0000"THEN
LS<="1001";HS<=HS-1;
IFHS="0000"ANDLS="0000"THEN
HS<="0000";LS<="0000";WARN<='1';
ENDIF;
ENDIF;
ELSIFJS='0'then
HS<=HS;LS<=LS;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IFAQIAQI<=AQI+1;
ELSEAQI<=0;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CLK)
BEGIN
IFCLK'EVENTANDCLK='1'THEN
IF(AQI<=TEMP)THEN
CLKOUT<='1';
ELSECLKOUT<='0';
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(HS,LS)
BEGIN
CASEHSIS
WHEN"0000"=>HI<=X"30";
WHEN"0001"=>HI<=X"31";
WHEN"0010"=>HI<=X"32";
WHEN"0011"=>HI<=X"33";
WHEN"0100"=>HI<=X"34";
WHEN"0101"=>HI<=X"35";
WHEN"0110"=>HI<=X"36";
WHEN"0111"=>HI<=X"37";
WHEN"1000"=>HI<=X"38";
WHEN"1001"=>HI<=X"39";
WHENOTHERS=>HI<=X"45";
ENDCASE;
CASELSIS
WHEN"0000"=>LO<=X"30";
WHEN"0001"=>LO<=X"31";
WHEN"0010"=>LO<=X"32";
WHEN"0011"=>LO<=X"33";
WHEN"0100"=>LO<=X"34";
WHEN"0101"=>LO<=X"35";
WHEN"0110"=>LO<=X"36";
WHEN"0111"=>LO<=X"37";
WHEN"1000"=>LO<=X"38";
WHEN"1001"=>LO<=X"39";
WHENOTHERS=>LO<=X"45";
ENDCASE;
ENDPROCESS;
ENDSIX;
分析:
工作时钟为10MHZ,通过其中的两个进程PROCESS(CLK)分频,频率变为1HZ,占空比为1/2。
输出显示在LCD上,所以通过进程PROCESS(HS,LS)将输出转变为ASCII码的形式。
2、键盘模块
键盘扫描原理:
vcc
ICOL0
ICOL1
ICOL2
ICOL3
1
2
3
C
4
5
6
D
7
8
9
E
A
0
B
F
OROW0
OROW1
OROW2
OROW3
OROW[3..0]为键盘扫描码的输入端,扫描码为1110->1101->1011->0111->1110如此循环扫描。
当无按键按下时,ICOL[3..0]输出为1111
程序:
说明:
输出为十六位二进制数,初始化后所有的位为低电平,当有键被按下时相应的位变为高电平。
程序有消抖的功能。
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
entityPADTOKEYis
port(CPIN,R:
INSTD_LOGIC;
Y:
OUTSTD_LOGIC_VECTOR(15DOWNTO0);
ICOL:
INSTD_LOGIC_VECTOR(3DOWNTO0);
OROW:
OUTSTD_LOGIC_VECTOR(3DOWNTO0)
);
ENDENTITY;
architectureJGTofPADTOKEYis
TYPESTATESIS(S0,S1,S2,S3,S4);
SIGNALS:
STATES;
SIGNALSROW:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALCPCT:
INTEGERRANGE0TO255;
SIGNALCTDELAY:
INTEGERRANGE0TO511;
SIGNALCP:
STD_LOGIC;
BEGIN
PROCESS(CPIN)
BEGIN
IFCPIN='1'ANDCPIN'EVENTTHEN
IFCPCT=255THEN
CPCT<=0;CP<=NOTCP;
ELSE
CPCT<=CPCT+1;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CP,R)
VARIABLEN:
INTEGERRANGE0TO12;
BEGIN
IFR='1'THEN
S<=S0;Y<="0000000000000000";SROW<="1110";N:
=0;
ELSIFCP='1'ANDCP'EVENTTHEN
CASESIS
WHENS0=>S<=S1;
WHENS1=>OROW<=SROW;S<=S2;
WHENS2=>S<=S3;
CASENIS
WHEN0=>Y(3DOWNTO0)<=NOTICOL;
WHEN4=>Y(7DOWNTO4)<=NOTICOL;
WHEN8=>Y(11DOWNTO8)<=NOTICOL;
WHEN12=>Y(15DOWNTO12)<=NOTICOL;
WHENOTHERS=>NULL;
ENDCASE;
WHENS3=>IFN=12THEN
N:
=0;S<=S4;CTDELAY<=0;SROW<="1110";
ELSE
N:
=N+4;S<=S1;SROW<=SROW(2DOWNTO0)&SROW(3);
ENDIF;
WHENS4=>IFCTDELAY=511THEN
S<=S1;CTDELAY<=0;
ELSE
CTDELAY<=CTDELAY+1;
ENDIF;
ENDCASE;
ENDIF;
ENDPROCESS;
ENDJGT;
3、LCD显示模块
液晶显示原理:
用户控制逻辑接口:
CLK:
控制器工作时钟,上升沿有效
RST:
复位信号,高电平有效
DATA[7..0]:
ASCII码数据总线
ADDR[3..0]:
字符在LCD屏幕上的地址(共两行,每行16个字符)ADDR=“0000”~“1111”对应每行的第0~15个字符
LINE:
LCD1602屏幕上的行选择信号,LINE=0时数据在第一行显示,LINE=1时数据在第二行显示
BUSY:
控制器忙信号,数据未显示稳定时BUSY=1;反之为0
STROBE:
数据输入有效使能,高电平有效
控制器工作原理如下:
A控制器复位
当RST信号有效时(高电平),控制器进入LCD复位与初始化操作,此时,BUSY信号持续高电平,表示控制器忙,LCD不能进行用户请求的操作。
RST信号由高变低后的大约80us之后,LCD控制器初始化完成,可以响应用户的操作请求,此时,BUSY信号变低。
LCD处于显示模式。
B字符显示
上电后的LCD必须初始化一次,之后LCD控制器停留于“WAITFORDATA”状态。
在用户向LCD控制器申请字符显示操作时,ADDR、DATA、LINE信号必须保持稳定,同时使用STROBE信号触发显示操作。
具体步骤如下:
表示字符显示位置的4bit地址信号加载到ADDR信号线上;
表示字符显示行号的1bit选择信号加载到LINE信号线上;
字符ASCII编码加载到DATA总线上并保持稳定;
用户送入STROBE的有效电平,LCD控制器进入与LCD显示器通讯的过程,显示相应地址和行位置的ASCII码对应字符,同时BUSY信号变为高电平,表示控制器忙。
此时,用户需要等待。
一定时间后,LCD字符显示稳定,BUSY信号变为低电平,等待用户下一次操作申请。
如此循环。
程序:
说明:
一共写十三个字符,每个字符定义三个状态(如lcd_1_out,lcd_1_strobe,lcd_1_wait),ascii_1_in—ascii_1B_in为要显示的十三个字符,以ASCII码的形式输入。
令ascii_1_in、ascii_2_in、ascii_3_in、ascii_4_in、ascii_5_in、ascii_6_in、ascii_7_in、ascii_8_in、ascii_9_in、ascii_A_in、ascii_B_in显示在第二行,ascii_14_in、ascii_15_in、ascii_16_in、ascii_17_in、ascii_18_in、ascii_19_in、ascii_1A_in、ascii_1B_in显示在第一行。
libraryieee;
useieee.s