电子线路CAD课程设计 抢答器Word文档格式.docx
《电子线路CAD课程设计 抢答器Word文档格式.docx》由会员分享,可在线阅读,更多相关《电子线路CAD课程设计 抢答器Word文档格式.docx(33页珍藏版)》请在冰豆网上搜索。
状态
意义
数码管显示
设置初始分数
当前状态和设置的初试分数
1~6
当前抢答过程被相应编号的选手抢答到
当前状态和该选手的目前分数
7
正在抢答中
数码管显示当前状态和正在倒计的时间
五、设计思路
a.总体电路
1.Display原理图
2.总原理图
该电路是在Ise中将所写的各个模块用导线连接之后的效果,从这个图可以很清晰的看到程序的结构和思路。
b.详细设计
在对问题进行分析之后将该程序分成一下模块,如表所示:
模块名
作用和意义
Restart
抢答器的重新开始信号的输入,用以改变当前的状态至0,在该模式下进行初始分数设置,即进行新一轮抢答。
Mode_latch_change
每当强大之后,所存当前状态,并在此基础上通过按键调整状态,然后通过display模块显示,由此可以查看各个选手的当前积分。
Set_score
在0状态时,利用两个按钮设置初始分数,提供加数设置和减数设置。
Time_count
每次支持人按下reset按钮进行新一轮抢答时,该模块立即启动,开始倒计时10s,并通过display显示,同时发出时间到最后3s和时间完的信号,以便控制提示音。
Score_count
主持人通过两个按键对抢答者回答对错进行判断,同时改变其积分。
Display
将需要数码管输出显示的信号输入,通过当前状态来判断输出那路信号。
BcdToSeg
将display模块中被选择的4位bcd码转化成数码管相应的8位信号
Seg_driver
数码管的选通信号,利用时钟循环扫描。
Sound_alarm
将Time_count中的信号输入,和1000hz信号取并,得到输出到喇叭,得到相应的提示音。
Control
控制模块,采集6位选手的按键情况,由此得到当前的状态,作为其他模块的状态参照,同时发出相应的一些控制信号。
六、模块仿真
1.restart模块仿真
波形如下:
分析:
可以看到,cp1024hz的时钟每个上升沿检测start_clk信号下降沿,并且在其每个下降沿对start信号翻转,而抢答器在start=0是表示设置初始分数,start=1是表示抢答正常进行,所以利用start_clk可以控制抢答器重新开始。
2.Mode_latch_change模块仿真
可以看出,该模块在start=1是开始工作,当flag_pressed(表示选手抢答)信号置为1时,模块锁存当前的状态mode_in,即相应的强大选手的编号,在flag_pressed=1的过程中,可以通过按up_clk和down_clk两个按钮设置mode_out,由此输入到display,从而显示各个选手的分数信息。
模块中提供1024hz的时钟对up_clk和down_clk扫描,一旦有脉冲,则在下降沿做相应动作,可以消除按键的抖动影响。
3.Set_score模块仿真
可以看出该模块在start=0是工作,通过1024hz时钟对两个按键扫描,对初始分数进行加计数和减计数,即一个0~9的计数器,同时消除按键抖动的影响。
4.Time_count模块仿真
可以看出该模块在start=1是正常工作,当flag_pressed信号为0时,时间从9s开始倒计时,当有选手抢答,flag_pressed有0变为1时,时间停止计数,在支持人按下reset按键之后,计数值恢复为9s,并开始倒计数,当时间倒计至3时,time_less_alarm信号由0变成1,当时间倒计至0时,time_out信号由0变成1,这两个信号都送至sound_alarm并经过变换之后驱动喇叭得到提示音。
5.Score_count模块仿真
有图可以看出,该模块在start=1时正常工作,利用1024hz的时钟对right_key和wrong_key扫描,消除抖动之后,做相应的分数设置操作,给谁加减分通过当前的mode判断,并且当某选手分数减至0分时,该选手的一个标志位zero被置为1,表示该选手已被淘汰,下一轮抢答将没有资格抢答,相应的按键也将无效。
6.Display模块仿真
该模块在start=1时工作,用1024hz信号扫描mode变化,并以此作为依据输出相应的信号到数码管中显示,这种对应关系在前面的表格中已经详细说明,不再赘述。
7.Sound_alarm模块仿真
该模块在start=1时正常工作,输入有sound_en信号time_less_alarm,sound_en=1表示有选手抢答或者时间倒计至0,此时alarm输出1s钟的1024hz信号,驱动喇叭得到提示音;
time_less_alarm=1信号表示时间只剩下3s,此时alarm输出0.5s钟的1024hz信号,驱动喇叭得到提示音。
8.Control模块仿真
该模块在start=1时正常工作,当相应的key按键按下时,mode变成相应选手的编号状态,并且flag_pressed变成1,此时sound_en被置为1,驱动喇叭得到1s的1khz的提示音。
并且只有当支持人按下reset键之后才恢复至0,;
当time_out信号为1时,表示时间倒计至0,此时sound_en被置为1,驱动喇叭得到提示音。
七、实验感想
1.通过这次课程设计,加强了我们动手、思考和解决问题的能力。
在设计过程中,经常会遇到这样那样的情况,就是心里想老着这样的接法可以行得通,但实际接上电路,总是实现不了,因此耗费在这上面的时间用去很多。
2.做课程设计同时也是对课本知识的巩固和加强,由于课本上的知识太多,平时课间的学习并不能很好的理解和运用各个元件的功能,而且考试内容有限,所以在这次课程设计过程中,我们了解了很多元件的功能,并且对于其在电路中的使用有了更多的认识。
3.平时看课本时,有时问题老是弄不懂,做完课程设计,那些问题就迎刃而解了。
而且还可以记住很多东西。
比如一些芯片的功能,平时看课本,这次看了,下次就忘了,通过动手实践让我们对各个元件映象深刻。
认识来源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一标准。
所以这个课程设计对我的作用是非常大的。
4.通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
5.此次课程设计,学到了很多课内学不到的东西,比如独立思考解决问题,出现差错的随机应变,和与人合作共同提高,都受益非浅,今后的制作应该更轻松,自己也都能扛的起并高质量的完成项目。
最后衷心感谢老师的悉心授课和同学门的热心帮助!
八、源代码
1.restart.v
modulerestart(cp1024hz,start_clk,started);
//started==0设置初始分数,started==1开始工作
inputcp1024hz,start_clk;
outputstarted;
regstarted;
reg[1:
0]init_temp=0;
regstart_clk1;
always@(posedgecp1024hz)
begin
start_clk1<
=start_clk;
end
wirestart_clk2;
assignstart_clk2=start_clk1&
(~start_clk);
//变换start_clk信号,防止抖动以及便于cp1024hz扫描
always@(posedgecp1024hz)//start正常工作抢?
?
_clkstarted翻转,为0时设置分数,为1时
if(init_temp==2)
begin
started<
=0;
init_temp<
=init_temp+1;
end
elseif(init_temp==3)
=init_temp;
if(start_clk2)
begin
started<
=~started;
end
else
endmodule
2.mode_latch_change.v
modulemode_latch_change(cp1024hz,started,flag_pressed,latch_clk,up_clk,down_clk,mode_in,mode_out);
inputcp1024hz,started,flag_pressed;
//时钟信号,抢答开始信号,抢答中已经有按下键信号
inputlatch_clk;
//锁存mode的脉冲信号
inputup_clk,down_clk;
//设置mode的两个按键,上调键和下调键
input[3:
0]mode_in;
//从control的mode输出引进
outputmode_out;
//抢答按键之后由modein变modeout
reg[3:
0]mode_out;
regup_clk1,down_clk1,latch_clk1;
up_clk1<
=up_clk;
down_clk1<
=down_clk;
latch_clk1<
=latch_clk;
wireup_clk2,down_clk2,latch_clk2;
//对输入的信号?
变化?
阌赾p1024hz的脉冲捕获,并且可以防止设置mode的两个按键的抖动
assignup_clk2=up_clk1&
(~up_clk);
assigndown_clk2=down_clk1&
(~down_clk);
assignlatch_clk2=latch_clk1&
(~latch_clk);
if(!
started)//started=0,设置分数模式,mode_out=mode_in=0;
mode_out<
else//正常抢答过程
if(!
flag_pressed)//抢答模式
mode_out<
=mode_in;
elseif(latch_clk2)//锁存模式
elseif(flag_pressed&
&
up_clk2)//查看各个分数,mode加计数
if(mode_out>
=6)
begin
mode_out<
end
else
=mode_out+1;
end
down_clk2)//查看各个分数,mode减计数
if(mode_out<
=0)
=6;
=mode_out-1;
else
//mode_out<
3.set_score.v
moduleset_score(cp1024hz,started,set_up,set_down,setted_score);
//抢答前设置玩家分数yes
inputcp1024hz,started,set_up,set_down;
outputsetted_score;
reg[3:
0]setted_score;
regcp_up,cp_down;
cp_up<
=set_up;
cp_down<
=set_down;
wirecp_up_pos,cp_down_pos;
assigncp_up_pos=cp_up&
(~set_up);
assigncp_down_pos=cp_down&
(~set_down);
//设置分数的计数cp,并防止抖动
always@(posedgecp1024hz)//设置初始分数
if(started==1)
setted_score[3:
0]<
else//当stared=0,为设置初始分数的模式,开?
忌柚梅质?
if(cp_up_pos&
(!
cp_down_pos))//设置?
数加计数设置
if(setted_score[3:
0]==9)
setted_score[3:
=setted_score[3:
0]+1;
elseif((!
cp_up_pos)&
cp_down_pos)//设置分数减计数设置
0]==0)
=9;
0]-1;
end
4.time_count.v
moduletime_count(cp1024hz,started,reset,flag_pressed,time_left,time_less_alarm,time_out);
//yesd
inputcp1024hz,started,reset,flag_pressed;
outputtime_left;
outputtime_less_alarm;
//倒计时到3s之后发出提醒信号
outputtime_out;
//倒计时完了之后发出信号
0]time_left;
regtime_less_alarm;
regtime_out;
reg[9:
0]temp_count;
started)
time_left<
else
if(reset)
time_left<
time_less_alarm<
time_out<
temp_count<
if(time_left==3)//当倒计时剩3s时?
崾臼?
剩余不多
time_less_alarm<
=1;
if(time_left==0)//当倒计时完了后,发出信号
time_out<
if(flag_pressed)//已抢答,则终止倒计时,并置为初值
time_left<
else//还未抢答,进行倒计时
if(temp_count==1023)
begin
temp_count<
if(time_left>
1)
begin
time_left<
=time_left-1;
if(time_left==4)
begin
time_less_alarm<
end
end
else
time_out<
end
else
=temp_count+1;
end
5.sound_alarm.v
modulesound_alarm(reset,sound_en,cp1024hz,time_less_alarm,alarm);
//提示声,包括时间少于3秒后的读秒提示声,抢答按键按下提示声以及时间完了的提示声
inputreset,sound_en,cp1024hz;
//重新开始新的抢答信号,发声信号,时钟
inputtime_less_alarm;
//时间少于3s时的信号
outputalarm;
//所有的提示声信号叠加,作为喇叭的驱动信号
reg[9:
0]temp_count=0;
regtemp;
//regalarm_time;
always@(posedgecp1024hz)//(包括倒计时完,已抢答两种情况的声音提示)
if(reset)//对中间变量进行初始化
temp<
temp_count<
if(sound_en==1)
if(temp_count==1023)//sound_en==1时,响1s钟提示
temp<
else
wirealarm_time;
assignalarm_time=temp&
sound_en;
0]temp1;
regtime_left_alarm;
always@(posedgecp1024hz)//时间到三秒之后时提示声响0.5s
if(reset)//对中间变量进行初始化
temp1<
time_left_alarm<
if(time_less_alarm==0)
temp1<
time_left_alarm<
begin//时间少于3s时提示
if(temp1<
=512)
temp1<
=temp1+1;
time_left_alarm<
assignalarm=(time_left_alarm|alarm_time)&
cp1024hz;
6.control.v
modulecontrol(cp1024hz,started,reset,k1,k2,k3,k4,k5,k6,
zero1,zero2,zero3,zero4,zero5,zero6,time_out,
mode,flag_pressed,sound_en,latch_en);
inputcp1024hz,started,reset;
inputk1,k2,k3,k4,k5,k6;
//抢答的6个按键,由cp1024hz扫描是否有按键
inputzero1,zero2,zero3,zero4,zero5,zero6;
//6个用?
的分数是否为0,并将分数为0的淘汰
inputtime_out;
//倒计时已完
outputflag_pressed,sound_en,latch_en,mode;
//是否已按键;
声音控制;
模式控制;
输出模式
regflag_pressed,sound_en,latch_en;
reg