FPGA设计实践报告 抢答器设计设计.docx
- 文档编号:18265978
- 上传时间:2023-08-14
- 格式:DOCX
- 页数:17
- 大小:131.55KB
FPGA设计实践报告 抢答器设计设计.docx
《FPGA设计实践报告 抢答器设计设计.docx》由会员分享,可在线阅读,更多相关《FPGA设计实践报告 抢答器设计设计.docx(17页珍藏版)》请在冰点文库上搜索。
FPGA设计实践报告抢答器设计设计
课程设计报告
课程设计名称:
FPGA设计实践
设计课题名称:
抢答器设计设计
抢答器设计设计报告
一、设计目的:
本课程的授课对象是电子科学与技术专业本科生,是电子类专业的一门重要的实践课程,是理论与实践相结合的重要环节。
本课程有助于培养学生的数字电路设计方法、掌握模块划分、工程设计思想与电路调试能力,为以后从事各种电路设计、制作与调试工作打下坚实的基础。
二、实验器材和工具软件:
实验器材:
PC机一台、DE2板;
工作软件:
QuartusII9.0。
三、设计内容:
(1)抢答器可容纳四组12位选手,每组设置三个抢答按钮供选手使用。
(2)电路具有第一抢答信号的鉴别和锁存功能。
在主持人将系统复位并发出抢答指令后,蜂鸣器提示抢答开始,时显示器显示初始时间并开始倒计时,若参赛选手按抢答按钮,则该组指示灯亮并用组别显示器显示选手的组别,同时蜂鸣器发出“嘀嘟”的双音频声。
此时,电路具备自锁功能,使其它抢答按钮不起作用。
(3)如果无人抢答,计时器倒计时到零,蜂鸣器有抢答失败提示,主持人可以按复位键,开始新一轮的抢答。
(4)设置犯规功能。
选手在主持人按开始键之前抢答,则认为犯规,犯规指示灯亮和显示出犯规组号,且蜂鸣器报警,主持人可以终止抢答执行相应惩罚。
(5)抢答器设置抢答时间选择功能。
为适应多种抢答需要,系统设有10秒、15秒、20秒和3O秒四种抢答时间选择功能。
四、设计具体步骤:
具体的功能模块的实现:
(一)组别判断电路模块
(1)实现功能:
实现四组十二位选手的组别判断功能,每组设置三个抢答按钮。
若选手成功抢答,则输出选手所在组别。
同时电路自锁功能,使其它抢答按钮不起作用。
如下图所示:
(2)端口说明
1)输入端
a[2..0]:
外接第一组三位选手的抢答按钮;
b[2..0]:
外接第二组三位选手的抢答按钮;
c[2..0]:
外接第三组三位选手的抢答按钮;
d[2..0]:
外接第四组三位选手的抢答按钮;
clk:
外接模块时钟信号;
clr:
外接模块复位按钮。
2)输出端
s[3..0]:
抢答四组输出端。
3)内部信号
h:
存放小组抢答信号。
reset:
复位功能。
(3)原理:
在每次时钟上升沿时判断按键,将扫描到的组别赋给内部信号“h”,若没有按键被按下,则h=“0000”;当复位按钮按下时,即clr=‘1’,则输出s=“0000”并且将另一内部信号reset置1;当复位后,即reset=‘1’,则当有按键按下时将h的值给输出信号s,并且将标志信号reset清零,完成按键组别的输出与组别锁存功能。
(4)用VHDL语言实现如下:
组别判断电路模块oro
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYoroIS
PORT(a,b,c,d:
INSTD_LOGIC_VECTOR(2DOWNTO0);--四组十二人输入端
s:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--四组输出端
clk,clr:
INSTD_LOGIC
);
ENDoro;
ARCHITECTUREbehave_oroOForoIS
SIGNALh:
STD_LOGIC_VECTOR(3DOWNTO0);
SIGNALreset:
STD_LOGIC;
BEGIN
h<="0000"WHEN(a="000"ANDb="000"ANDc="000"ANDd="000")ELSE
"0001"WHEN(a/="000"ANDb="000"ANDc="000"ANDd="000")ELSE
"0010"WHEN(a="000"ANDb/="000"ANDc="000"ANDd="000")ELSE
"0100"WHEN(a="000"ANDb="000"ANDc/="000"ANDd="000")ELSE
"1000"WHEN(a="000"ANDb="000"ANDc="000"ANDd/="000")ELSE
"0000";--判断选中小组
PROCESS(clk)
BEGIN
IF(clk'EVENTANDclk='1')THEN
IFclr='1'THEN
reset<='1';
s<="0000";--复位清零
ENDIF;
IFh/="0000"THEN
IFreset='1'THEN
s<=h;--选中小组输出
reset<='0';
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
ENDbehave_oro;
(二)犯规控制电路模块
(1)实现功能:
选手在主持人开始倒计时之前抢答,则认为犯规,犯规指示灯亮并输出犯规组号,且蜂鸣器报警。
如下图所示:
(2)端口说明
1)输入端
en:
倒计时启动输入端;
a[3..0]:
按键组别的信息输入端;
2)输出端
s[3..0]:
hex[3..0]:
y:
连接外部违规指示灯输出端;
bell:
连接外部蜂鸣器输出端;
(3)原理:
组别判别模块的s输入至a,则a为按键组别的信息;en接主持人的“开始”按键;由于无论是在正常情况还是犯规情况下按下按键,都必须显示按键的组别且蜂鸣器响,所以将a的值给hex以输出按键组别,且在有按键被按下,即a/="0000"时,bell输出为‘1’,否则为‘0’;若在开始之前有按键按下,即en='0'且a/="0000"时,y输出为‘1’,否则为‘0’;若在开始之后有按键按下,将a的值给s,使该组指示灯亮,开始之前s输出“0000”。
(4)用VHDL语言实现如下:
--犯规控制电路模块WG
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYwgIS
PORT(en:
INSTD_LOGIC;
a:
instd_logic_vector(3downto0);
s:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);--led显示组别号
hex:
OUTSTD_LOGIC_VECTOR(3DOWNTO0);
y,bell:
OUTSTD_LOGIC);--犯规灯输出端,蜂鸣器输出端
ENDwg;
ARCHITECTUREbehave_wgOFwgIS
BEGIN
hex<=a;
s<=aWHENen='1'ELSE"0000";
y<='1'WHENen='0'ANDa/="0000"ELSE'0';
bell<='1'WHENa/="0000"ELSE'0';
ENDbehave_wg;
(三)抢答信号判别电路模块
(1)实现功能:
将抢答到的组别信息显示在7段数码管上。
如下图所示:
(2)端口说明
1)输入端
s:
抢答组别输入端;
2)输出端
ex:
抢答组别号输出端。
(3)原理:
数码管由7段显示输出,利用7个位的组合输出,可以形成0-9的数字对应显示。
试验中所用到的为低电平有效,故此,输出‘0’为亮,‘1’为暗。
(4)用VHDL语言实现如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYqdIS
PORT(s:
INSTD_LOGIC_VECTOR(3DOWNTO0);--抢答组别输入端
ex:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));--抢答组别号输出端
ENDqd;
ARCHITECTUREbehave_qdOFqdIS
BEGIN
WITHs(3DOWNTO0)SELECT
ex<="1111001"WHEN"0001",--第一组
"0100100"WHEN"0010",--第二组
"0110000"WHEN"0100",--第三组
"0011001"WHEN"1000",--第四组
"1111111"WHENOTHERS;--没人选择
ENDbehave_qd;
(四)分频电路模块
(1)实现功能:
将抢答到的组别信息显示在7段数码管上。
如下图所示:
(2)端口说明
1)输入端
clkin:
频率输入端;
2)输出端
clkout:
频率输出端。
(3)原理:
对一个2X分频的电路电路来说,counter上限是N=x-1。
50MHz分频为1Hz频率时钟即每1秒亮一下
(4)用VHDL语言实现如下:
--分频电路模块DIV
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYdivIS
PORT(clkin:
INSTD_LOGIC;
clkout:
OUTSTD_LOGIC);
ENDdiv;
ARCHITECTUREbehave_divOFdivIS
constantN:
Integer:
=24999999;--50MHz分频为1Hz频率时钟即每1秒亮一下
SIGNALcounter:
IntegerRANGE0TON;
SIGNALclk:
STD_LOGIC;
BEGIN
PROCESS(clkin)
BEGIN
IFRISING_EDGE(clkin)THEN
IFcounter=NTHEN
counter<=0;
clk<=NOTclk;
ELSE
counter<=counter+1;
ENDIF;
ENDIF;
ENDPROCESS;
clkout<=clk;
ENDbehave_div;
(五)倒计时控制电路模块
(1)实现功能:
具有10秒、15秒、20秒和30秒四种抢答时间选择功能,并对所选择模式进行倒计,判断倒计时是否到0。
如下图所示:
(2)端口说明
1)输入端
clk:
1Hz分频输入端;;
clr:
外接模块复位输入端;
en:
启动输入端;
g:
组别输入端;
s:
倒计时模式选择输入端;
2)输出端
q:
倒计时显示当前时间输出端;
t:
倒计时到0后蜂鸣器警报输出端。
(3)原理:
clk接1Hz分频器,g接组别判别模块的输出s。
通过判断s的值设置内部减法计数器的初始值q端输出当前计数值。
当计数到0且g=“0000”时t输出高电平以驱动蜂鸣器,发出时间到的警报。
(4)用VHDL语言实现如下:
--倒计时控制电路模块DJS
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYdjsIS
PORT(clk,clr,en:
INSTD_LOGIC;
g:
INSTD_LOGIC_VECTOR(3DOWNTO0);
s:
INSTD_LOGIC_VECTOR(1downto0);
q:
BUFFERSTD_LOGIC_VECTOR(4downto0);
t:
OUTSTD_LOGIC);
ENDdjs;
ARCHITECTUREbehave_djsOFdjsIS
BEGIN
PROCESS(clk,clr,s)
BEGIN
IF(clr='1')THEN
IF(s="00")THENq<="01010";--10s
ELSIF(s="01")THENq<="01111";--15s
ELSIF(s="10")THENq<="10100";--20s
ELSEq<="11110";--30s
ENDIF;
ELSE
IFRISING_EDGE(clk)THEN
IFen='1'THENq<=q-1;
IF(q="00000"ANDg="0000")THENt<='1';
ELSEt<='0';
ENDIF;
ENDIF;
ENDIF;
ENDIF;
ENDPROCESS;
ENDbehave_djs;
(六)显示译码电路模块
(1)实现功能:
倒计时时间在7段数码管上输出。
如下图所示:
(2)端口说明
1)输入端
din:
倒计时时间输入端;
2)输出端
dout:
倒计时时间输出端。
(3)原理:
数码管由7段显示输出,利用7个位的组合输出,可以形成0-9的数字对应显示。
试验中所用到的为低电平有效,故此,输出‘0’为亮,‘1’为暗。
(4)用VHDL语言实现如下:
--显示译码电路模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYledIS
PORT(din:
INSTD_LOGIC_VECTOR(4DOWNTO0);
dout:
OUTSTD_LOGIC_VECTOR(13DOWNTO0)
);
ENDled;
ARCHITECTUREbehave_ledOFledIS
BEGIN
WITHdin(4DOWNTO0)SELECT
dout<="10000001000000"WHEN"00000",--"0"
"10000001111001"WHEN"00001",--"1"
"10000000100100"WHEN"00010",--"2"
"10000000110000"WHEN"00011",--"3"
"10000000011001"WHEN"00100",--"4"
"10000000010010"WHEN"00101",--"5"
"10000000000010"WHEN"00110",--"6"
"10000001111000"WHEN"00111",--"7"
"10000000000000"WHEN"01000",--"8"
"10000000010000"WHEN"01001",--"9"
"11110011000000"WHEN"01010",--"10"
"11110011111001"WHEN"01011",--"11"
"11110010100100"WHEN"01100",--"12"
"11110010110000"WHEN"01101",--"13"
"11110010011001"WHEN"01110",--"14"
"11110010010010"WHEN"01111",--"15"
"11110010000010"WHEN"10000",--"16"
"11110011111000"WHEN"10001",--"17"
"11110010000000"WHEN"10010",--"18"
"11110010010000"WHEN"10011",--"19"
"01001001000000"WHEN"10100",--"20"
"01001001111001"WHEN"10101",--"21"
"01001000100100"WHEN"10110",--"22"
"01001000110000"WHEN"10111",--"23"
"01001000011001"WHEN"11000",--"24"
"01001000010010"WHEN"11001",--"25"
"01001000000010"WHEN"11010",--"26"
"01001001111000"WHEN"11011",--"27"
"01001000000000"WHEN"11100",--"28"
"01001000010000"WHEN"11101",--"29"
"01100001000000"WHEN"11110",--"30"
"11111111111111"WHENOTHERS;--""
ENDbehave_led;
(七)蜂鸣器
(1)实现功能:
当倒计时倒计到0秒,或有人违规时,蜂鸣器响。
如下图所示:
(2)端口说明
1)输入端
a:
倒计时为‘0’输入端;
b:
违规信号输入端;
2)输出端
sound:
外接蜂鸣器输出端。
(3)原理:
当a输入倒计时为‘0’信号,或b输入违规信号时,蜂鸣器响。
(4)用VHDL语言实现如下:
--蜂鸣器控制电路模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
entitysoundis
port(a,b:
instd_logic;
sound:
outstd_logic);
endsound;
architecturebehave_soundofsoundis
begin
sound<=aorb;
endbehave_sound;
(八)
用原理图方法将各模块连接起来构成系统
五、设计收获以及存在的问题
在这次课程设计中,我做的题目是抢答器的设计。
我起初看到这个题目中有这么多的要求时感觉有点摸不着头脑,不知从哪里下手,但是在第一天查阅了大量相关资料后有了些许头绪,虽然那些资料中绝大部分的功能要求和我此次要做的要求是不一样的,但是却给了我些许思路。
在任务书中提示的帮助下,我逐步理清思路,决定将系统分为组别判断电路模块ORO,抢答信号判别电路模块QD,犯规控制电路模块WG,分频电路模块DIV,倒计时控制电路模块DJS,显示译码电路模块LED和蜂鸣器控制模块SOUND总计七个模块,并将这些模块逐个击破。
由于在以前的实验课中已经做过分频器电路与显示译码电路,于是我决定先从熟悉的着手,在较快完成这两个模块后,再按照总体思路依次完成另外四个模块,其中抢答信号判别电路模块与显示译码电路模块较为类似,故此这一模块也完成的较为顺利。
在各模块设计完成后,再用电路原理图方法将各模块连接构成系统,编译成功后下载到DE2版,完成设计。
在写模块中我也遇到了不少问题,如对组别判断电路模块ORO中,如何实现所存功能和判断最先按键组别都让我花了不少时间。
此模块首先的一个功能就是选出最快按键的那组。
最后我决定在模块中加入内部信号来完成所存功能,具体原理在该模块的原理中已经写到,故此省略。
对于如何选择最早按键组别,我则希望通过在极短时间内多次扫描输入端来确定。
由于人的反应速度远远小于50MHz,各组之间按键时间间隔远大于1/50Ms,所以在每次时钟(50MHz)上升沿时判断按键,便可将最快的一组选出来。
在写倒计时模块程序时,我则通过直接由经分频器重新分频后的频率直接作为输入频率,较为简洁的完成30秒内的倒计时功能。
此后,为了进一步完善,我在程序中加入了和蜂鸣器控制模块SOUND,总计7个模块。
通过此次设计,我掌握了数字电路的设计方法,尤其是模块划分、工程设计思想与电路调试能力,都有了一定的提高。
此外,由于系统中所用到的引脚较多,在下载后出现问题时,不太容易把他们分清楚,找到问题的根源,这也给我完成此次课程设计造成了一定的麻烦。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FPGA设计实践报告 抢答器设计设计 FPGA 设计 实践 报告 抢答