VHDL语言四人抢答器Word文档格式.docx

上传人:b****6 文档编号:21213243 上传时间:2023-01-28 格式:DOCX 页数:18 大小:446.50KB
下载 相关 举报
VHDL语言四人抢答器Word文档格式.docx_第1页
第1页 / 共18页
VHDL语言四人抢答器Word文档格式.docx_第2页
第2页 / 共18页
VHDL语言四人抢答器Word文档格式.docx_第3页
第3页 / 共18页
VHDL语言四人抢答器Word文档格式.docx_第4页
第4页 / 共18页
VHDL语言四人抢答器Word文档格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

VHDL语言四人抢答器Word文档格式.docx

《VHDL语言四人抢答器Word文档格式.docx》由会员分享,可在线阅读,更多相关《VHDL语言四人抢答器Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。

VHDL语言四人抢答器Word文档格式.docx

装有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上应用,我感觉付出都是值得的。

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

当前位置:首页 > 高等教育 > 医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1