武汉理工大学EDA课程设计数字抢答器的设计.docx
《武汉理工大学EDA课程设计数字抢答器的设计.docx》由会员分享,可在线阅读,更多相关《武汉理工大学EDA课程设计数字抢答器的设计.docx(12页珍藏版)》请在冰豆网上搜索。
武汉理工大学EDA课程设计数字抢答器的设计
1绪论
在许多比赛活动中,为了准确、公正、直观地判断出第一抢答者,通常设置一台抢答器,通过数显、灯光及音响等多种手段指示出第一抢答者。
为了能在实际中得到真正的应用,它必须有以下功能:
(1).有在主持人按下开始开关后,抢答才有效。
(2).当其中有一路选手按下后,其它的开关失效。
(3).具有声音报告功能,当有选手按下时,同时有响声表示有人抢答。
当然以上只是最简单而且是十分必要的功能。
为了做到这点,必须设计一个所用元件最少,结构最简单,成功率最高的作品来。
2设计要求
1)设计一个4组参赛的数字式抢答器
2)抢答器具有第一信号鉴别和锁存功能,使除第一抢答外地按钮不起作用。
3)设置一个主持人“复位”按钮。
4)主持人复位后,开始抢答,第一信号鉴别锁存电路得到信号后,有指示灯显示抢答组别,扬声器发出2-3秒的音响。
5)设置一个记分电路,每组开始预置100分,由主持人记分,答对一次加10分,答错一次减10分。
3QuartusII软件简介
QuartusII是Altera公司的综合性PLD/FPGA开发软件,支持原理图、VHDLVerilogHDL等多种设计输入形式,可以完成从设计输入到硬件配置的完整
PLD设计流程。
提供了完善的用户图形界面设计方式。
具有运行速度快,界面统一,功能集中,易学易用等特点。
4方案设计
4.1方案选择及论证
数字式抢答器应具备锁存功能,将第一个抢答者的信号进行锁存,并有音响予以配合,来保证抢答的及时性。
此外,计分部分应由主持人操控,答对加十分,答错扣十分。
所以,整体系统应使用抢答、扬声器、计分三部分。
4.2设计框图
图1总体框图
5程序及各模块设计
5.1主程序模块
主程序负责将各个模块例化,使整个程序完整有调理。
主程序包括三个模块:
抢答模块、扬声器模块、计分模块。
Pin【3..0】端口为四位选手的抢答输入端口,抢答信号由bee_in送至扬声器模块,扬声器接到高电平马上发声。
另外,由计分模块显示出该选手的分数,以及对其进行加分减分操作。
在三个模块结合下完成抢答的任务。
各模块所对应的实体名:
(1)抢答模块QD
(2)扬声器模块bee
(3)计分模块count
主程序模块QDQ将这三个模块组合在一起,并对其分别例化,使整个抢答系统完整且不易出错。
图2主程序模块集成芯片
5.2抢答模块
抢答鉴别模块用来准确直观地判断四位抢答者谁最先按下按钮,并为显示端送出信号,使观众能够清楚地知道是哪一组抢答成功,是整个系统的核心部分。
同时组别显示端为下一模块输入信号,以方便主持人为该组抢答成功者进行加减分的操作。
由pin[3..0]输入抢答信号,四位选手分别对应b[1000]、b[0100]、b[0010]、b[0001]。
图3抢答模块集成芯片
抢答语句:
ifrst='1'thengate1<='1';bee_in<='0';
elsifpin=b"1000"thenpout<=b"1000";gate1<='0';
即当主持人按下复位之后,抢答开始。
如果是一号选手抢到,则将b“1000”赋给pin,扬声器响起,并且将该选手的序号由pout端送入计分模块,方便评委给该选手作出评分。
5.3扬声器模块
扬声器模块时钟信号采用50MHZ。
扬声器在接到抢答信号以后持续响两秒钟,然后恢复低电平:
ifclk'eventandclk='1'then
ifnum=1000thennum<=b"0000_0000_0000_0000";
bee_out<='0';
这样可以保证扬声器不会一直响下去。
图4扬声器模块集成芯片
5.4计分模块
如图,pout【3..0】为选择对应的选手。
Start为主持人的开始按键,right_in为加分按键,wrong_in为减分按键,output为对应选手的得分输出。
加分计算方法:
ifpout=b"1000"thencount0<=count1+b"0000_1010";
elsifpout=b"0100"thencount1<=count2+b"0000_1010";
即预先给每位选手置入分数为100分,答对一题后,加十分。
减法同理,见程序清单。
图5计分模块集成芯片
6仿真及调试
6.1抢答模块仿真
图6抢答模块仿真
此仿图中,时钟信号clk为默认值。
先由rst进行清零,随后PIN端口3-0依次输入高电平,即分别在不同时间按下抢答按键,对应的POUT端口立即响应。
本图模拟中pin【3】选手最先按下抢答按键,其对应的pout【3】号输出端口也立即响应;同时,输出给扬声器的信号bee_in也同时响应。
6.2扬声器模块仿真
图7扬声器模块仿真
当bee_in接收到高电平信号时,意为有人已经按下抢答按键,扬声器马上响应,输出bee_out为高电平。
6.3计分模块仿真
图8计分模块仿真
计分模块工作:
当按下STSRT时,start为高电平,计分模块开始工作。
与其对应的选手选择端口POUT中pout【3】为高,意为pout【3】号选手已对问题作出了回答,并且答错,此时由主持人按下wrong_in按键,则判断为该选手答错,扣十分。
Count输出端口由原来的26+25+22=100变为26+24+21=90分。
7总结
刚开始做这个题目的时候,软件还不会用,对于整个题目也是摸不着头脑。
经过一段时间的收集资料,以及对软件功能的摸索,我逐渐开始熟悉这个课题并开始着手设计。
在设计的过程中,遇到了许多困难,比如程序编译错误,仿真工具不会用,波形仿真错误等等。
在与同学讨论的过程中,我的一些问题得到了解决,也收获了很多知识。
这次EDA的课程设计,最大的收获应该是学会了如何熟练运用QuartusII软件的各种功能,以及对VHDL语言的熟悉。
同时,我也学到了不屈不挠不放弃的精神,遇到困难要敢于面对,寻找解决的方法,而不是一个人钻牛角尖。
总之,这次课设让我受益匪浅。
参考文献
[1]郑燕.基于VHDL与QuartusⅡ软件的可编程逻辑器件应用与开发.北京:
国防工业出版社,2011
[2]周润景.基于QuartusII的FPGA/CPLD数字系统设计实例.北京:
电子工业出版社,2010
[3]徐志军,王金明等.EDA技术与VHDL设计.北京:
电子工业出版社,2009.1
[4]王彩凤,胡波等.EDA技术在数字电子技术实验中的应用[J].实验科学与技术,2011,
(1):
1-2.
[5]肖宇;游明星.在QuartusII仿真中输入激励波形数据[J].今日电子,2010,(4):
13-17.
附录程序清单
(1)主程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
--topentity
entityQDQis
port(pin:
instd_logic_vector(3downto0);--qiangdaanjian
rst,clk:
instd_logic;--clk=50M
start:
instd_logic;
right_in,wrong_in:
instd_logic;
bee_out:
outstd_logic;
count0,count1,count2,count3:
bufferstd_logic_vector(7downto0);--jifen
pout:
bufferstd_logic_vector(3downto0));--LED
endQDQ;
architectureQDQofQDQis
componentQDis
port(pin:
instd_logic_vector(3downto0);
clk:
instd_logic;
rst:
instd_logic;
bee_in:
outstd_logic;
pout:
bufferstd_logic_vector(3downto0));
endcomponent;
componentcountis
port(pout:
instd_logic_vector(3downto0);
start:
instd_logic;
right_in,wrong_in:
instd_logic;
count0,count1,count2,count3:
bufferstd_logic_vector(7downto0));
endcomponent;
componentbeeis
port(bee_in:
instd_logic;
bee_out:
outstd_logic;
clk:
instd_logic;
pout:
instd_logic_vector(3downto0));
endcomponent;
signalbee_in:
std_logic;
begin
QD_use:
QDportmap(pin,clk,rst,bee_in,pout);
count_use:
countportmap(pout,start,right_in,wrong_in,count0,count1,count2,count3);
bee_use:
beeportmap(bee_in,bee_out,clk,pout);
endQDQ;
(2)抢答模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityQDis
port(pin:
instd_logic_vector(3downto0);
clk:
instd_logic;
rst:
instd_logic;
bee_in:
outstd_logic;
pout:
bufferstd_logic_vector(3downto0));
endQD;
architectureQDofQDis
signalgate,gate1,clk_1:
std_logic;
begin
clk_1<=gateandclk;
process(rst,gate1)
begin
ifrst='1'thengate<='1';
elsifgate1='0'thengate<='0';
elsenull;
endif;
endprocess;
process(clk_1)
begin
ifclk_1'eventandclk_1='1'then
ifrst='1'thengate1<='1';
bee_in<='0';
elsifpin=b"1000"thenpout<=b"1000";
gate1<='0';
bee_in<='1';
elsifpin=b"0100"thenpout<=b"0100";
gate1<='0';
bee_in<='1';
elsifpin=b"0010"thenpout<=b"0010";
gate1<='0';
bee_in<='1';
elsifpin=b"0001"thenpout<=b"0001";
gate1<='0';
bee_in<='1';
elseNULL;
endif;
endif;
endprocess;
endQD;
(3)扬声器模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitybeeis
port(bee_in:
instd_logic;
bee_out:
outstd_logic;
clk:
instd_logic;
pout:
instd_logic_vector(3downto0));
endbee;
architecturebeeofbeeis
signalnum:
std_logic_vector(15downto0);
signallcx:
std_logic;
begin
process(clk)
begin
lcx<=bee_in;
iflcx='0'andbee_in='1'then
bee_out<='1';
num<=b"0000_0000_0000_0000";
elsifclk'eventandclk='1'then
ifnum=1000thennum<=b"0000_0000_0000_0000";
bee_out<='0';
elsifnum<1000andpout/="0000"thennum<=num+b"0000_0000_0000_0001";bee_out<='1';
endif;
endif;
endprocess;
endbee;
(4)计分模块
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitycountis
port(pout:
instd_logic_vector(3downto0);
start:
instd_logic;
right_in,wrong_in:
instd_logic;
count0,count1,count2,count3:
bufferstd_logic_vector(7downto0));
endcount;
architecturecountofcountis
begin
process(right_in,wrong_in,start)
begin
ifstart='1'thencount0<=b"0110_0100";
count1<=b"0110_0100";
count2<=b"0110_0100";
count3<=b"0110_0100";
elsifright_in='1'then
ifpout=b"1000"thencount0<=count1+b"0000_1010";
elsifpout=b"0100"thencount1<=count2+b"0000_1010";
elsifpout=b"0010"thencount2<=count3+b"0000_1010";
elsifpout=b"0001"thencount3<=count0+b"0000_1010";
elsenull;
endif;
elsifwrong_in='1'then
ifpout=b"1000"thencount0<=count1-b"0000_1010";
elsifpout=b"0100"thencount1<=count2-b"0000_1010";
elsifpout=b"0010"thencount2<=count3-b"0000_1010";
elsifpout=b"0001"thencount3<=count0-b"0000_1010";
elsenull;
endif;
elsenull;
endif;
endprocess;
endcount;