智力抢答器.docx
- 文档编号:24328867
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:25
- 大小:181.30KB
智力抢答器.docx
《智力抢答器.docx》由会员分享,可在线阅读,更多相关《智力抢答器.docx(25页珍藏版)》请在冰豆网上搜索。
智力抢答器
一、设计要求
利用教师进阶实验平台,以公平性为原则,设计一个三人抢答器,辅助抢答比赛顺利进行。
要求具备以下功能:
1)抢答器线路测试功能:
为了保证比赛的正常进行,比赛前需要调试线路是否正常工作。
2)第一抢答信号的鉴别和锁存功能:
可以判断谁最先抢到回答的资格,相应的指示灯亮表示抢答成功,并具有所存功能,一直到下一题开始。
3)犯规警示功能:
可以判断出参赛者有没有在主持人读题期间按下抢答键,有人按下则相应犯规指示灯亮,同时取消本轮抢答资格。
4)计时功能:
每道题有20秒的答题时间,可以进行20秒倒计时并显示倒计时间。
5)计分功能:
可以实现加分,并且可以显示三人的分数。
6)提示警告功能:
读题阶段、抢答阶段有相应的指示灯提示,答题超时有蜂鸣声音警告。
二、设计分析与设计思路
实验板上能手动输入控制的硬件有4个按键开关和4个拨码开关。
因此,可以用3个按键来模拟抢答器,由甲、乙、丙三个参赛者控制。
另外1个按键和4个拨码开关由主持人控制。
为说明与设计方便,这样规定:
从左到右,拨码开关分别为boma1,boma2,boma3,boma4,按键分别为key3,key2,key1,key0,LED分别为led1,led2,led3,led4,led5,led6,led7,led8,抢答的三人分别为甲,乙,丙,甲控制key3,乙控制key2,丙控制key1,主持人控制boma1、boma2、boma3、boma4和key4。
拨码开关与按键功能:
boma1:
线路检测/答题切换
boma2:
倒计时/计时结束切换
boma3:
加分/不加分模式切换
boma4:
key4按键功能切换
key1、key2、key3为测试、抢答信号输入端
key4:
按下表示确认功能。
boma4在上时按下表示加分确认,在下时按下表示开始抢答。
系统功能说明:
1、通电前,将4个拨码开关拨到下面,表示初始状态。
2、通电后系统处于初始状态,数码管显示“1000”,为三人的共同底分。
此时亦为线路测试阶段,led1、led2和led3随着key1、key和key3的按下分别亮起,证明抢答线路没有问题。
3、将boma1往上拨,led7亮起,表示正处于读题阶段,此时若有人抢答,则会失去本轮抢答机会。
Key1、key2和key3分别为三人的抢答键,用led4、led5和led6分别表示三人抢答犯规与否,如key2按下则led5亮起,并在这一轮的继续抢答中失去抢答机会。
4、读题后,按下key4,则led7熄灭,led8亮起,表示正处于抢答状态,此时可开始抢答,谁先按下谁就拥有答题权,如甲没有犯规,且最快按下,则此时led1灯亮起,同时熄灭其它灯,数码管显示甲的当前分数,其他人再按下按键无任何反应。
犯规者此时抢答无效。
5、主持人在确认有人成功抢答后,将boma2往上拨,此时处于20秒倒计时中,数码管相应显示。
答题者必须在20秒内作答,并告知主持人“回答完毕”,由主持人结束计时(将boma2往下打)。
若答题者未能在规定时间内完成作答,则蜂鸣器会响起,表示本题超时,按答错处理,主持人再把boma2往下打,此时数码管显示答题者的当前分数。
6、主持人宣布对错,若答错,当前分数不变,若答对,则加100分,具体操作为将boma3向上拨,再将boma4往上拨,按key4,则加分成功。
7、将所有拨码开关往下拨,继续下一轮的抢答。
根据功能的要求,可以利用模块化设计思想进行设计,模块结构图如下。
其中抢答模块(rushans)为整个程序的核心,它实现了系统的抢答器线路测试功能、第一抢答信号的鉴别和锁存功能、犯规警示功能和指示灯的控制;计时模块(timing)实现了倒计时功能、超时警告功能;计分模块(score)实现了计分功能;显示模块(display)实现了计时时间和三人分数的分时段显示功能。
三、各模块的设计与实现
1、抢答模块rushans
在比赛之前,主持人将4个拨码开关拨到下面,此时进行线路测试,各选手按抢答按钮,测试按钮有没有问题。
主持人上拨boma1,开始读题,在读题的过程中不允许选手抢答,若有选手犯规,系统点亮犯规选手对应犯规指示灯并取消其在本轮的抢答资格。
主持人读题完毕,按下key0宣布开始抢答,最快抢到者拥有答题资格,系统点亮答题者相应指示灯。
此外,当主持人将boma4向上拨时,表示处于加分控制阶段,按下key0可输出加分信号。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entityrushansis
port(clk:
instd_logic;
key:
instd_logic_vector(3downto0);
test:
instd_logic;
mode:
instd_logic;
addflag:
outstd_logic:
='0';
led1:
outstd_logic:
='0';
led2:
outstd_logic:
='0';
led3:
outstd_logic:
='0';
led4:
outstd_logic:
='0';
led5:
outstd_logic:
='0';
led6:
outstd_logic:
='0';
led7:
outstd_logic:
='0';
led8:
outstd_logic:
='0';
over:
outbit;
result:
outstd_logic_vector(1downto0));
endentity;
architecturebehavofrushansis
signalp1:
std_logic;
signalp2:
std_logic;
signalp3:
std_logic;
signalq1:
std_logic:
='0';
signalq2:
std_logic:
='0';
signalq3:
std_logic:
='0';
signalstart:
std_logic:
='0';
signalstop:
bit;
signaltled1:
std_logic:
='0';
signaltled2:
std_logic:
='0';
signaltled3:
std_logic:
='0';
signalqled1:
std_logic:
='0';
signalqled2:
std_logic:
='0';
signalqled3:
std_logic:
='0';
signalclk0:
std_logic;
signalcnt0:
integerrange1to250000;
begin
p1<=key(3);p2<=key
(2);p3<=key
(1);
process(clk)
begin
if(clk'eventandclk='1')then
if(cnt0=250000)then
cnt0<=1;clk0<='1';
else
cnt0<=cnt0+1;
clk0<='0';
endif;
endif;
endprocess;
process(clk0,test,p1,p2,p3)
begin
if(clk0'eventandclk0='1')then
if(test='1')then
ifp1='0'thentled1<='1';
elsetled1<='0';
endif;
ifp2='0'thentled2<='1';
elsetled2<='0';
endif;
ifp3='0'thentled3<='1';
elsetled3<='0';
endif;
elsetled1<='0';tled2<='0';tled3<='0';
endif;
endif;
endprocess;
process(clk0,start,test,stop,q1,q2,q3,p1,p2,p3)
begin
if(clk0'eventandclk0='1')then
if(test='0'andstop='0')then
if(start='1')then
if(q1='0'andq2='0'andq3='0')then
if(p1='0'andp2='1'andp3='1')then
result<="01";stop<='1';qled1<='1';
elsif(p1='1'andp2='0'andp3='1')then
result<="10";stop<='1';qled2<='1';
elsif(p1='1'andp2='1'andp3='0')then
result<="11";stop<='1';qled3<='1';
endif;
elsif(q1='1'andq2='0'andq3='0')then
if(p2='0'andp3='1')then
result<="10";stop<='1';qled2<='1';
elsif(p2='1'andp3='0')then
result<="11";stop<='1';qled3<='1';
endif;
elsif(q1='0'andq2='1'andq3='0')then
if(p1='0'andp3='1')then
result<="01";stop<='1';qled1<='1';
elsif(p1='1'andp3='0')then
result<="11";stop<='1';qled3<='1';
endif;
elsif(q1='0'andq2='0'andq3='1')then
if(p1='0'andp2='1')then
result<="01";stop<='1';qled1<='1';
elsif(p1='1'andp2='0')then
result<="10";stop<='1';qled2<='1';
endif;
elsif(q1='1'andq2='1'andq3='0')then
if(p3='0')then
result<="11";stop<='1';qled3<='1';
endif;
elsif(q1='1'andq2='0'andq3='1')then
if(p2='0')then
result<="01";stop<='1';qled2<='1';
endif;
elsif(q1='0'andq2='1'andq3='1')then
if(p1='0')then
result<="01";stop<='1';qled1<='1';stop<='0';
endif;
elseresult<="00";qled1<='0';qled2<='0';qled3<='0';stop<='0';
endif;
elsif(start='0'andtest='0')then
if(p1='0')thenq1<='1';led4<='1';endif;
if(p2='0')thenq2<='1';led5<='1';endif;
if(p3='0')thenq3<='1';led6<='1';endif;
endif;
elsif(test='1')then
qled1<='0';qled2<='0';qled3<='0';led4<='0';led5<='0';led6<='0';
q1<='0';q2<='0';q3<='0';stop<='0';
elsif(stop='1')thenled4<='0';led5<='0';led6<='0';q1<='0';q2<='0';q3<='0';
endif;
endif;
endprocess;
over<=stop;
led1<=tled1orqled1;
led2<=tled2orqled2;
led3<=tled3orqled3;
process(key(0))
begin
if(test='1')then
start<='0';
elsif(key(0)'eventandkey(0)='1'andmode='1'andtest='0')then
start<='1';
endif;
if(test='0'andstart='0')thenled7<='1';
elseled7<='0';
endif;
if(start='1'andstop<='0')thenled8<='1';
elseled8<='0';
endif;
endprocess;
process(mode,key(0))
begin
ifmode='1'thenaddflag<='0';
elsif(key(0)'eventandkey(0)='1'andmode='0')then
addflag<='1';
endif;
endprocess;
endbehav;
2、计时模块timing
抢答比赛中要求答题者在规定时间内回答问题。
主持人根据抢答情况,上拨boma2,进行20秒答题倒计时,倒计时完毕会发出响声,主持人下拨boma2可停止倒计时,不发出响声。
若答题者能在规定时间内回答,主持人也须结束倒计时。
此外,本模块还输出显示选择信号outflag。
源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitytimingis
port(clk:
instd_logic;
over:
instd_logic;
answer:
instd_logic;
beep:
outstd_logic:
='1';
down1:
outstd_logic_vector(3downto0);
down2:
outstd_logic_vector(3downto0);
outflag:
outstd_logic:
='1');
endentity;
architecturehebavoftimingis
signalcnt:
integerrange1to50000000;
signalclk1:
std_logic;
begin
dividefreq:
process(clk)
begin
if(clk'eventandclk='1')then
ifcnt=50000000then
cnt<=1;
clk1<='1';
elsecnt<=cnt+1;clk1<='0';
endif;
endif;
endprocessdividefreq;
process(answer,over,clk1)
variablebuff1:
std_logic_vector(3downto0):
="0010";
variablebuff2:
std_logic_vector(3downto0):
="0000";
begin
if(clk1'eventandclk1='1')then
beep<='1';
if(over='1'andanswer='0')then
if(buff1="0000"andbuff2="0000")then--runlonger
beep<='0';
outflag<='1';
elsif(buff2="0000")then
buff2:
="1001";
buff1:
=buff1-'1';
outflag<='0';
elsebuff2:
=buff2-'1';outflag<='0';
endif;
elsebuff1:
="0010";buff2:
="0000";outflag<='1';
endif;
endif;
down1<=buff1;
down2<=buff2;
endprocess;
endhebav;
3、计分模块score
所有参赛者的底分都是1000分,一轮比赛后由主持人控制加分,加分信号由抢答模块送来,有加分信号则加100分,没有则不加分。
考虑到在实际的抢答中,一般不会将分数加到9900分,所以当分数到达9900时分数设定为0000。
源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityscoreis
port(result:
instd_logic_vector(1downto0);
add:
instd_logic;
addflag:
instd_logic;
score1:
outstd_logic_vector(3downto0);
score2:
outstd_logic_vector(3downto0));
endentity;
architecturehebavofscoreis
signalp1score1:
std_logic_vector(3downto0):
="0001";
signalp1score2:
std_logic_vector(3downto0):
="0000";
signalp2score1:
std_logic_vector(3downto0):
="0001";
signalp2score2:
std_logic_vector(3downto0):
="0000";
signalp3score1:
std_logic_vector(3downto0):
="0001";
signalp3score2:
std_logic_vector(3downto0):
="0000";
begin
process(addflag)
begin
if(addflag'eventandaddflag='1')then
if(add='0')then
ifresult="01"then
if(p1score2="1001")then
p1score2<="0000";
p1score1<=p1score1+'1';
if(p1score1="1001")then
p1score1<="0000";
endif;
elsep1score2<=p1score2+'1';
endif;
elsifresult="10"then
if(p2score2="1001")then
p2score2<="0000";
p2score1<=p1score1+'1';
if(p2score1="1001")then
p2score1<="0000";
endif;
elsep2score2<=p2score2+'1';
endif;
elsifresult="11"then
if(p3score2="1001")then
p3score2<="0000";
p3score1<=p3score1+'1';
if(p3score1="1001")then
p3score1<="0000";
endif;
elsep3score2<=p3score2+'1';
endif;
elsenull;
endif;
endif;
endif;
caseresultis
when"01"=>score1<=p1score1;score2<=p1score2;
when"10"=>score1<=p2score1;score2<=p2score2;
when"11"=>score1<=p3score1;score2<=p3score2;
whenothers=>null;
endcase;
endprocess;
endhebav;
4、显示模块display
数码管根据outflag信号选择显示倒计时时间或答题者分数。
数码管的显示采用动态扫描的方式。
所谓动态显示,就是数码管一个一个地轮流点亮,利用人的视觉暂留功能可以看到所有数码管的整体显示,但必须保证扫描速度足够快,否则显示器会闪烁。
但应注意到系统时钟为50MHz,过快的频率会使得数码管来不及熄灭,导致显示出现问题,所以要分频得到有效时钟。
动态显示扫描频率的选择主要取决于人眼视觉暂留频率25Hz和动态显示的数码管数,要使4位数码管正常地动态显示,至少要有100Hz的时钟。
本题中时钟分频到250Hz。
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitydisplayis
port(clk:
instd_logic;
outflag:
instd_logic;
down1,down2:
instd_logic_vector(3downto0);
score1,score2:
instd_logic_vector(3downto0)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智力 抢答