基于VHDL的多功能电子秒表设计.docx

上传人:b****6 文档编号:6287154 上传时间:2023-01-05 格式:DOCX 页数:13 大小:71.59KB
下载 相关 举报
基于VHDL的多功能电子秒表设计.docx_第1页
第1页 / 共13页
基于VHDL的多功能电子秒表设计.docx_第2页
第2页 / 共13页
基于VHDL的多功能电子秒表设计.docx_第3页
第3页 / 共13页
基于VHDL的多功能电子秒表设计.docx_第4页
第4页 / 共13页
基于VHDL的多功能电子秒表设计.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

基于VHDL的多功能电子秒表设计.docx

《基于VHDL的多功能电子秒表设计.docx》由会员分享,可在线阅读,更多相关《基于VHDL的多功能电子秒表设计.docx(13页珍藏版)》请在冰豆网上搜索。

基于VHDL的多功能电子秒表设计.docx

基于VHDL的多功能电子秒表设计

 

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

期末考试作业

 

题目:

多功能电子秒表设计

学院:

电子信息工程学院

专业:

电子信息工程

学号:

3009204308

姓名:

张嘉男

 

2012-05-31

一、选题设计描述

1.功能介绍

本系统能够精确计时,具有复位、计时功能,可显示计时时间的分、秒和0.1秒等度量,最长计时为10分钟。

2.算法简介

本系统以50Mhz时钟信号,rst复位信号,startstop开始/暂停信号为输入,以四位7段数码管显示为输出,实现了上述功能,系统原理图符号如下所示:

系统RTL级框图如下所示:

本系统的实现共分为以下几个模块:

模块一、分频器

该模块又分为1/5000分频器divf1,1/1000分频器divf2两部分,实现对50MHz系统时钟的两次分频,最终将系统时钟分频到10Hz,作为最低位(0.1秒位)的输入时钟。

divf1模块输入信号为50MHz时钟信号,复位信号,输出信号为10kHz时钟信号;

divf2模块输入信号为10KHz时钟(实现上不严格是,见后面T触发器模块解释)信号,输出,复位信号,输出信号为10Hz时钟信号。

模块二、计数器

该模块又分为十进制计数器counter10,和六进制计数器counter6,分别实现对输入时钟信号的十进制、六进制计数,十进制计数器在系统中用于对0.1秒位,秒个位,分位的输入时钟计数(1s=10*0.1s),六进制计数器在系统中用于对秒十位的输入时钟计数(1min=60s)。

模块三、T触发器Ttrigger

该模块实现系统复位,开始/暂停功能,以startstop信号作为触发器的时钟输入,复位信号作为T信号,触发器输出与分位进位信号和复位信号相与,其输出在作为10Hz时钟信号输入给0.1s位十进制计数器。

模块四、4-7译码器bcdsev

该模块实现将各计数器的计数输出显示到数码管上,输入信号为计数器4位计数输出,输出信号为相应数码管7段,当相应段为低电平(’0’)时亮起。

系统整体运行流程为:

50MHz时钟信号输入到1/5000分频器中,分为10kHz的时钟,再经过一个用来控制系统复位、启停的与门电路后,输入到1/1000的分频器中,分为10Hz的时钟,此时钟信号输入到一个十进制计数器内,十进制计数器输出4位计数信号给4-7译码器,同时输出1位进位信号给另一个十进制计数器内,4-7译码器输出7位段选信号给0.1s显示位数码管,显示此时0.1s位数值,而另三个计数器与此计数器进行相同的工作,唯一不同的是用于10s位计时的计数器用的是六进制计数器。

与此同时,当复位信号被触发(置低)时,第二个分频器divf2输入时钟为零(与门控制),同时4位数码管输出为0000,实现系统复位,当复位信号取消(置高),startstop信号每触发一个上升沿,秒表开始/暂停一次。

当秒表运行到10分钟后,进位信号使数码管输出归零,系统实现复位。

二、程序源代码及说明

-------------------------------------------------------------------------

模块名称:

divf1.vhd

模块功能:

实现对50MHz时钟信号的第一次分频

端口信号说明:

clk1:

待分频时钟信号

rst1:

分频器复位信号

q1:

分频后的输出信号

------------------------------------------------------------------------

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_unsigned.ALL;

ENTITYdivf1IS

PORT(clk1:

INSTD_LOGIC;

rst1:

instd_logic;

q1:

OUTSTD_LOGIC);

ENDdivf1;

ARCHITECTUREbehavOFdivf1IS

signalqn1:

std_logic_vector(13downto0);

BEGIN

PROCESS(clk1,rst1)

BEGIN

ifrst1='0'then

qn1<="00000000000000";

elsifclk1'eventandclk1='1'then

ifqn1<10000thenqn1<=qn1+1;

elseqn1<=(OTHERS=>'0');

endif;

endif;

ENDPROCESS;

q1<=qn1(13);--分频输出

ENDbehav;

-------------------------------------------------------------------------

模块名称:

divf2.vhd

模块功能:

实现对50MHz时钟信号的第二次分频

端口信号说明:

clk2:

待分频时钟信号

rst2:

分频器复位信号

q2:

分频后的输出信号

------------------------------------------------------------------------

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_unsigned.ALL;

ENTITYdivf2IS

PORT(clk2:

INSTD_LOGIC;

rst2:

instd_logic;

q2:

OUTSTD_LOGIC);

ENDdivf2;

ARCHITECTUREbehavOFdivf2IS

signalqn2:

std_logic_vector(9downto0);

BEGIN

PROCESS(clk2,rst2)

BEGIN

ifrst2='0'then

qn2<="0000000000";

elsifclk2'eventandclk2='1'then

ifqn2<1000thenqn2<=qn2+1;

elseqn2<=(OTHERS=>'0');

endif;

endif;

ENDPROCESS;

q2<=qn2(9);--分频输出

ENDbehav;

----------------------------------------------------------------

模块名称:

counter10.vhd

模块功能:

十进制计数器

端口信号说明:

CLK10:

计数器时钟信号

RST10:

计数器复位信号

CQ10:

计数器4位计数输出

COUT10:

计数器进位输出

------------------------------------------------------------------

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYcounter10IS

PORT(CLK10,RST10:

INSTD_LOGIC;

CQ10:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

COUT10:

OUTSTD_LOGIC);

ENDcounter10;

ARCHITECTUREbehavOFcounter10IS

BEGIN

PROCESS(CLK10,RST10)

VARIABLECQI10:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

IFRST10='0'THENCQI10:

=(OTHERS=>'0');--计数器复位

ELSIFCLK10'EVENTANDCLK10='1'THEN--检测时钟上升沿

IFCQI10<"1001"THENCQI10:

=CQI10+1;COUT10<='0';--允许计数

ELSECQI10:

="0000";COUT10<='1';--大于9,计数值清零

ENDIF;

ENDIF;

--IFCQI10="1001"THENCOUT10<='1';--计数大于9,输出进位信号

--ELSECOUT10<='0';

--ENDIF;

CQ10<=CQI10;--将计数值向端口输出

ENDPROCESS;

ENDbehav;

 

----------------------------------------------------------------

模块名称:

counter6.vhd

模块功能:

十进制计数器

端口信号说明:

CLK6:

计数器时钟信号

RST6:

计数器复位信号

CQ6:

计数器4位计数输出

COUT6:

计数器进位输出

------------------------------------------------------------------

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYcounter6IS

PORT(CLK6,RST6:

INSTD_LOGIC;

CQ6:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

COUT6:

OUTSTD_LOGIC);

ENDcounter6;

ARCHITECTUREbehavOFcounter6IS

BEGIN

PROCESS(CLK6,RST6)

VARIABLECQI6:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

IFRST6='0'THENCQI6:

=(OTHERS=>'0');--计数器复位

ELSIFCLK6'EVENTANDCLK6='1'THEN--检测时钟上升沿

IFCQI6<"0101"THENCQI6:

=CQI6+1;COUT6<='0';--允许计数

ELSECQI6:

="0000";COUT6<='1';--clearwhenit'sbiggerthan5

ENDIF;

ENDIF;

--IFCQI6="0101"THENCOUT6<='1';

--ELSECOUT6<='0';

--ENDIF;

CQ6<=CQI6;--将计数值向端口输出

ENDPROCESS;

ENDbehav;

---------------------------------------------------------------------------------

模块名称:

bcdsev.vhd

模块功能:

4-7译码器

端口信号说明:

a:

4位输入

rstsev:

复位信号

q:

7段输出

-----------------------------------------------------------------------------------

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYbcdsevIS

PORT(a:

INSTD_LOGIC_VECTOR(3DOWNTO0);

rstsev:

instd_logic;

q:

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

ENDbcdsev;

ARCHITECTUREbehavOFbcdsevIS

BEGIN

PROCESS(a)

BEGIN

ifrstsev='0'thenq<="0000001";

else

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

when"0000"=>q<="0000001";when"0001"=>q<="1001111";

when"0010"=>q<="0010010";when"0011"=>q<="0000110";

when"0100"=>q<="1001100";when"0101"=>q<="0100100";

when"0110"=>q<="0100000";when"0111"=>q<="0001111";

when"1000"=>q<="0000000";when"1001"=>q<="0000100";

whenothers=>q<="1111111";

ENDcase;

endif;

ENDPROCESS;

ENDbehav;

-------------------------------------------------------------------

模块名称:

Ttrigger.vhd

模块功能:

T触发器

端口信号说明:

t:

t信号

clk:

时钟信号

q:

输出信号

-----------------------------------------------------------------------

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITYTtriggerIS

port(t:

instd_logic;

clk:

instd_logic;

q:

outstd_logic);

endentityTtrigger;

architecturebehofTtriggeris

signaltmp:

std_logic:

='0';

begin

process(clk,t)

begin

ifclk'EVENTANDclk='1'THEN

ift='1'then

tmp<=nottmp;

endif;

endif;

q<=tmp;

endprocess;

endbeh;

-----------------------------------------------------------------------------

模块名称:

bcdcounter.vhd

模块功能:

系统顶层文件,调用各功能模块

模块端口信号说明:

clk50MHz:

50MHz时钟信号

rst:

复位信号

startstop:

系统启/停信号

dsecsmg[6…0]:

0.1s位数码管7段输出

secsmg[6…0]:

1s位数码管7段输出

secdsmg[6…0]:

10s位数码管7段输出

secmsmg[6…0]:

分钟位数码管7段输出

模块内部信号说明:

clk10khz:

第一次分频后的10khz信号

triggerout:

T触发器输出信号

clk10khzafterand:

经过控制与门后的10khz信号

clk10hz:

第二次分频后的10hz时钟信号

dsecout:

0.1s计数器进位信号

secout:

1s计数器进位信号

secdout:

10s计数器进位信号

bdsec[3..0]:

0.1s计数器计数信号

bsec[3..0]:

1s计数器计数信号

bsecd[3..0]:

10s计数器计数信号

bsecm[3..0]:

分钟计数器计数信号

cn:

分钟计数器进位信号

------------------------------------------------------------------------

--多功能电子秒表设计

--基本要求:

精确计时,具有复位、计时功能,可显示计时时间的分、秒和0.1秒等度量,最长计时为10分钟

libraryieee;

useieee.std_logic_1164.all;

entitybcdcounteris

port(clk50M:

instd_logic;

startstop:

instd_logic;

rst:

instd_logic;

dsecsmg,secsmg,secdsmg,secmsmg:

outstd_logic_vector(0to6));

endbcdcounter;

architectureoneofbcdcounteris

componentdivf1

PORT(clk1:

INSTD_LOGIC;

rst1:

instd_logic;

q1:

OUTSTD_LOGIC);

ENDcomponentdivf1;

componentTtrigger

port(t:

instd_logic;

clk:

instd_logic;

q:

outstd_logic);

endcomponentTtrigger;

componentdivf2

PORT(clk2:

INSTD_LOGIC;

rst2:

instd_logic;

q2:

OUTSTD_LOGIC);

ENDcomponentdivf2;

componentcounter10

PORT(CLK10,RST10:

INSTD_LOGIC;

CQ10:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

COUT10:

OUTSTD_LOGIC);

ENDcomponentcounter10;

componentcounter6

PORT(CLK6,RST6:

INSTD_LOGIC;

CQ6:

OUTSTD_LOGIC_VECTOR(3DOWNTO0);

COUT6:

OUTSTD_LOGIC);

ENDcomponentcounter6;

componentbcdsev

PORT(a:

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

rstsev:

instd_logic;

q:

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

ENDcomponentbcdsev;

signalclk10khz:

std_logic;

signaltriggerout:

std_logic;

signalclk10khzafterand:

std_logic;

signalclk10hz:

std_logic;

signaldsecout:

std_logic;

signalsecout:

std_logic;

signalsecdout:

std_logic;

signalbdsec,bsec,bsecd,bsecm:

std_logic_vector(3downto0);

signalcn:

std_logic;

begin

divf1ex:

divf1portmap(clk50M,rst,clk10khz);

trigger1:

Ttriggerportmap(rst,startstop,triggerout);

clk10khzafterand<=clk10khzandtriggeroutand(notcn);

divf2ex:

divf2portmap(clk10khzafterand,rst,clk10hz);

dseccouter10:

counter10portmap(clk10hz,rst,bdsec,dsecout);

seccounter10:

counter10portmap(dsecout,rst,bsec,secout);

secdcounter6:

counter6portmap(secout,rst,bsecd,secdout);

secmconter10:

counter10portmap(secdout,rst,bsecm,cn);

bcddsec:

bcdsevportmap(bdsec,rst,dsecsmg);

bcdsec:

bcdsevportmap(bsec,rst,secsmg);

bcdsecd:

bcdsevportmap(bsecd,rst,secdsmg);

bcdsecm:

bcdsevportmap(bsecm,rst,secmsmg);

endarchitectureone;

 

三、仿真结果及分析

系统总体仿真结果如下图所示:

首先说明,为使仿真能顺利进行,在仿真时将50Mhz时钟二次分频到10khz而不是实际的10hz,另外还去掉了startstop信号,这样做并不会影响电路的内部逻辑及输出结果。

由上图上图仿真结束时间设为10ms,理论仿真结果应为秒表从0000一直运行到0099,分析图中相应波形可知仿真结果正确。

四、心得体会

通过这次实验,使我对VHDL语言有了进一步的了解和熟悉,对以前学过的数电知识是一次很好的运用,同时熟悉了QuartusII软件的使用方法,能够独立完成VHDL中型项目的设计并进行仿真。

另外,通过本次实验还使我认识到在软件里的仿真参考价值是有限的,只有真正将程序下载到实际电路中才能真正检测程序的对错。

为了验证程序的正确性,在第二次实验课上,我将模块中的信号分配了引脚,并烧写到DE2实验平台中,以4位数码管做显示,以两个拨码开关座输入,控制秒表的启停,复位。

通过一段时间的调试,程序能够正确运行,能够实现预期功能。

这次作业为我以后的学习提供了思路,极大地提高了我的动手实践能力。

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

当前位置:首页 > 工程科技 > 纺织轻工业

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

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