VHDL语言四人抢答器Word文档格式.docx
《VHDL语言四人抢答器Word文档格式.docx》由会员分享,可在线阅读,更多相关《VHDL语言四人抢答器Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
装有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频率编写。
七、设计结构
八、原理图:
九、模块程序
1、抢答模块
程序:
Libraryieee;
Useieee.std_logic_1164.all;
Use ieee.std_logic_unsigned.all;
Useieee.std_logic_arith.all;
EntityQDis
Port(
s,clk:
instd_logic;
ﻩﻩs0,s1,s2,s3:
in std_logic;
ﻩstates:
buffer std_logic_vector(3downto 0);
ﻩﻩT:
out std_logic;
ﻩﻩLIANG:
buffer std_logic_vector(3 downto0);
XI:
bufferstd_logic_vector(3downto0));
ﻩ
EndQD;
Architectureaaof QDis
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')then s_0<='0'
s_1<
='
0'
;
s_2<
0'
s_3<
LIANG<
="1111"
elsif(clk'
eventandclk='1'
) then
if (s_0='1'
ors_1='
1'
ors_2='
ors_3='1'
)
then null;
elsifs0='
0'thens_0<
='1'
states<
="
0001"
LIANG<
1110"
elsif s1='0'
thens_1<
='
states<
0010"
LIANG<="
1101"
elsifs2='
thens_2<='
states<="
0011"
LIANG<
="1011";
elsifs3='
thens_3<='
states<
0100"
LIANG<
0111"
elsestates<
0000"
endif;
end if;
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;
entityJS is
port(clk,s,T:
instd_logic;
ﻩsw,gw:
buffer std_logic_vector(3downto0));
endJS;
architectureaaofJS is
begin
process(clk,s,T)
begin
if(s='
) thensw<="
0110"
gw<
0000"
elsif(clk'eventandclk='1'
)then
if(T='
0')then gw<=gw;
sw<
=sw;
elsif(gw="
)thengw<
1001";
if(sw="
0000"
)thensw<
="
0000"
elsesw<
=sw-1;
ﻩﻩendif;
ﻩelse
gw<
=gw-1;
end if;
if(sw=0andgw=0) thensw<
gw<
0000";
endif;
end if;
endprocess;
endaa;
说明:
S:
按下后倒计时开始;
SW:
输出倒计时十位数;
GW:
输出倒计时百位数
3、计分模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYJFQIS
PORT(RST:
INSTD_LOGIC;
ADD:
IN STD_LOGIC;
CHOS:
IN STD_LOGIC_VECTOR(3DOWNTO0);
OUT1:
OUTSTD_LOGIC_VECTOR(3 DOWNTO0));
ENDENTITYJFQ ;
ARCHITECTUREARTOFJFQIS
BEGIN
PROCESS(RST,ADD,CHOS)IS
VARIABLEPOINTS_A0:
STD_LOGIC_VECTOR(3 DOWNTO0);
VARIABLE POINTS_B0:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEPOINTS_C0:
STD_LOGIC_VECTOR(3DOWNTO0);
VARIABLEPOINTS_D0:
STD_LOGIC_VECTOR(3DOWNTO 0);
BEGIN
IF RST='1'THEN
POINTS_A0:
="0000"
POINTS_B0:
0000";
POINTS_C0:
0000"
POINTS_D0:
0000"
ELSIF (ADD'
EVENTAND ADD='
) THEN
IFCHOS="0001"
THEN
IFPOINTS_A0="
1001"
THEN
POINTS_A0:
ELSE
POINTS_A0:
=POINTS_A0+1;
ENDIF;
END IF;
IFCHOS="
0010" THEN
IFPOINTS_B0="
1001"
POINTS_B0:
0000";
POINTS_B0:
=POINTS_B0+1;
ENDIF;
ENDIF;
IFCHOS="
THEN
IFPOINTS_C0="
THEN
POINTS_C0:
ELSE
POINTS_C0:
=POINTS_C0+1;
ENDIF;
ENDIF;
IFCHOS="
0100"THEN
IFPOINTS_D0="
1001"
THEN
POINTS_D0:
ELSE
POINTS_D0:
=POINTS_D0+1;
ENDIF;
END IF;
IFchos="0001"
thenout1<
=POINTS_a0;
ELSIFchos="
0010"
thenout1<=POINTS_b0;
ELSIFchos="
0011"
thenout1<
=POINTS_c0;
ELSIF chos="
0100"
thenout1<
=POINTS_D0;
ELSIFchos="
thenout1<
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;
entityYM is
port(a:
instd_logic_vector(3downto 0);
b:
instd_logic_vector(3 downto0);
c:
instd_logic_vector(3downto0);
clk1:
instd_logic;
Y:
instd_logic_vector(3downto0);
adres:
outstd_logic_vector(7downto 0);
led7s:
outstd_logic_vector(7downto 0) );
endYM;
ARCHITECTUREsegledofYMis
signal S:
integerrange 0to12;
signalD:
std_logic_vector(3 downto0);
signalzero:
std_logic_vector(3downto0);
begin
P1:
process(clk1)
begin
zero<
ifclk1'
eventand clk1='
1'
then
ifS<
5then
ﻩ S<
=S+1;
else
S<
=1;
endif;
endif;
endprocessP1;
P2:
process(S)
begin
ﻩcaseSis
ﻩwhen 1=>
D<
=a;
adres<="01111111"
ﻩwhen 2=>
=b;
adres<="11011111"
ﻩﻩwhen3=>D<=c;
adres<
11101111"
ﻩwhen4=>
=Y;
adres<
11111101"
ﻩﻩwhen 5=>
=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;
end case;
endprocessP3;
end segled;
A:
输入选手组号;
B:
倒计时十位;
C:
倒计时个位;
Y:
选手分数;
ADRES:
控制数码管位选;
LED7S:
控制数码管段选;
5、分频模块
library ieee;
useieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entity FPis
port( clk:
inSTD_LOGIC;
clk1Hz:
out std_logic);
endFP;
ARCHITECTUREsegledofFP is
begin
PROCESS(clk)
VARIABLEcount:
INTEGER RANGE 0TO 49999999;
BEGIN
IF clk'
EVENTANDclk='
1'THEN
IFcount<
=24999999THEN
clk1Hz<
0';
count<=24999999时divls=0并且count加1
count:
=count+1;
ELSIF count>
=24999999ANDcount<
=49999999 THEN
clk1Hz<
count:
=count+1;
ELSE count:
=0;
ENDIF;
END IF;
ENDPROCESS;
ENDARCHITECTUREsegled;
(分频1HZ时将其中的数去掉三个9)
6、计分器ADD加分输入消抖模块
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYXIAODIS
PORT(CLK,ADD:
INSTD_LOGIC;
ADD_EN:
OUT STD_LOGIC );
END ENTITY;
ARCHITECTUREBHVOFXIAODIS
PROCESS(CLK,ADD)
VARIABLECOUNT1:
INTEGER RANGE0TO 100000;
BEGIN
IFADD='
THEN
IFRISING_EDGE(CLK)THEN
IFCOUNT1<
100000THENCOUNT1:
=COUNT1+1;
ELSE COUNT1:
=COUNT1;
END IF;
IFCOUNT1=99999 THEN ADD_EN<
='1';
ELSEADD_EN<='
0';
ENDIF;
ENDIF;
ELSECOUNT1:
ENDIF;
ENDPROCESS;
END;
十:
引脚分配
十一、设计结果验证
编译成功后下载到FPGA板上进行结果验证:
数码管显示060 00;
按下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上应用,我感觉付出都是值得的。