四人抢答器.docx
《四人抢答器.docx》由会员分享,可在线阅读,更多相关《四人抢答器.docx(14页珍藏版)》请在冰豆网上搜索。
四人抢答器
四人抢答器
一、课程设计目的:
1、综合运用EDA技术,独立完成一个课题的设计,考察运用所学知
识,解决实际问题的能力;
2、结合理论知识,考察阅读参考资料、文献、手册的能力;3、进一步熟悉EDA技术的开发流程,掌握文件编辑、编译、仿真、
下载验证等环节的实现方法和应用技巧;
4、锻炼撰写研究报告、研究论文的能力;
5、通过本实践环节,培养科学和严谨的工作作风。
二、课程设计内容:
l、设计用于竞赛的四人抢答器,功能如下:
(1)有多路抢答器,台数为四;
(2)具有抢答开始后20秒倒计时,20秒倒计时后无人抢答显示超时,并报警;
(3)能显示超前抢答台号并显示犯规警报;
(4)能显示各路得分,并具有加、减分功能;2、系统复位后进入抢答状态,当有一路抢答键按下时,该路抢答信
号将其余各路抢答封锁,同时铃声响,直至该路按键松开,显示
牌显示该路抢答台号。
3、用VHDL语言设计符合上述功能要求的四人抢答器,并用层次设计方法设计该电路。
三、课程设计步骤:
根据设计内容的要求可以得知抢答器应分为以下几个模块比较好。
即抢答器鉴别模块、抢答器计时模块、抢答器计分模块,由以上三个模块就可完成四人抢答器的功能要求。
但大家都知道,作为一个VHDL语言源程序,一般需要一个顶层文件将各个模块统一起来,故而还需要顶层文件模块。
现将各个模块介绍如下:
1、抢答器鉴别模块:
既然是抢答器所以首先必须有抢答的功能。
在这个模块中主要实现抢答过程中的抢答功能,并能对超前抢答进行警告,还能记录正常抢答和朝前抢答者的台
号,并且能实现当有一路抢答按键按下时,该路抢答信号能立即显示出来而其它路的信号无论抢没抢答都不能让其显示。
也就是说具有将其余的抢答器发过来的信号封锁的功能。
本次程序中设定的共有四个抢答信号K1、K2、K3、K4;抢答使能信号en;抢答状态显示信号states;警报时钟信号clk2;系统复位信号rst;超前警报信号ring。
其工作条件应该如下:
当系统一个复位信号(rst=’1’有效)到来时,主持人按下允许抢答按键时即en=‘1’,各路才准开始抢答,当有一路正常获得抢答时,系统会立即自动封锁另外三路的抢答信号,只允许一人处于答题状态;当主持人没有按下允许抢答键时,若有人超前抢答,警报会立即响起,同时只要有人抢答那么抢答显示台(states)会显示哪一个在抢答。
其抢答时序图如下图1所示:
图1鉴别模块的时序
在系统第一个复位信号来临后,电路自动复位,在允许抢答信号来临之前(即en=‘0’,非抢答区),任何的按键都是超前抢答,此时警报就会响起(即超前抢答警报信号ring获得一个频率很高的脉冲,就会响起);在主持人复位(rst=1,抢答区)时,允许抢答,K1~K4中最先为高电平的即抢答成功,此时抢答显示台将会显示其对应的台号。
该模块的程序以及下面的各个模块的程序都会附在最后的附录上。
2、抢答器计时模块:
在这个模块中主要实现抢答器在抢答过程中的计时功能,在有抢答开始后进
行20秒的倒计时,并且在20秒倒计时后,若无人抢答显示超时并报警。
其中有抢答时钟信号clk;系统复位信号rst;抢答使能信号en;抢答状态显示信号states;无人抢答警报信号warn;计时中止信号stop;计时十位个位信号tb,ta。
本模块主是实现抢答器计时功能的,其工作情况应应该如下:
系统复位信号来临(即rst=‘1’),计时复位为20秒倒计时,当主持人允许抢答时即en=1,开始倒计时,随着系统时钟来一个上升沿倒计时减1,当到20倒计时计玩仍然无人抢答时,警报指示灯亮(即warn=‘1’),若有人抢答主持人可以按下中止键(即stop=‘1’),这样倒计时就会回到20秒初始状态。
其工作时序如下图2所示
图2计分模块的时序
图中是CLK上升沿有效,当人rst=0且en=1时才会从二十开始倒计时,当遇到stop(高电平)信号时或者当20减到0时,计时才会停止。
3、抢答器记分模块:
在这个模块中主要是实现计分的功能的。
根据要求只需要能显示各路得分,并具有加、减分功能即可。
若做加减法,给各个台号预置一定的分数比较好。
此处给每个抢答信号预置10分,当抢答并答对时加1分,答错
减1分,没有获得抢答保持不变。
其中各端口的定义如下:
抢答时钟信号为clk;系统复位信号为rst;抢答使能信号为en;抢答状态显示信号为states;记分加减信号为add(add,‘1’时为加,add,‘0’时为减);四个信号的得分显示信号为a_out,b_out,c_out,d_out。
此时抢答器的计分模块的工作的时序图如下图3所示:
图3计分模块的时序图
即有图2中的抢答后才能有图3的计分才有效。
即有抢答的必有加减分得存在,没抢答的分数将会保持不变~
4、顶层文件:
在这个模块中是对前三个模块的综合编写的顶层文件。
四、课程设计验证:
本次课程设计在EDA实验系统GW48-PK2上完成,芯片均选用“cyclone”系列的“EP1C6Q240C6”。
本课程设计选择模式5,依托Qutartus强大的仿真及编译功能,对程序进行查错在确认无误后进行管脚锁定,管脚锁定好后对设计文件进行重新编译,产生设计电路的下载文件(.sof)。
然后打开GW48-PK2实验系统,执行菜单“tools-programmer”,点击“addfile„”加载下载文件:
点击“hardwaresetup„”选择编程下载方式“ByteBlasterMV”;
“Programmer”窗口中“mode”项选择“JTAG”,然后点击“start”开始下载,下载完成后,即可在实验箱上验证设计电路。
经验证后抢答器的相应功能实现了,说明设计已经设计完成~在课程设计验证过程中的仿真的波形如下图四:
图4综合仿真的波形
如上图所示,当k2超前抢答时,states中显示出了超前抢答的台号2,同时输出outa得到一个报警信号clk2;当k4抢答成功后,其他的强答台号无效,显示灯只显示四号的;当无人抢答是给出了一个报警信号,提示抢答倒计时结束无人抢答。
五、课程设计心得:
本次我们的课程设计设计较好地完成了既定目标,能够正确显示出抢答台号,完成积分功能,并能较精确的进行倒计时计数。
最终完成了本次试验交给我们的任务~
在实验中也有失败,如当经过几天的努力把鉴别模块、计时模块、计分模块做好后进行了整体的运作后即统一到顶层文件时编译总出现错误。
最后经过多次变量调整才能符合要求。
还有在仿真时,看着仿真是貌似挺简单的,实际上仿
真有很多技巧,我以前不知道,导致总观察不出我想要的特定波形。
后来向老师和同学请教才搞定。
可以说是多亏老师的指导才让我少走很多弯路。
也从中发现自己还有很多知识不懂,最终把波形弄出来了~在这次设计中,我更进一步地了解了开发项目该如何组织进行,抢答器的设计原理有了更深的了解,同时也提高了查阅文档解决问题的能力,对EDA技术的运用有了深一层的认识,对VHDL程序语言设计有了更深的理解,并熟练掌握了实验室的试验箱及Qutartus这一强大的工具。
通过本实验设计更增加了我对电子技术的热爱,对专业知识有了更透彻的认识~有因掌握了这一技术而更加自信。
相信通过今后的学习会更成为一个科技含量高的技术人才~通过实验也给自己一个成就感,让平时所学的知识有了实用的机会,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力,让我以后更有信心,无论遇到什么困难都要勇于克服,遇到问题要善于思考并虚心请教~
最后向学校和老师的支持和帮助说声感谢,因为你们我们才有锻炼和实践的机会~
六、附录:
1、设计实现的原理图:
图5设计的原理图
2、设计实验的源程序:
a、抢答器鉴别模块的源程序:
libraryieee;
useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityqdjbis
port(clk2,en,rst:
instd_logic;
k1,k2,k3,k4:
instd_logic;
ring:
outstd_logic;
states:
outstd_logic_vector(3downto0));
endqdjb;
architectureoneofqdjbissignalsinor,ringf,tmp:
std_logic;
signalcnt:
std_logic_vector(5downto0);
begin
sinor<=k1ork2ork3ork4;p1:
process(k1,rst,k2,k3,k4,tmp)
begin
ifrst='1'then
tmp<='1';states<="0000";
elsiftmp='1'then
ifk1='1'then
states<="0001";tmp<='0';
elsifk2='1'then
states<="0010";tmp<='0';
elsifk3='1'then
states<="0011";tmp<='0';
elsifk4='1'then
states<="0100";tmp<='0';
elsetmp<='1';states<="0000";
endif;
endif;
endprocessp1;
process(clk2,en,rst,cnt)
begin
ifrst='1'then
cnt<="000000";ringf<='0';
elsifclk2'eventandclk2='1'then
ifen='0'andsinor='1'then
ifcnt<"111111"then
ringf<=notringf;cnt<=cnt+1;
elseringf<='0';
endif;
endif;
endif;
endprocessp3;
ring<=ringf;
endone;
b、抢答器计时模块的源程序:
libraryieee;
useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityjsis
port(clk,rst,en,stop:
instd_logic;
warn:
bufferstd_logic;
ta,tb:
bufferstd_logic_vector(3
downto0));
endjs;
architectureoneofjsis
signalco:
std_logic;
begin
p1:
process(clk,rst,en,stop,ta)
begin
ifrst='1'orstop='1'then
ta<="0000";
elsifclk'eventandclk='1'then
co<='0';
ifen='1'then
ifta="0000"then
ta<="1001";co<='1';
elseta<=ta-1;
endif;
endif;
endif;
endprocessp1;
p2:
process(co,rst,en,stop,tb)
begin
ifrst='1'orstop='1'then
tb<="0010";
elsifco'eventandco='1'then
ifen='1'then
iftb="0000"thentb<="0010";
elsetb<=tb-1;
endif;
endif;
endif;
endprocessp2;
p3:
process(rst,ta,tb)
begin
ifrst='1'then
warn<='0';
elsifta="0000"andtb="0000"then
warn<='1';
elsewarn<='0';
endif;
endprocessp3;
endone;
c、抢答器计分模块的源程序:
libraryieee;
useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;entityjfis
port(clk,rst,en,add:
instd_logic;
states:
instd_logic_vector(3downto0);
a_out,b_out,c_out,d_out:
bufferstd_logic_vector(3
downto0));
endjf;
architectureoneofjfis
begin
p2:
process(clk,rst,add,states,a_out,b_out,c_out,d_out)
begin
if(rst='1')then
a_out<="1010";b_out<="1010";c_out<="1010";d_out<="1010"
;
elsifen='1'then
ifclk'eventandclk='1'then
casestatesis
when"0001"=>
ifadd='1'then
ifa_out="1111"then
a_out<="0000";
elsea_out<=a_out+1;
endif;
elsifadd='0'then
ifa_out="0000"then
a_out<="0000";
elsea_out<=a_out-1;
endif;
endif;
when"0010"=>
ifadd='1'then
ifb_out="1111"then
b_out<="0000";
elseb_out<=b_out+1;
endif;
elsifadd='0'then
ifb_out="0000"then
b_out<="0000";
elseb_out<=b_out-1;
endif;
endif;
when"0011"=>
ifadd='1'then
ifc_out="1111"then
c_out<="0000";
elsec_out<=c_out+1;
endif;
elsifadd='0'then
ifc_out="0000"then
c_out<="0000";
elsec_out<=c_out-1;
endif;
endif;
when"0100"=>
ifadd='1'then
ifd_out="1111"then
d_out<="0000";
elsed_out<=d_out+1;
endif;
elsifadd='0'then
ifd_out="0000"then
d_out<="0000";
elsed_out<=d_out-1;
endif;
endif;
whenothers=>
a_out<=a_out;b_out<=b_out;c_out<=c_out;d_out<=d_out;
endcase;
endif;
endif;
endprocessp2;
endone;
d、抢答器顶层文件的源程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityqiangdaqiis
port(clk,clk2,en,k1,k2,k3,k4,add,stop,rst:
instd_logic;
ring,alarm:
bufferstd_logic;
outa:
outstd_logic;
ta,tb:
bufferstd_logic_vector(3downto0);
states:
bufferstd_logic_vector(3downto0);
a_out,b_out,c_out,d_out:
bufferstd_logic_vector(3downto0));
endqiangdaqi;
architecturebhvofqiangdaqiis
componentqdjbis
port(clk2,en,rst:
instd_logic;
k1,k2,k3,k4:
instd_logic;
ring:
outstd_logic;
states:
outstd_logic_vector(3downto0));
endcomponent;
componentjsis
port(clk,rst,en,stop:
instd_logic;
warn:
bufferstd_logic;
ta,tb:
bufferstd_logic_vector(3downto0));
endcomponent;
componentjfis
port(clk,rst,en,add:
instd_logic;
states:
instd_logic_vector(3downto0);
a_out,b_out,c_out,d_out:
bufferstd_logic_vector(3downto0));
endcomponent;
signalcnt:
std_logic_vector(3downto0);
begin
u1:
qdjbportmap(clk2,en,rst,k1,k2,k3,k4,ring,states);u2:
jsportmap(clk,rst,en,stop,alarm,ta,tb);u3:
jfportmap(clk,rst,en,add,states,a_out,b_out,c_out,d_out);outa<=ringoralarm;
endbhv;