数字时钟设计及实现讲解.docx

上传人:b****8 文档编号:9363227 上传时间:2023-02-04 格式:DOCX 页数:17 大小:654.12KB
下载 相关 举报
数字时钟设计及实现讲解.docx_第1页
第1页 / 共17页
数字时钟设计及实现讲解.docx_第2页
第2页 / 共17页
数字时钟设计及实现讲解.docx_第3页
第3页 / 共17页
数字时钟设计及实现讲解.docx_第4页
第4页 / 共17页
数字时钟设计及实现讲解.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

数字时钟设计及实现讲解.docx

《数字时钟设计及实现讲解.docx》由会员分享,可在线阅读,更多相关《数字时钟设计及实现讲解.docx(17页珍藏版)》请在冰豆网上搜索。

数字时钟设计及实现讲解.docx

数字时钟设计及实现讲解

本科实验报告

 

题目:

数字时钟设计及实现

 

课程名称:

数字电路课程设计

学院(系):

专业:

电气工程及其自动化

班级:

学生姓名:

学号:

完成日期:

成绩:

 

2012年12月22日

题目:

数字时钟设计及实现

一设计要求

数字时钟是常见的一种计时装置,数字时钟以1HZ的频率工作。

该设计完成数字时钟的运行和显示。

其主要功能如下:

(1)数字时钟以1HZ的频率工作,其输入频率为1MHZ。

(2)数字时钟显示时、分、秒信息。

这些显示信息在6个7段数码管上完成。

(3)通过按键设置时、分信息,并且具有对数字时钟复位功能。

复位键将时、分、秒清0,并做好重新计数的准备。

按键具有预置时、分的功能。

分别对当前的时和分信息做递增设置和递减设置。

二设计分析及系统方案设计

图1给出了数字时钟的结构图。

从图中可以看到,数字时钟由复位按键(reset)、小时递增按键(hour_inc)、小时递减按键(hour_dec)、分钟递增按键(min_inc)、分钟递减按键(min_dec)、时钟输入、7段LED显示、LED管选择信号线sel、LED码控制信号线(segment)等部分组成。

所有的按键都是低电平有效。

LED管选择信号线sel通过控制外部的3-8译码器来选择对应的LED管。

LED码控制信号线分别和LED的7个数码控制端a-g相连,用来控制LED上显示的字符,通过合理的控制扫描时钟,就可以得到稳定的时、分、秒的显示。

图1数字时钟结构图

三系统以及模块硬件电路设计

1、数字时钟控制信号

改数字时钟的控制部分由芯片完成。

该芯片的输入和输出接口由下面信号组成。

(1)输入信号

复位信号(reset)

时钟输入信号(clk)

小时递增信号(hour_inc)

小时递减信号(hour_dec)

分钟递增信号(min_inc)

分钟递减信号(min_dec)。

(2)输出信号

LED选择信号(sel)

LED码显示控制信号(segment)。

2、控制模块结构

该设计分为下面4个模块:

定时时钟模块、扫描时钟模块、按键处理模块、定时计数模块和显示控制模块。

图2给出了这几个模块之间的信号连接关系。

(1)按键处理模块

由于VHDL语言的规则,将按键的处理和定时模块设计在一起。

为了描述清楚,将对按键的处理进行说明。

在该设计中,采用异步复位电路方式。

当复位信号低有效时,计时器停止计时,时、分、秒清0。

图2电子钟控制模块的内部连接图

对于小时的递增、递减按键操作,通过一个1HZ的计数时钟采样。

图3给出了递增、递减的操作时序。

图3预置操作和定时时钟的关系

当1HZ的div_clk信号的上升沿到来时,检测hour_inc和hour_dec按键,图中的虚线表示在时钟的上升沿对按键信号进行采样。

当hour_inc或hour_dec按键低有效时,对小时进行递加或递减操作。

对于分针的递加、递减按键操作,也是通过一个1HZ的计数时钟采样。

原理如图4所示。

图4定时器时、分、秒之间的连接关系

(2)定时时钟模块

定时时钟模块作用就是,将外部提供的1MHZ的时钟通过分频器后向模块内的定时计数模块提供1HZ的定时计数时钟。

在设计定时时钟模块时,采用同步计数电路。

(3)扫描时钟模块

扫描时钟模块的作用就是通过对1MHZ的分频处理后,向显示控制模块提供合适的显示扫描时钟,该始终必须经过合理的设计,才能保证7段数码显示的稳定。

在设计扫描时钟模块时,采用同步计数电路。

(4)定时计数模块

定时计数模块是该设计中最重要的一部分,在设计该模块时,为了便于后续显示控制模块的设计,将时、分、秒进行分离,即小时分成了小时的十位和个位分别处理,分钟分成了分钟的十位和个位分别处理。

秒分成了秒的十位和个位分别处理。

在该设计中,采用24小时计数模式。

例如13:

28:

57。

13为小时的表示,1为小时的十位,3为小时的个位;28为分钟的表示,2为分钟的十位,8为分钟的个位;57为秒的表示,5为秒的十位,7为秒的个位。

由于对小时、分钟和秒的十位及个位分别处理,在设计该模块就稍微复杂些。

下面逐一进行说明。

秒的个位计数从0到9,即十进制计数。

当秒的个位计数到9后,准备向秒的十位进位。

秒的十位计数从0到5,即六进制计数。

当秒的十位计数到5后,准备向分的个位进位。

分钟的个位计数从0到9,即十进制计数。

当分钟的个位计数到9后,准备向分钟的十位进位。

分钟的十位计数从0到5,即六进制计数。

当分钟的十位计数到5后,准备向小时的个位进位。

对于小时的处理比较复杂,小时的十位和个位之间存在下面的关系:

●当小时的十位为0或1时,小时的个位可以计数范围为0-9,即十进制计数。

●当小时的十位为2时,小时的个位可以计数范围为0-3,即四进制计数。

图4给出了定时器时、分、秒之间的关系。

(5)显示控制模块

显示控制模块主要作用是在7段数码管上正确地显示0-9的数字。

Sel三位LED选择线和3-8译码器相连。

表1开发系统工作模式:

接口

名称

类型

(输入/输出)

结构图上

的信号名

引脚号

说明

复位信号

in

Reset

Pin_g26

进行复位,显示屏清0

时钟输入信号

In

clk

Pin_n2

输入时钟

小时递增信号

In

Hour_inc

Pin_n23

用于小时位调节

小时递减信号

In

Hour_dec

Pin_p23

用于小时位调节

分钟递增符号

In

Min_inc

Pin_w26

用于分钟位调节

分钟递减符号

In

Min_dec

none

用于分钟位调节

LED选择信号

Out

sel

用于选择LED信号

LED码显示控制信号

Out

segment

用于控制LED显示屏

四系统的VHDL设计

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_arith.all;

useieee.std_logic_unsigned.all;

entityclockis--实体定义部分

port(

clk:

instd_logic;

rst:

instd_logic;

inc_min:

instd_logic;

sub_min:

instd_logic;

inc_hour:

instd_logic;

sub_hour:

instd_logic;

sel:

outstd_logic_vector(2downto0);

q:

outstd_logic_vector(7downto0);

endclock;

architecturebehavioralofclockis--信号定义部分

signalsec_counter1:

std_logic_vector(3downto0);

signalsec_counter2:

std_logic_vector(3downto0);

signalmin_counter1:

std_logic_vector(3downto0);

signalmin_counter2:

std_logic_vector(3downto0);

signalhour_counter1:

std_logic_vector(3downto0);

signalhour_counter2:

std_logic_vector(3downto0);

signaldivcounter:

std_logic_vector(19downto0);

signaldiv_clk:

std_logic;

signalscancounter:

std_logic_vector(1downto0);

signalscan_clk:

std_logic;

signalscan_out:

std_logic_vector(2downto0);

signalsecseg1,secseg2,minseg1,minseg2,hourseg1,hourseg2:

std_logic_vector(7downto0);

begin

process(rst,clk)--计数时钟代码设计

begin

if(rst='0')then

divcounter<=x"00000";

div_clk<='0';

elsif(rising_edge(clk))then

if(divcounter=x"7a11f")then

divcounter<=x"00000";

div_clk<=notdiv_clk;

else

divcounter<=divcounter+1;

endif;

endif;

endprocess;

process(rst,clk)--数码管扫描时钟

begin

if(rst='0')then

scancounter<="00";

scan_clk<='0';

elsif(rising_edge(clk))then

if(scancounter="11")then

scancounter<="00";

scan_clk<=notscan_clk;

else

scancounter<=scancounter+1;

endif;

endif;

endprocess;

process(div_clk,rst)--时钟计数部分主进程

begin

if(rst='0')then--复位部分

sec_counter1<=x"0";

sec_counter2<=x"0";

min_counter1<=x"0";

min_counter2<=x"0";

hour_counter1<=x"0";

hour_counter2<=x"0";

elsif(rising_edge(div_clk))then--手动调分,递增

if(inc_min='0')then

if(min_counter1=x"9")then

min_counter1<=x"0";

if(min_counter2>=x"5")then

min_counter2<=x"0";

else

min_counter2<=min_counter2+1;

endif;

else

min_counter1<=min_counter1+1;

endif;

elsif(sub_min='0')then--手动调分,递减

if(min_counter1=x"0")then

min_counter1<=x"9";

if(min_counter2=x"0")then

min_counter2<=x"5";

else

min_counter2<=mincounter2-1;

endif;

else

min_counter1<=min_counter1-1;

endif;

elsif(inc_hour='0')then--手动调时,增时

if(hour_counter2=x"2")then

if(hour_counter1=x"3")then

hour_counter1<=x"0";

hour_counter2<=x"0";

else

hour_counter1<=hour_counter1+1;

endif;

else

if(hour_counter1=x"9")then

hour_counter1<=x"0";

hour_counter2<=hour_counter2+1;

else

hour_counter1<=hour_counter1+1;

endif;

endif;

elsif(sub_hour='0')then--手动调时,减时

if(hour_counter1=x"0")then

if(hour_counter2=x"0")then

hour_counter1<=x"3";

hour_counter2<=x"2";

else

hour_counter2<=hour_counter2-1;

hour_counter1<=x"9";

endif;

else

hour_counter1<=hour_counter1-1;

endif;

else--时分秒正常计时

if(sec_counter1>=x"9")then

sec_counter1<=x"0";

if(sec_counter2>=x"5")then

sec_counter2<=x"0";

if(min_counter1>=x"9")then

min_counter1<=x"0";

if(min_counter2>=x"5")then

min_counter2<=x"0";

if(hour_counter2=x"2")then

if(hour_counter1=x"3")then

hour_counter1<=x"0";

hour_counter2<=x"0";

else

hour_counter1<=hour_counter1+1;

endif;

else

if(hour_counter1=x"9")then

hour_counter1<=x"0";

hour_couner2<=hour_counter2+1;

else

hour_counter1<=hour_counter1+1;

endif;

endif;

else

min_counter2<=min_counter2+1;

endif;

else

min_counter1<=min_counter1+1;

endif;

else

sec_counter2<=sec_counter2+1;

endif;

else

sec_counter1<=sec_counter1+1;

endif;

endif;

endif;

endprocess;

process(rst,scan_clk)--生成扫描时钟

begin

if(rst='0')then

scan_out<="000";

elsif(rising_edge(scan_clk))then

if(scan_out="101")then

scan_out<="000";

else

scan_out<=scan_out+1;

endif;

endprocess;

process(scan_out)--扫描输出进程

begin

casescan_outis

when"000"=>q<=secseg1;sel<="000";

when"001"=>q<=secseg2;sel<="001";

when"010"=>q<=minseg1;sel<="010";

when"011"=>q<=minseg2;sel<="011";

when"100"=>q<=hourseg1;sel<="100";

when"101"=>q<=hourseg2;sel<="101";

whenothers=>q<="11111111";sel<="111";

endcase;

endprocess;

process(sec_counter1)--秒低位显示

begin

casesec_counter1is

when"0000"=>secseg1<="10111111";

when"0001"=>secseg1<="10000110";

when"0010"=>secseg1<="11011011";

when"0011"=>secseg1<="11001111";

when"0100"=>secseg1<="11100110";

when"0101"=>secseg1<="11101101";

when"0110"=>secseg1<="11111101";

when"0111"=>secseg1<="10000111";

when"1000"=>secseg1<="11111111";

when"1001"=>secseg1<="11101111";

whenothers=>secseg1<="11111111";

endcase;

endprocess;

process(sec_counter2)--秒高位显示

begin

casesec_counter2is

when"0000"=>secseg2<="00111111";

when"0001"=>secseg2<="00000110";

when"0010"=>secseg2<="01011011";

when"0011"=>secseg2<="01001111";

when"0100"=>secseg2<="01100110";

when"0101"=>secseg2<="01101101";

whenothers=>secseg2<="01111111";

endcase;

endprocess;

process(min_counter1)--分低位显示

begin

casemin_counter1is

when"0000"=>minseg1<="10111111";

when"0001"=>minseg1<="10000110";

when"0010"=>minseg1<="11011011";

when"0011"=>minseg1<="11001111";

when"0100"=>minseg1<="11100110";

when"0101"=>minseg1<="11101101";

when"0110"=>minseg1<="11111101";

when"0111"=>minseg1<="10000111";

when"1000"=>minseg1<="11111111";

when"1001"=>minseg1<="11101111";

whenothers=>minseg1<="11111111";

endcase;

endprocess;

process(min_counter2)--分高位显示

begin

casemin_counter2is

when"0000"=>minseg2<="00111111";

when"0001"=>minseg2<="00000110";

when"0010"=>minseg2<="01011011";

when"0011"=>minseg2<="01001111";

when"0100"=>minseg2<="01100110";

when"0101"=>minseg2<="01101101";

whenothers=>minseg2<="01111111";

endcase;

endprocess;

process(hour_counter1)--小时低位显示

begin

casehour_counter1is

when"0000"=>hourseg1<="10111111";

when"0001"=>hourseg1<="10000110";

when"0010"=>hourseg1<="11011011";

when"0011"=>hourseg1<="11001111";

when"0100"=>hourseg1<="11100110";

when"0101"=>hourseg1<="11101101";

when"0110"=>hourseg1<="11111101";

when"0111"=>hourseg1<="10000111";

when"1000"=>hourseg1<="11111111";

when"1001"=>hourseg1<="11101111";

whenothers=>hourseg1<="11111111";

endcase;

endprocess;

process(hour_counter2)--小时高位显示

begin

casehour_counter2is

when"0000"=>hourseg2<="00111111";

when"0001"=>hourseg2<="00000110";

when"0010"=>hourseg2<="01011011";

when"0011"=>hourseg2<="01111111";

endcase;

endprocess;

endbehavioral;--程序结束

五结论以及结果说明

1.系统运行环境

(1)PC机一台

(2)QuartusII6.0软件一套

(3)主芯片为ALTERA公司DE2board(CYCLONEⅡ2C55FPGA)

2.运行结果

程序运行正常,实验板仿真由于管脚问题没能得以实现。

参考文献

[1]何宾.EDA原理及应用[M].出版地:

清华大学出版社,2009.237-247.

[2]何宾.EDA原理及应用实验教程[M].出版地:

清华大学出版社,2009.70-75.

 

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

当前位置:首页 > 解决方案 > 学习计划

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

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