实习数字钟.docx

上传人:b****2 文档编号:20304945 上传时间:2023-04-25 格式:DOCX 页数:16 大小:140.09KB
下载 相关 举报
实习数字钟.docx_第1页
第1页 / 共16页
实习数字钟.docx_第2页
第2页 / 共16页
实习数字钟.docx_第3页
第3页 / 共16页
实习数字钟.docx_第4页
第4页 / 共16页
实习数字钟.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

实习数字钟.docx

《实习数字钟.docx》由会员分享,可在线阅读,更多相关《实习数字钟.docx(16页珍藏版)》请在冰豆网上搜索。

实习数字钟.docx

实习数字钟

EDA实习

(数字钟控制器的设计)

封皮

数字钟控制器

一.设计任务与要求

试设计一个显示时(2位)、分(2位)、秒(2位)的多功能电子钟。

具体要求如下:

(1).具有时、分、秒计数显示功能,以24小时循环计时;

(2)LED动态显示时、分、秒和分隔符;

(3)具有清零、调节小时、分钟、整点报时、整天报时功能。

二.电路连接图及工作原理描述

图1-1电路硬件连接系统框图

工作原理描述:

根据设计要求,采用如图1-1所示的硬件连接电路,该系统共有5个输入:

clk基准脉冲(1Hz)、ckdsp显示扫描脉冲(1kHz)、res清零、hrtmp调时、mintmp调分,13个输出:

q0~q7是八段的显示、sel0~sel2是位选信号、ring整点蜂鸣器输出、ca是整天报时输出。

三.VHDL程

1.顶层模块划分

如图1-2所示为EPM7128SLC84-6芯片内的系统方块图.该系统框图由八个模块组成,分别为:

秒、分、时计数模块,分隔符显示模块,整点、整天报时模块,LED动态显示扫描模块,LED显示译码器模块组成。

其工作原理是:

基准脉冲输入信号同时加到秒、分、时、分隔符的脉冲输入端,采用并行计数的方式,秒的进位接到分的使能端上,秒的使能借到分隔符的使能上,分得接到时的使能端上,完成秒、分、时和分隔符的循环计数。

整点报时是根据分的A、B输出同时为0时,整点报时模块输出高电平控制报时。

整天报时是根据时、分得输出都为0时而输出高电平控制整天报时的。

LED显示扫描模块根据输入的扫描信号CKDSP轮流选通秒、分、时、分隔符的8位八段数码管,LED显示译码器完成计数器输出的BCD的译码。

图1-2数字时钟控制器系统框图

2.分模块及仿真

(1).秒计数器模块

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYseccountIS

PORT(en,res,clk:

INSTD_LOGIC;

ca:

OUTSTD_LOGIC;

a,b:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

ENDseccount;

ARCHITECTURErtlOFseccountIS

SIGNALaout,bout:

STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALcout:

STd_logic;

BEGIN

PROCESS(en,clk,res)

BEGIN

IF(res='0')THEN

aout<="0000";

bout<="0000";

cout<='0';

ELSIF(clk'eventANDclk='1')THEN

IFen='1'THEN

IFbout="0101"ANDaout="1000"then

aout<="1001";

cout<='1';

ELSIFaout<"1001"THEN

aout<=aout+1;

ELSE

aout<="0000";

IFbout<"0101"THEN

bout<=bout+1;

ELSE

bout<="0000";

cout<='0';

ENDIF;

ENDIF;

ENDIF;

ENDIF;

ENDPROCESS;

a<=aout;

b<=bout;

ca<=cout;

ENDrtl;

图1-3秒计数器模块仿真波形

(2).分计数器模块

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYmincountIS

PORT(en1,en2,res,clk:

INSTD_LOGIC;

ca:

OUTSTD_LOGIC;

a,b:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

ENDmincount;

ARCHITECTURErtlOFmincountIS

SIGNALaout,bout:

STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALcout:

STD_LOGIC;

BEGIN

PROCESS(en1,en2,clk,res)

BEGIN

IF(res='0')THEN

aout<="0000";

bout<="0000";

cout<='0';

ELSIF(clk'eventandclk='1')THEN

IF(en1='1'oren2='0')THEN

IF(bout>4)THEN

IF(aout>8)THEN

aout<="0000";

bout<="0000";

cout<='1';

ELSE

aout<=aout+1;

ENDIF;

ELSE

IF(aout=9)THEN

aout<="0000";

bout<=bout+1;

ELSE

aout<=aout+1;

cout<='0';

ENDIF;

ENDIF;

ELSE

cout<='0';

ENDIF;

ENDIF;

ENDPROCESS;

a<=aout;

b<=bout;

ca<=cout;

ENDrtl;

图1-4分计数器模块仿真波形

(3).时计数器模块

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYcount24IS

PORT(en1,en2,res,clk:

INSTD_LOGIC;

ca:

OUTSTD_LOGIC;

a,b:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

ENDcount24;

ARCHITECTURErtlOFcount24IS

SIGNALaout,bout:

STD_LOGIC_VECTOR(3DOWNTO0);

SIGNALcout:

STD_LOGIC;

BEGIN

PROCESS(en1,en2,clK,res)

BEGIN

IF(res='0')THEN

aout<="0000";

bout<="0000";

cout<='0';

ELSIF(clk'eventANDclk='0')THEN

IFen1='1'ORen2='0'THEN

IFbout="0010"andaout="0011"THEN

aout<="0000";

bout<="0000";

cout<='1';

ELSIFaout<"1001"then

aout<=aout+1;

ELSE

aout<="0000";

bout<=bout+1;

ENDIF;

ENDIF;

ENDIF;

ENDPROCESS;

a<=aout;

b<=bout;

ca<=cout;

ENDrtl;

图1-5时计数器模块仿真波形

(4).分隔符计数器模块

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYdianIS

PORT(en,res,clk:

INSTD_LOGIC;

a,b:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

ENDdian;

ARCHITECTURErtlOFdianIS

SIGNALaout,bout:

STD_LOGIC_VECTOR(3DOWNTO0);

BEGIN

PROCESS(en,clk,res)

BEGIN

IF(res='0')THEN

aout<="0000";

bout<="0000";

ELSIF(clk'eventandclk='1')THEN

IF(en='1')THEN

aout<="1010";

bout<="1010";

ENDIF;

ENDIF;

ENDPROCESS;

a<=aout;

b<=bout;

ENDrtl;

图1-6分隔符模块仿真波形

(5).整点报时器模块

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYringIS

PORT(a,b:

INSTD_LOGIC_VECTOR(3DOWNTO0);

r_out:

OUTSTD_LOGIC);

ENDring;

ARCHITECTUREbehOFringIS

BEGIN

r_out<='1'WHENa="0000"ANDb="0000"ELSE

'0';

ENDbeh;

图1-7整点报时器模块仿真波形

(6).整天报时器模块

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYdengIS

PORT(a,b,c,d:

INSTD_LOGIC_VECTOR(3DOWNTO0);

ca:

OUTSTD_LOGIC);

ENDdeng;

ARCHITECTUREbehOFdengIS

BEGIN

ca<='1'WHENa=0ANDb=0ANDc=0ANDd=0ELSE

'0';

ENDbeh;

图1-8整天报时器模块仿真波形

(7).LED动态显示扫描模块

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYscanselectIS

PORT(clk:

INSTD_LOGIC;

res:

INSTD_LOGIC;

in1,in2,in3,in4,in5,in6,in7,in8:

INSTD_LOGIC_VECTOR(3DOWNTO0);

sel:

OUTSTD_LOGIC_VECTOR(2DOWNTO0);

daout:

OUTSTD_LOGIC_VECTOR(3DOWNTO0));

ENDscanselect;

ARCHITECTUREbehaveOFscanselectIS

BEGIN

PROCESS(clk)

VARIABLEcnt:

STD_LOGIC_VECTOR(2DOWNTO0);

BEGIN

IF(clk'eventANDclk='1')THEN

IFres='0'THEN

cnt:

="000";

ELSE

IFcnt="111"THEN

cnt:

="000";

ELSEcnt:

=cnt+1;

ENDIF;

ENDIF;

IFcnt="000"THEN

daout(0)<=in1(0);

daout

(1)<=in1

(1);

daout

(2)<=in1

(2);

daout(3)<=in1(3);

ELSIFcnt="001"THEN

daout(0)<=in2(0);

daout

(1)<=in2

(1);

daout

(2)<=in2

(2);

daout(3)<=in2(3);

ELSIFcnt="010"THEN

daout(0)<=in3(0);

daout

(1)<=in3

(1);

daout

(2)<=in3

(2);

daout(3)<=in3(3);

ELSIFcnt="011"THEN

daout(0)<=in4(0);

daout

(1)<=in4

(1);

daout

(2)<=in4

(2);

daout(3)<=in4(3);

ELSIFcnt="100"THEN

daout(0)<=in5(0);

daout

(1)<=in5

(1);

daout

(2)<=in5

(2);

daout(3)<=in5(3);

ELSIFcnt="101"THEN

daout(0)<=in6(0);

daout

(1)<=in6

(1);

daout

(2)<=in6

(2);

daout(3)<=in6(3);

ELSIFcnt="110"THEN

daout(0)<=in7(0);

daout

(1)<=in7

(1);

daout

(2)<=in7

(2);

daout(3)<=in7(3);

ELSIFcnt="111"THEN

daout(0)<=in8(0);

daout

(1)<=in8

(1);

daout

(2)<=in8

(2);

daout(3)<=in8(3);

ENDIF;

ENDIF;

sel<=cnt;

ENDPROCESS;

ENDbehave;

图1-9扫描模块仿真波形

(8).LED显示译码器模块

LIBRARYIEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITYdispIS

PORT(d:

INSTD_LOGIC_VECTOR(3DOWNTO0);

q:

OUTSTD_LOGIC_VECTOR(6DOWNTO0));

ENDdisp;

ARCHITECTURErtlOFdispIS

BEGIN

PROCESS(d)

BEGIN

CASEdIS

WHEN"0000"=>q<="0111111";

WHEN"0001"=>q<="0000110";

WHEN"0010"=>q<="1011011";

WHEN"0011"=>q<="1001111";

WHEN"0100"=>q<="1100110";

WHEN"0101"=>q<="1101101";

WHEN"0110"=>q<="1111101";

WHEN"0111"=>q<="0100111";

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

WHEN"1001"=>q<="1101111";

WHENOTHERS=>q<="1000000";

ENDCASE;

ENDPROCESS;

ENDrtl;

图1-10扫描模块仿真波形

四.设计总结

在对数字钟控制器设计的实习过程中,我前后总共编了4次,修改了很多次才成功。

对于程序这东西你必须实实在在的懂它,了解它,对它。

如果你糊弄它,它就会毫不留情地给你带来非常头痛的烦恼。

在第一次编程下载完成后,打开试验箱电源发现数码管都不亮。

后来发现器件的1、2、83引脚用的不正确,经调整后就能使了。

这次错误是对器件的引脚功能不懂造成的。

然后我验证各个模块的进位是否正确,发现,时的进位有一段时间会随着秒的显示一起走,经过分析知道这个现象是分计数器模块进位错误造成的,我就对分计数器模块的程序进行分析,知道了程序的错误是在IF(en1='1'oren2='0')THEN语句结束之前少了ELSEcout<='0';语句。

在编程的过程中我的心里面也遇到了一些困扰。

尤其是对整天报时这个问题的处理上。

我先是用了几种自己的方法,但效果都不好。

后来我我就问了别的同学,他们说加一个与门连接秒、分、时的输出脉冲,我就有点迷惑了,不知道为什么。

根据波形图分析,秒、分、时的输出脉冲时由基准时钟控制的,它们三个与在一起只能出现短时间的闪烁现象而不会有1分钟的报时。

后来我只能按照自己的思路去做,把分和时的输出都为0的的情况与在一起,结果基本正确了。

对于VHDL的学习要有一定的前瞻性,局部观和整体观。

有时,即使你的所有模块都编译正确,但最终的结果也不一定正确。

编译正确了也不能说明此模块对于这个课题就是匹配的,没有缺陷的。

最根本的还是能够理解和了解它,能够根据出现的问题找到原因。

在这几天的实习过程中我总是思考着一些问题,怎样才能把遇到的错误解决,怎样才能把试验做好。

每解决了一个问题之后心里面也是挺高兴的,因为我感觉到了自己在进步。

这次实习给我的记忆很深,也更好的锻炼了我独立思考和动手能力,也让我对EDA、VHDL有了更深层次的理解。

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

当前位置:首页 > 外语学习 > 日语学习

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

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