数电课程设计报告抢答器.docx

上传人:b****4 文档编号:12230828 上传时间:2023-04-17 格式:DOCX 页数:49 大小:353.07KB
下载 相关 举报
数电课程设计报告抢答器.docx_第1页
第1页 / 共49页
数电课程设计报告抢答器.docx_第2页
第2页 / 共49页
数电课程设计报告抢答器.docx_第3页
第3页 / 共49页
数电课程设计报告抢答器.docx_第4页
第4页 / 共49页
数电课程设计报告抢答器.docx_第5页
第5页 / 共49页
点击查看更多>>
下载资源
资源描述

数电课程设计报告抢答器.docx

《数电课程设计报告抢答器.docx》由会员分享,可在线阅读,更多相关《数电课程设计报告抢答器.docx(49页珍藏版)》请在冰豆网上搜索。

数电课程设计报告抢答器.docx

数电课程设计报告抢答器

湖南大学电气与信息工程学院

本科生课程设计

 

题   目:

抢答器

课   程:

 数电课程设计

专   业:

 电气工程及其自动化

班   级:

学   号:

姓   名:

指导 老师:

设计 时间:

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

IFAQI

AQI<=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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 公共行政管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1