实习数字钟.docx
《实习数字钟.docx》由会员分享,可在线阅读,更多相关《实习数字钟.docx(16页珍藏版)》请在冰豆网上搜索。
实习数字钟
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有了更深层次的理解。