EDA电子钟设计.docx
《EDA电子钟设计.docx》由会员分享,可在线阅读,更多相关《EDA电子钟设计.docx(19页珍藏版)》请在冰豆网上搜索。
EDA电子钟设计
《在系统编程技术》项目设计报告
课程名称:
在系统编程技术
任课教师:
周泽华
设计题目:
数字时钟设计
班级:
姓名学号:
学号:
日期:
2012\06\9
一、题目分析-2-
二、设计方案-3-
1、顶层实体描述-3-
2、模块划分及描述-4-
3、顶层电路图设计-7-
4、顶层电路图描述-7-
三、方案实现-8-
1、秒计数器电路仿真图-8-
2、分计数器电路仿真图-8-
3、小时计数器电路仿真图-9-
4、译码驱动电路仿真图-9-
5、顶层电路仿真及描述-10-
四、硬件测试及说明-10-
五、结论-11-
六、课程总结-11-
七、致谢-12-
附件:
-12-
一、题目分析
数字钟是一个将“时”,“分”,“秒”显示于人的视觉器官的计时装置。
它的计时周期为24小时,显示满刻度为23时59分59秒,另外应有校时功能和校分功能。
因此,一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”计数器、校时电路和振荡器组成。
主电路系统由秒信号发生器、“时、分、秒”计数器、译码器及显示器、校时电路组成。
秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用石英晶体振荡器加分频器来实现。
将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。
“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。
“时计数器”采用24进制计时器,可实现对一天24小时的累计。
采用6个数码管显示。
工作原理图如图所示:
数字钟的工作原理图
性能指标及功能设计:
1)时钟计数:
完成时、分、秒的正确计时并且显示所计的数字;对秒、分——60进制计数,即从0到59循环计数,时钟——24进制计数,即从0到23循环计数,并且在数码管上显示数值。
2)时间设置:
手动调节分钟、小时,可以对所设计的时钟任意调时间,这样使数字钟真正具有使用功能。
我们可以通过实验板上的键1和键4进行任意的调整,因为我们用的时钟信号均是1HZ的,所以每LED灯变化一次就来一个脉冲,即计数一次。
3)清零功能:
reset为复位键,低电平时实现清零功能,高电平时正常计数。
可以根据我们自己任意时间的复位。
二、设计方案
1、顶层实体描述
自顶向下分解图
顶层模块图
(1)Clk为1hz信号输入
(2)Reset为清零输入
(3)Setmin为手动调分
(4)Sethour为手动调时
(5)h[6.0],,h1[6.0]为小时数据输出
(6)m[6.0],m1[6.0]为分钟数据输出
(7)s[6.0],s1[6.0]为秒数据输出
2、模块划分及描述
秒模块图
(1)Clk为1hz信号输入
(2)Reset为清零输入
(3)Setmin为手动调分
(4)cmin为分进位信号
(5)dout[6.0]为数据输出
分模块图
(1)Clk1为1hz信号输入
(2)Reset为清零输入
(3)Sethour为手动调时
(4)Clk为进位脉冲
(5)dout[6.0]为数据输出
(6)chour为时进位脉冲
时模块图
(1)Clk为进位脉冲
(2)Reset为清零输入
(3)dout[5.0]为数据输出
译码器模块
(1)BCD码输入
(2)七段共阴码输出
晶体振荡电路是构成数字式时钟的核心,它保证了时钟走时准确及稳定。
晶体振荡器它的作用是产生时间标准信号。
数字钟的精度主要取决于时间标准信号的频率及其稳定度。
因此,一般采用石英晶体振荡器经过分频得到这一信号。
晶体振荡器电路给数字钟提供一个频率稳定准确的4MHz的方波信号,可保证数字钟的走时准确及稳定。
不管是指针式的电子钟还是数字显示的电子钟都使用了晶体振荡器电路。
如图所示晶体振荡电路框图。
晶体振荡电路
分频器电路将4M的高频方波信号经4M次分频后得到1Hz的方波信号供秒计数器进行计数。
分频器实际上也就是计数器。
本次设计是运用VHDL语言设计的分频器进行分频,分频电路可提供1HZ的方波为为后级电路输送一秒脉冲信号。
3、顶层电路图设计
4、顶层电路图描述
1)对外端口引脚名称:
输入:
clk,reset,setmin,sethour;
输出:
speaker,hour[5..0],minute[6..0],second[6..0],lamp[3..0]
2)底层文件名称:
秒计时器(second)是由一个60进制的计数器构成的,具有清0、置数和计数功能。
其中reset为清0信号,当reset为0时,秒计时器清0;clk为系统时钟信号;setmin是分钟的设置信号;enmin为秒计时器的进位信号,作为下一级的输入信号;daout是秒计数值。
分计时器(minute)是由一个60进制的计数器构成的,具有清0、置数和计数功能。
其中reset为清0信号,当reset为0时,分计时器清0;clk为系统时钟信号;clk1为设置时钟信号;sethour时设置信号;enhour为分计时器的进位信号,作为下一级的输入信号。
时计时器(hour)是由一个24进制的计数器构成的,具有清0、置数和计数功能。
其中reset为清0信号,当reset为0时,时计时器清0;clk为时计数时钟信号;daout为时计数值。
报时模块(alarm)的功能是整点时,报时持续1分钟,dain为分计数值;speak为蜂鸣器报警;
3)实验连线:
reset、setmin、hour连接拨动开关;计数时钟信号clk接1HZ/4HZ时钟信号;speak与扬声器驱动speaker相连;lamp与三个发光二极管相连;hour[5..0]、minute[6..0]、second[6..0]分别与七段LED数码管相连。
三、方案实现
1、秒计数器电路仿真图
秒表计数器电路仿真图如图:
将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲,仿真结果正确。
秒计数器电路仿真图
2、分计数器电路仿真图
分计数器电路仿真图如图:
“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。
Reset为清零控制端,sethour为时进位脉冲信号,仿真结果正确。
分计数器电路仿真图
3、小时计数器电路仿真图
时计数器电路仿真图如图:
“时计数器”采用24进制计时器,可实现对一天24小时的累计。
Reset为清零控制端,仿真结果正确。
小时计数器电路仿真图
4、译码驱动电路仿真图
译码驱动电路仿真图如图:
输入BCD码,输出为共阴极数码管显示码,仿真结果正确。
5、顶层电路仿真及描述
四、硬件测试及说明
1)硬件测试:
实验硬件GW48实验系统cycloneEP1C3T144C8
测试模式NO.7
测试方式clock选用clock0,短路帽选1HZ;
键8控制reset,键1控制sethour,键4控制setminute,
D8、D7、D6显示花样灯lamp;
数码管8、7用作小时显示,高位是小时的十位,低位是小时的位;
数码管5、4用作分钟显示,高位是分钟的十位,低位是分钟的位;
数码管2、1用作秒钟显示,高位是秒钟的十位,低位是秒钟的位;
测试过程:
(灯亮为高电平,灯灭为低电平)
reset低电平清零复位,按键8使灯亮则时钟开始从00-00-00计时,秒钟计时到59时向分钟进1,分钟计时到59时向小时进1;
键1用做调小时每来一个脉冲调一次调节范围00-——23;
键4用做调分钟每来一个脉冲调一次调节范围00—59;
lamp灯显的三个灯轮回亮;
当时钟为00则蜂鸣器开始整点报时一分钟。
2)结果分析:
由测试过程及结果可知所设计的数字时钟系统完成了预定的实验设计要求。
五、结论
由上可知,该数字钟系统实现了计时、时间重置、整点报时的功能。
在给数字钟重置时间后,数字钟便开始从所置的时间计时,计数到59秒时,秒计时器回到00秒,并且给分钟加1;当分钟计数到59分时,分计时器回到00分钟,小时显示加1,与此同时报时装置输出高电平,并且持续1分钟。
当小时计数到23小时时,当分钟及秒钟都达到59时,下一脉冲来时时钟回到00小时。
当分钟到达59分,分计时器回到00时。
通过这次设计实验,使得我对层次化结构化设计有了更深的了解。
在设计中将设计任务分成了几个子模块,完成各子模块的设计功能,然后再将各模块合起来联试,加深了层次化设计概念。
通过实验加深了对软件的元件管理的含义的理解,学会将不同目录下的设计题目融合在同一个文件夹中进行总体成。
通过仿真和硬件测试,让我认识到调试和硬件测试手段的多样化,对于同一功能的电路可以采用多种模式进行硬件测试,但要选择一个最佳方案,从而进行信号引脚的锁定并与相应功能块的硬件电路接口相连。
六、课程总结
通过两星期的努力,最后完成了我的设计任务——数字钟的设计。
通过本课程设计的学习,我深深的体会到设计课的重要性和目的性所在。
本次设计课不仅仅培养了我们实际操作能力,也培养了我们灵活运用课本知识,理论联系实际,独立自主的进行设计的能力。
它不仅仅是一个学习新知识新方法的好机会,同时也是对我所学知识的一次综合的检验和复习,使我明白了自己的缺陷所在,从而查漏补缺。
希望学校以后多安排一些类似的实践环节,让同学们学以致用。
课程设计中要求要有耐心和毅力,还要细心,稍有不慎,一个小小的错误就会导致结果的不正确,而对错误的检查要求我要有足够的耐心,通过这次设计和设计中遇到的问题,也积累了一定的经验,对以后从事集成电路设计工作会有一定的帮助。
在应用VHDL的过程中让我真正领会到了其并行运行与其他软件(C语言)顺序执行的差别及其在电路设计上的优越性。
用VHDL硬件描述语言的形式来进行数字系统的设计方便灵活,利用EDA软件进行编译优化仿真极大地减少了电路设计时间和可能发生的错误,降低了开发成本,这种设计方法必将在未来的数字系统设计中发挥越来越重要的作用。
七、致谢
感谢周泽华老师在本学期EDA技术实用教程课程上的指导和帮助!
附件:
1、小时计数器VHDL语言源程序(底层文件)
LIBRARYIEEE;
useIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYhourIS
PORT(clk,reset:
INSTD_LOGIC;
daout:
outSTD_LOGIC_VECTOR(5DOWNTO0));
ENDENTITYhour;
ARCHITECTUREfunOFhourIS
SIGNALcount:
STD_LOGIC_VECTOR(5DOWNTO0);
BEGIN
daout<=count;
PROCESS(clk,reset)
BEGIN
IF(reset='0')THENcount<="000000";——若reset=0,则异步清零
ELSIF(clk'eventandclk='1')THEN——否则,若clk上升沿到
IF(count(3DOWNTO0)="1001")THEN——若个位计时恰好到“1001”即9
IF(count<16#23#)THEN——23进制
count<=count+7;——若到23D则
else
count<="000000";——复0
ENDIF;
ELSIF(count<16#23#)THEN——若未到23D,则count进1
count<=count+1;
ELSE——否则清零
count<="000000";
ENDIF;——ENDIF(count(3DOWNTO0)=“1001”)
ENDIF;——ENDIF(reset=‘0’)
ENDPROCESS;
ENDfun;
2、分钟计数器VHDL语言源程序(底层文件)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYminuteIS
PORT(clk,clk1,reset,sethour:
INSTD_LOGIC;
enhour:
OUTSTD_LOGIC;
daout:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDENTITYminute;
ARCHITECTUREfunOFminuteIS
SIGNALcount:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALenhour_1,enhour_2:
STD_LOGIC;——enhour_1为59分时的进位信号
BEGIN——enhour_2由clk调制后的手动调时脉冲信号串
daout<=count;
enhour_2<=(sethourandclk1);——sethour为手动调时控制信号,高电平有效
enhour<=(enhour_1orenhour_2);
PROCESS(clk,reset,sethour)
BEGIN
IF(reset='0')THEN——若reset为0,则异步清零
count<="0000000";
ELSIF(clk'eventandclk='1')THEN——否则,若clk上升沿到
IF(count(3DOWNTO0)="1001")THEN——若个位计时恰好到“1001”即9
IF(count<16#60#)THEN——又若count小于16#60#,即60
IF(count="1011001")THEN——又若已到59D
enhour_1<='1';——则置进位为1
count<="0000000";——count复0
ELSE
count<=count+7;——若count未到59D,则加7,即作“加6校正”
ENDIF;——使前面的16#60#的个位转变为8421BCD的容量
ELSE
count<="0000000";——count复0(有此句,则对无效状态电路可自启动)
ENDIF;——ENDIF(count<16#60#)
ELSIF(count<16#60#)THEN
count<=count+1;——若count<16#60#则count加1
enhour_1<='0'after100ns;——没有发生进位
ELSE
count<="0000000";——否则,若count不小于16#60#count复0
ENDIF;——ENDIF(count(3DOWNTO0)=“1001”)
ENDIF;——ENDIF(reset=‘0’)
ENDprocess;
ENDfun;
3、秒钟计数器VHDL语言源程序(底层文件)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYsecondIS
PORT(clk,reset,setmin:
inSTD_LOGIC;
enmin:
OUTSTD_LOGIC;
daout:
OUTSTD_LOGIC_VECTOR(6DOWNTO0));
ENDENTITYsecond;
ARCHITECTUREfunOFsecondIS
SIGNALcount:
STD_LOGIC_VECTOR(6DOWNTO0);
SIGNALenmin_1,enmin_2:
STD_LOGIC;——enmin_1为59秒时的进位信号
BEGIN——enmin_2由clk调制后的手动调分脉冲信号串
daout<=count;
enmin_2<=(setminandclk);——setmin为手动调分控制信号,高电平有效
enmin<=(enmin_1orenmin_2);——enmin为向分进位信号
PROCESS(clk,reset,setmin)
BEGIN
IF(reset='0')THENcount<="0000000";——若reset为0,则异步清零
ELSIF(clk'eventandclk='1')then——否则,若clk上升沿到
IF(count(3downto0)="1001")then——若个位计时恰好到“1001”即9
IF(count<16#60#)then——又若count小于16#60#,即60H
IF(count="1011001")then——又若已到59D
enmin_1<='1';count<="0000000";——则置进位为1及count复0
ELSE——未到59D
count<=count+7;——则加7,而+7=+1+6,即作“加6校正”
ENDIF;
ELSE——若count不小于16#60#(即count等于或大于16#60#)
count<="0000000";——count复0
ENDIF;——ENDIF(count<16#60#)
ELSIF(count<16#60#)then——若个位计数未到“1001”则转此句再判
count<=count+1;——若count<16#60#则count加1
enmin_1<='0'after100ns;——没有发生进位
ELSE——否则,若count不小于16#60#
count<="0000000";——则count复0
ENDIF;——ENDIF(count(3DOWNTO0)=“1001”)
ENDIF;——ENDIF(reset=‘0’)
ENDPROCESS;
ENDfun;
4、整点报时报警模块VHDL语言源程序(底层文件)
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYalertIS
PORT(clk:
INSTD_LOGIC;
dain:
INSTD_LOGIC_VECTOR(6DOWNTO0);
speak:
OUTSTD_LOGIC;
lamp:
OUTSTD_LOGIC_VECTOR(2DOWNTO0));
ENDalert;
ARCHITECTUREfunOFalertIS
SIGNALcount:
STD_LOGIC_VECTOR(1DOWNTO0);
SIGNALcount1:
STD_LOGIC_VECTOR(1DOWNTO0);
BEGIN
speaker:
PROCESS(clk)
BEGIN
speak<=count1
(1);
IF(clk'eventandclk='1')THEN
IF(dain="0000000")THEN
IF(count1>="10")THEN
count1<="00";——count1为三进制加法计数器
ELSE
count1<=count1+1;
ENDIF;
ENDIF;
ENDIF;
ENDPROCESSspeaker;
lamper:
PROCESS(clk)
BEGIN
IF(rising_edge(clk))THEN
IF(count<="10")THEN
IF(count="00")THEN
lamp<="001";——循环点亮三只灯
ELSIF(count="01")THEN
lamp<="010";
ELSIF(count="10")THEN
lamp<="100";
ENDIF;
count<=count+1;
ELSE
count<="00";
ENDIF;
ENDIF;
ENDPROCESSlamper;
ENDfun;