数字式竞赛抢答器VHDL.docx

上传人:b****5 文档编号:7661143 上传时间:2023-05-11 格式:DOCX 页数:17 大小:137.71KB
下载 相关 举报
数字式竞赛抢答器VHDL.docx_第1页
第1页 / 共17页
数字式竞赛抢答器VHDL.docx_第2页
第2页 / 共17页
数字式竞赛抢答器VHDL.docx_第3页
第3页 / 共17页
数字式竞赛抢答器VHDL.docx_第4页
第4页 / 共17页
数字式竞赛抢答器VHDL.docx_第5页
第5页 / 共17页
数字式竞赛抢答器VHDL.docx_第6页
第6页 / 共17页
数字式竞赛抢答器VHDL.docx_第7页
第7页 / 共17页
数字式竞赛抢答器VHDL.docx_第8页
第8页 / 共17页
数字式竞赛抢答器VHDL.docx_第9页
第9页 / 共17页
数字式竞赛抢答器VHDL.docx_第10页
第10页 / 共17页
数字式竞赛抢答器VHDL.docx_第11页
第11页 / 共17页
数字式竞赛抢答器VHDL.docx_第12页
第12页 / 共17页
数字式竞赛抢答器VHDL.docx_第13页
第13页 / 共17页
数字式竞赛抢答器VHDL.docx_第14页
第14页 / 共17页
数字式竞赛抢答器VHDL.docx_第15页
第15页 / 共17页
数字式竞赛抢答器VHDL.docx_第16页
第16页 / 共17页
数字式竞赛抢答器VHDL.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

数字式竞赛抢答器VHDL.docx

《数字式竞赛抢答器VHDL.docx》由会员分享,可在线阅读,更多相关《数字式竞赛抢答器VHDL.docx(17页珍藏版)》请在冰点文库上搜索。

数字式竞赛抢答器VHDL.docx

数字式竞赛抢答器VHDL

数字系统设计与硬件描述语言

期末考试作业

 

题目:

数字式竞赛抢答器设计

学院:

电子信息工程

专业:

电子信息工程

学号:

姓名:

 

一、选题设计描述

1.功能介绍

此设计用于竞赛的四人抢答,有如下的功能:

(1)具有多路抢答功能,台数设计为四;

(2)具有抢答器开始后30秒倒计时,30秒后无人抢答显示超时,并报警;

(3)能显示超前抢答犯规,并警报;

(4)能显示各组得分,大队加分,答错扣分;

当系统复位,主持人按下抢答开始按键,处于使能状态,抢答开始,某路抢答键按下时,该路信号将其他路信号锁存,同时抢答铃声响起,直至此路按键松开,显示该路组号。

2.算法简介

本设计采用分层设计思想,分为:

信号鉴别模块、计时模块、计分模块、BCD译码模块、分频器,还有顶层模块。

信号鉴别模块。

此模块主要实现抢答器的抢答功能,并能够分辨是正常抢答还是提前抢答,选取最先按下的一路信号,锁存其余信号,实现信号选取功能。

在此模块中,用到的信号为抢答信号a、b、c、d;抢答使能信号en;抢答结果信号states;警报时钟信号clk2;复位信号

rst;提前抢答信号fangui。

计时模块。

此模块主要实现抢答过程中的计时功能,在抢答开始后进行30秒的倒计时,且在30秒后显示无人抢答报警信号。

其中有抢答时钟信号clk;系统复位信号rst;抢答使能信号en;无人抢答警报信号warn;计时中止信号stop;计时十位个位信号tb,ta。

计分模块。

此模块主要实现给四个抢答器计分的功能,初始条件下,为每个抢答器信号预制5分,当某组抢答且回答正确时加一分,答错减一分,未获答题机会时保持不变。

其中设有时钟信号clk;复位信号rst;抢答使能信号en;抢答结果显示信号states;记分加减信号add(add=‘1’时为加,add=‘0’时为减);四个信号的得分显示信号a_out,b_out,c_out,d_out。

BCD译码模块。

此模块主要实现将抢答结果信号显示在bcd七段译码器上。

其中输入信号a;输出译码结果信号q。

分频器。

此模块主要实现时钟分频功能。

在开头对时钟信号进行一次千分频。

其中时钟输入信号clkin,输出信号clk。

顶层模块。

将前几个模块综合在一起,形成一个整体。

分频器输出作为其他模块所需的时钟信号,使整个系统正常运转。

二、程序源代码及说明

抢答信号鉴别模块的程序:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityqdjbis

port(clk2,en,rst:

instd_logic;

a,b,c,d:

instd_logic;

fangui:

outstd_logic;

states:

outstd_logic_vector(3downto0));

endqdjb;

architectureoneofqdjbis

signalsinor,fanguif,tmp:

std_logic;

signalcnt:

std_logic_vector(5downto0);

begin

sinor<=aorborcord;

p1:

process(a,rst,b,c,d,tmp)

begin

ifrst='1'then--复位信号有效,系统复位。

tmp<='1';states<="0000";

elsiftmp='1'then

ifa='1'then--判断哪路信号变化,进行选取

states<="0001";tmp<='0';--对states进行置数

elsifb='1'then

states<="0010";tmp<='0';

elsifc='1'then

states<="0011";tmp<='0';

elsifd='1'then

states<="0100";tmp<='0';

elsetmp<='1';states<="0000";

endif;

endif;

endprocessp1;

p2:

process(clk2,en,rst,cnt)--判断是否提前抢答并报警

begin

ifrst='1'then

cnt<="000000";fanguif<='0';--初始化提前抢答犯规信号

elsifclk2'eventandclk2='1'then

ifen='0'andsinor='1'then

ifcnt<"111111"then

fanguif<=notfanguif;cnt<=cnt+1;

elsefanguif<='0';

endif;

endif;

endif;

endprocessp2;

fangui<=fanguif;

endone;

计时模块的程序:

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(3downto0));

endjs;

architectureoneofjsis

signalco:

std_logic;

begin

p1:

process(clk,rst,en,stop,ta)--个位计时信号进行0到9循环计数

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)--十位计时信号0到3变化

begin

ifrst='1'orstop='1'then

tb<="0011";

elsifco'eventandco='1'then

ifen='1'then

iftb="0000"thentb<="0011";

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;

计分模块的程序:

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(3downto0));

endjf;

architectureoneofjfis

begin

p1:

process(clk,rst,add,states,a_out,b_out,c_out,d_out)

begin

if(rst='1')then

a_out<="0101";b_out<="0101";c_out<="0101";d_out<="0101";--初始化置5分

elsifen='1'then

ifclk'eventandclk='1'then

casestatesis

when"0001"=>

ifadd='1'then--add信号为高时,加1分

ifa_out="1111"then--最多15分

a_out<="0000";

elsea_out<=a_out+1;

endif;

elsifadd='0'then--add信号为0,减1分

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;

endprocessp1;

endone;

抢答器顶层模块程序:

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entityqiangdais

port(clkin,clk2,en,a,b,c,d,add,stop,rst:

instd_logic;

fangui,alarm:

outstd_logic;

ta,tb:

bufferstd_logic_vector(3downto0);

states:

bufferstd_logic_vector(3downto0);

statesout:

outstd_logic_vector(0to6);

a_out,b_out,c_out,d_out:

bufferstd_logic_vector(3downto0));

endqiangda;

architecturebhvofqiangdais

componentqdjbis

port(clk2,en,rst:

instd_logic;

a,b,c,d:

instd_logic;

fangui:

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;

componentBCD7is

port(a:

instd_logic_vector(3downto0);

q:

outstd_logic_vector(0to6));

endcomponentBCD7;

componentdivfis

port(clk:

INSTD_LOGIC;

q:

OUTSTD_LOGIC;

qn:

OUTstd_logic_vector(9downto0));

endcomponentdivf;

signalcnt:

std_logic_vector(3downto0);

signalclk:

STD_LOGIC;

signaldivqn:

std_logic_vector(3downto0);

begin

u1:

qdjbportmap(clk2,en,rst,a,b,c,d,fangui,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);

u4:

BCD7portmap(states,statesout);

u5:

divfportmap(clkin,clk,divqn);

endbhv;

BCD7段译码器模块程序:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYBCD7IS

PORT(a:

INSTD_LOGIC_VECTOR(3DOWNTO0);--数据输入

q:

OUTSTD_LOGIC_VECTOR(0TO6));--7段输出

ENDBCD7;

ARCHITECTUREbehavOFBCD7IS

BEGIN

PROCESS(a)

BEGIN

casea(3downto0)is--BCD7段译码表

when"0000"=>q<="1111110";

when"0001"=>q<="0110000";

when"0010"=>q<="1101101";

when"0011"=>q<="1111001";

when"0100"=>q<="0110011";

when"0101"=>q<="1011011";

when"0110"=>q<="1011111";

when"0111"=>q<="1110000";

when"1000"=>q<="1111111";

when"1001"=>q<="1111011";

whenothers=>q<="0000000";

ENDcase;

ENDPROCESS;

ENDbehav;

一千分频器模块程序:

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_unsigned.ALL;

ENTITYdivfIS

PORT(clk:

INSTD_LOGIC;

q:

OUTSTD_LOGIC;

qn:

OUTstd_logic_vector(9downto0));

ENDdivf;

ARCHITECTUREbehavOFdivfIS

signalrst:

std_logic;

signalqn1:

std_logic_vector(9downto0);

BEGIN

PROCESS(clk,rst)

BEGIN

ifrst='1'then

qn1<="000";

elsifclk'eventandclk='1'then

qn1<=qn1+1;

endif;

ENDPROCESS;

rst<='1'whenqn1=1000else'0';

qn<=qn1;--计数

q<=qn1(9);--分频输出,1000分频

ENDbehav;

三、仿真结果及分析

系统总体框图:

对于各个模块的仿真测试所得结果,仿真波形分析如下:

1、信号鉴别模块:

仿真结果:

本模块主要实现抢答功能。

当rst信号为‘1’,en信号为‘1’时,抢答开始,当有一路正常获得抢答时,系统会自动封锁另外三路的抢答信号,只允许一人处于答题状态;当主持人没有允许抢答时,若有人超前抢答,警报会响起,同时只要有人抢答那么抢答显示台(states)会显示哪一个在抢答。

如上图示,在系统第一个复位信号来临后,电路自动复位,在允许抢答信号来临之前(即en=‘0’),b台超前抢答,此时警报响起(即超前抢答警报信号fangui获得一个频率很高的脉冲,就会响起),之后主持人复位,并允许抢答,a台最先抢答,此时抢答显示台显示其台号1。

2、计时模块:

仿真结果:

本模块主要实现计时功能。

当rst信号为‘1’时,计时复位为30秒倒计时,主持人允许的en信号为‘1’时,开始进行倒计时,系统时钟每来一个上升沿,倒计时减1,当到30秒倒计时计玩仍然无人抢答时,警报指示灯亮(即warn=‘1’),若有人抢答主持人可以按下中止键(即stop=‘1’),这样倒计时就会回到30秒初始状态。

图示的情况为在倒计时16秒时,主持人按下中止键,计时器变为初始值30,在下一轮抢答过程中,倒计时为0时仍然无人抢答,此时警报指示信号亮(即warn=‘1’)。

3、计分模块:

仿真结果:

本模块主要实现记分功能,其工作情况为:

系统复位信号来临(即rst=‘1’),将每个选手的得分预置为5分,抢答显示台显示为0即无人抢答,当主持人允许抢答时,若有人抢答,答对(即add=‘1’,假设所有人都答对了)的加一分,答错(即add=‘0’)的减一分,没有抢答的保持不变。

图示,开始后a台连续抢答5题,且都答对,a_out变成10了,之后c台连续抢答成功,且都答对加分,最高记到了15分数码管显示位F,此时获胜并把分数重新置为0。

4、BCD7段译码模块:

仿真结果:

本模块主要实现数据输入的7段输出。

主要是0到9的数分别译出,10到15都译为“”,实现了设置的功能。

5、一千分频模块:

仿真结果:

本模块实现输入信号的一千分频。

另外还可以取其中的其他位,实现其他分频。

如上图,qn[0]实现两分频,qn[5]实现64分频,qn[6]实现128分频,等等。

6、顶层模块:

本模块为顶层文件,是综合抢答器鉴别模块、抢答器计时模块、抢答器记分模块、BCD7段译码模块和一千分频模块而成。

在其仿真波形中描述的情况为:

第一次系统复位后,主任人还没有宣布抢答开始,但a台超前抢答了,fangui信号脉冲波形出现了,主持人就知道a犯规了;接着第二轮系统复位后,主持人宣布抢答开始,b台先抢答成功,抢答显示台号显示为3,单答题错误(add=‘0’),故减分,相应的数码管显示其总分情况。

四、心得体会

这次实验,首先最难的就是模块的划分,必须先有一个总体的规划,然后细化去写每个模块的程序,我在写程序的过程中,参考了课程使用的课件,参考了网上资料,觉得vhdl程序结构特别严密,并且quartusii软件能为我找出程序语法上的低级失误,低级错误,使我对于vhdl语法规则有了更加深刻的理解。

此外,在仿真的过程中,开始时经常忘了将当前实体设置为顶层实体使得仿真过程中出现了多次错误,所以进过这次实验我大概有了一个仿真的固定步骤,一步一步来才不至于出现这种问题。

总之,这次实验还是收获颇丰的,我知道了采用自顶向下的设计思想,那么顶层的设计就很重要,顶层设计好后,下面各部分写起来就比较清楚容易了。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2