VHDL语言四人抢答器.docx
《VHDL语言四人抢答器.docx》由会员分享,可在线阅读,更多相关《VHDL语言四人抢答器.docx(19页珍藏版)》请在冰豆网上搜索。
VHDL语言四人抢答器
中南林业科技大学
课程设计报告
设计名称:
基于VHDL语言的四人抢答器
姓名:
杜涵学号:
20134491
专业班级:
电子信息工程一班
院(系):
计算机与信息工程学院
设计时间:
2015年12月8日
设计地点:
东园22栋201
1、设计题目………………………………………………
2、设计要求………………………………………………
3、设计目的………………………………………………
4、设计背景………………………………………………
5、使用工具………………………………………………
6、设计原理………………………………………………
7、设计结构………………………………………………
8、原理图…………………………………………………
9、模块程序………………………………………………
10、引脚分配………………………………………………
11、设计结果验证………………………………………
12、总结…………………………………………………
1、设计题目:
基于VHDL语言的四路抢答器
二丶设计要求:
1、设计制作一个竞赛抢答器,每组受控于一个抢答开关,分别为S1,S2,S3,S4。
2、控制键K,用于控制整个系统清零,K=0,系统清零;抬起复位键时,K=1,抢答开始。
3、每答对一题计十分,每次答题时间不能超过60秒。
4、第一抢答者按下抢答按钮,对应的led灯点亮,同时数码管显示是第几位抢答者,并封锁其他各组的按钮,即其他任何一组按键都不会再使电路响应。
与此同时,数码管开始显示60秒的倒计时。
通过K键复位,开始下一轮抢答。
3、设计目的
1.通过设计竞赛抢答器的实例来体会设计实际产品的过程,在学好理论的基础上,提高动手实践能力。
2.学习怎样用vhdl语言来描述自己的设计思路,调试硬件后,能够使产品实现功能。
3.进一步掌握用vhdl语言编写数字电路。
4.在做课题过程中,掌握多位共阴极扫描显示数码管的驱动及编码,学会使用和调试硬件。
四、设计背景
现代电子产品几乎渗透了社会的各个领域EDA技术是电子设计的发展趋势, EDA工具从数字系统设计的单一领域,应用范围己涉及模拟、微波等多个领域,可实现各个领域电子系统设计的测试、设计仿真和布局布线等。
设计者只要完成对电子系统的功能描述,就可利用计算机和EDA工具,进行设计处理,最终得到设计结果。
随着大规模集成电路技术和计算机技术的不断发展,即使是普通的电子产品的开发,EDA技术常常使一些原来的技术瓶颈得以轻松突破,从而使产品的开发周期大为缩短、性能价格比大幅提高。
不言而喻,EDA技术将迅速成为电子设计领域中的极其重要的组成部分。
从目前的EDA技术来看,其发展趋势是政府重视、使用普及、应用文泛、工具多样、软件功能强大。
抢答器是一种应用非常广泛的设备,在各种竞猜、抢答场合中,它能迅速、客观地分辨出最先获得发言权的选手。
早期的抢答器只由几个三极管可控硅、发光管等组成,能通过发光管的指示辨认出选手。
现在大多数抢答器均使用单片机和数字集成电路,并增加了许多新的功能,如选手号码显示、抢按器或抢按后的计时、选手得分显示等功能。
五、使用工具:
装有QuartusII软件的PC、Cyclone系列FPGA开发板(ep2c5t144c8)
六、设计原理
根据设计要求,我们经过分析应用分模块的方式比较容易设计该抢答器,我们底层应用VHDL语言,顶层应用原理图的方式进行设计,然后通过仿真验证并不断修改完善设计。
模块:
(1)四人按键抢答模块:
设计为五个输入按键,其实S键为主持人控制抢答过程的按键,当有选手抢答后使其他人的按键无效。
然后根据抢答成功者的编号使对应LED灯点亮,同时输出一个状态让数码管显示抢答者编号。
主持人S键复位,开始下一轮抢答。
(2)计时模块:
在有人抢答后开始一个60秒的倒计时,并输出道数码管显示,CLK来自1HZ分频模块。
(3)计分模块:
在选手答题正确后通过外接ADD键给该选手加分,每次加十分,并输出到数码管显示,CLEAR键为清空所有选手分数。
(4)译码模块:
讲选手序号,倒计时以及选手分数显示出来,CLK由1KHz分频模块提供。
(5)1HZ与1KHz分频模块:
程序由FPGA板的50MHz频率编写。
7、设计结构
8、原理图:
九、模块程序
1、抢答模块
程序:
Libraryieee;
Useieee.std_logic_1164.all;
Useieee.std_logic_unsigned.all;
Useieee.std_logic_arith.all;
EntityQDis
Port(
s,clk:
instd_logic;
s0,s1,s2,s3:
instd_logic;
states:
bufferstd_logic_vector(3downto0);
T:
outstd_logic;
LIANG:
bufferstd_logic_vector(3downto0);
XI:
bufferstd_logic_vector(3downto0));
EndQD;
ArchitectureaaofQDis
signals_0,s_1,s_2,s_3,l_1,l_2,l_3,l_4:
std_logic;
begin
process(s0,s1,s2,s3,s,clk)
begin
XI<="1111";
if(s='0')thens_0<='0';s_1<='0';s_2<='0';s_3<='0';LIANG<="1111";
elsif(clk'eventandclk='1')then
if(s_0='1'ors_1='1'ors_2='1'ors_3='1')
thennull;
elsifs0='0'thens_0<='1';states<="0001";LIANG<="1110";
elsifs1='0'thens_1<='1';states<="0010";LIANG<="1101";
elsifs2='0'thens_2<='1';states<="0011";LIANG<="1011";
elsifs3='0'thens_3<='1';states<="0100";LIANG<="0111";
elsestates<="0000";
endif;
endif;
T<=s_0ors_1ors_2ors_3;
endprocess;
endaa;
说明:
S为主持人复位键;
S0,S1,S2,S3:
四个抢答选手;
STATES:
抢答组号输出
T:
在S按下后使倒计时停止;
LIANG:
控制四个LED灯,点亮选手对应LED灯;
XI:
使另外四个LED灯熄灭;
2、计时模块
程序:
libraryieee;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_1164.all;
entityJSis
port(clk,s,T:
instd_logic;
sw,gw:
bufferstd_logic_vector(3downto0));
endJS;
architectureaaofJSis
begin
process(clk,s,T)
begin
if(s='0')thensw<="0110";gw<="0000";
elsif(clk'eventandclk='1')then
if(T='0')thengw<=gw;sw<=sw;
elsif(gw="0000")thengw<="1001";
if(sw="0000")thensw<="0000";
elsesw<=sw-1;
endif;
else
gw<=gw-1;
endif;
if(sw=0andgw=0)thensw<="0000";gw<="0000";
endif;
endif;
endprocess;
endaa;
说明:
S:
按下后倒计时开始;
SW:
输出倒计时十位数;
GW:
输出倒计时百位数
3、计分模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYJFQIS
PORT(RST:
INSTD_LOGIC;
ADD:
INSTD_LOGIC;
CHOS:
INSTD_LOGIC_VECTOR(3DOWNTO0);
OUT1:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDENTITYJFQ;
ARCHITECTUREARTOFJFQIS
BEGIN
PROCESS(RST,ADD,CHOS)IS
VARIABLEPOINTS_A0:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEPOINTS_B0:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEPOINTS_C0:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEPOINTS_D0:
STD_LOGIC_VECTOR(3DOWNTO0);
BEGIN
IFRST='1'THEN
POINTS_A0:
="0000";
POINTS_B0:
="0000";
POINTS_C0:
="0000";
POINTS_D0:
="0000";
ELSIF(ADD'EVENTANDADD='0')THEN
IFCHOS="0001"THEN
IFPOINTS_A0="1001"THEN
POINTS_A0:
="0000";
ELSE
POINTS_A0:
=POINTS_A0+1;
ENDIF;
ENDIF;
IFCHOS="0010"THEN
IFPOINTS_B0="1001"THEN
POINTS_B0:
="0000";
ELSE
POINTS_B0:
=POINTS_B0+1;
ENDIF;
ENDIF;
IFCHOS="0011"THEN
IFPOINTS_C0="1001"THEN
POINTS_C0:
="0000";
ELSE
POINTS_C0:
=POINTS_C0+1;
ENDIF;
ENDIF;
IFCHOS="0100"THEN
IFPOINTS_D0="1001"THEN
POINTS_D0:
="0000";
ELSE
POINTS_D0:
=POINTS_D0+1;
ENDIF;
ENDIF;
ENDIF;
IFchos="0001"thenout1<=POINTS_a0;
ELSIFchos="0010"thenout1<=POINTS_b0;
ELSIFchos="0011"thenout1<=POINTS_c0;
ELSIFchos="0100"thenout1<=POINTS_D0;
ELSIFchos="0000"thenout1<="0000";
ENDIF;
ENDPROCESS;
ENDARCHITECTUREART;
说明:
RST:
分数清零按键;
ADD:
加分按键;
CHOS=STATES:
输入选手组号;
OUT1:
输出分数;
4、译码显示模块
程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityYMis
port(a:
instd_logic_vector(3downto0);
b:
instd_logic_vector(3downto0);
c:
instd_logic_vector(3downto0);
clk1:
instd_logic;
Y:
instd_logic_vector(3downto0);
adres:
outstd_logic_vector(7downto0);
led7s:
outstd_logic_vector(7downto0));
endYM;
ARCHITECTUREsegledofYMis
signalS:
integerrange0to12;
signalD:
std_logic_vector(3downto0);
signalzero:
std_logic_vector(3downto0);
begin
P1:
process(clk1)
begin
zero<="0000";
ifclk1'eventandclk1='1'then
ifS<5then
S<=S+1;
else
S<=1;
endif;
endif;
endprocessP1;
P2:
process(S)
begin
caseSis
when1=>D<=a;adres<="01111111";
when2=>D<=b;adres<="11011111";
when3=>D<=c;adres<="11101111";
when4=>D<=Y;adres<="11111101";
when5=>D<=zero;adres<="11111110";
whenothers=>null;
endcase;
endprocessP2;
P3:
process(D)
begin
caseDis
when"0000"=>led7s<="11000000";--0
when"0001"=>led7s<="11111001";--1
when"0010"=>led7s<="10100100";--2
when"0011"=>led7s<="10110000";--3
when"0100"=>led7s<="10011001";--4
when"0101"=>led7s<="10010010";--5
when"0110"=>led7s<="10000010";--6
when"0111"=>led7s<="11111000";--7
when"1000"=>led7s<="10000000";--8
when"1001"=>led7s<="10011000";--9
whenothers=>null;
endcase;
endprocessP3;
endsegled;
说明:
A:
输入选手组号;
B:
倒计时十位;
C:
倒计时个位;
Y:
选手分数;
ADRES:
控制数码管位选;
LED7S:
控制数码管段选;
5、分频模块
程序:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityFPis
port(clk:
inSTD_LOGIC;clk1Hz:
outstd_logic);
endFP;
ARCHITECTUREsegledofFPis
begin
PROCESS(clk)
VARIABLEcount:
INTEGERRANGE0TO49999999;
BEGIN
IFclk'EVENTANDclk='1'THEN
IFcount<=24999999THEN
clk1Hz<='0';count<=24999999时divls=0并且count加1
count:
=count+1;
ELSIFcount>=24999999ANDcount<=49999999THEN
clk1Hz<='1';
count:
=count+1;
ELSEcount:
=0;
ENDIF;
ENDIF;
ENDPROCESS;
ENDARCHITECTUREsegled;
(分频1HZ时将其中的数去掉三个9)
6、计分器ADD加分输入消抖模块
程序:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYXIAODIS
PORT(CLK,ADD:
INSTD_LOGIC;
ADD_EN:
OUTSTD_LOGIC);
ENDENTITY;
ARCHITECTUREBHVOFXIAODIS
BEGIN
PROCESS(CLK,ADD)
VARIABLECOUNT1:
INTEGERRANGE0TO100000;
BEGIN
IFADD='0'THEN
IFRISING_EDGE(CLK)THEN
IFCOUNT1<100000THENCOUNT1:
=COUNT1+1;
ELSECOUNT1:
=COUNT1;ENDIF;
IFCOUNT1=99999THENADD_EN<='1';
ELSEADD_EN<='0';ENDIF;
ENDIF;
ELSECOUNT1:
=0;
ENDIF;
ENDPROCESS;
END;
十:
引脚分配
11、设计结果验证
编译成功后下载到FPGA板上进行结果验证:
数码管显示06000;
按下S后,显示05900;
S0抢答后,显示1倒计时停止按下ADD显示10第一个LED灯点亮;
S1抢答后,显示2倒计时停止按下ADD显示10第二个LED灯点亮;
S2抢答后,显示3倒计时停止按下ADD显示10第三个LED灯点亮;
S3抢答后,显示4倒计时停止按下ADD显示10第四个LED灯点亮;
若按下RST键,所有选手得分清零。
十二:
总结
在这次的课程设计中,我对VHDL语言以及QUARTUSII软件的应用有了更深刻的认识。
一个个程序的编写及模块的生成锻炼了我的思维,让我对每个模块的功能、每段程序的作用有了更多的了解。
通过不断的思考,总的原理图才能够完成。
通过不断的出错与修改、完善,最终才能在FPGA上应用,我感觉付出都是值得的。