版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数字时钟的设计
摘要:在这快速开展的年代,时间对人们来说是越来越珍贵,在快节奏的生活时,人们往往忘记了时间,一旦遇到重要的事情而忘记了时间,这将会带来很大的损失。因此我们需要一个定时系统来提醒这些忙碌的人。数字化的钟表给人们带来了极大的方便。近些年,随着科技的开展和社会的进步,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。本设计主要研究基于FPGA的数字钟,要求时间以24小时为一个周期,显示时、分、秒。
关键字:数字时钟,EDA,FPGA,VHDL,Max_Plus_II
引言
本设计采用的VHDL是一种全方位的硬件描述语言,具有极强的描述能力,能支持系统行为级、存放器传输级和逻辑门级三个不同层次的设计;支持结构、数据流、行为三种描述形式的混合描述、覆盖面广、抽象能力强,因此在实际应用中越来越广泛。ASIC是专用的系统集成电路,是一种带有逻辑处理的加速处理器。而FPGA是特殊的ASIC芯片,与其他的ASIC芯片相比,它具有设计开发周期短、设计制造本钱低、开发工具先进、标准产品无需测试、质量稳定以及可实时在线检测等优点。
钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为根底的。因此,研究数字钟及扩大其应用,有着非常现实的意义。
1.课题相关技术的开展
当今电子产品正向功能多元化,体积最小化,功耗最低化的方向开展。它与传统的电子产品在设计上的显著区别师大量使用大规模可编程逻辑器件,使产品的性能提高,体积缩小,功耗降低.同时广泛运用现代计算机技术,提高产品的自动化程度和竞争力,缩短研发周期。EDA技术正是为了适应现代电子技术的要求,吸收众多学科最新科技成果而形成的一门新技术。
美国ALTERA公司的可编程逻辑器件采用全新的结构和先进的技术,加上MaxplusII(或最新的QUARTUS)开发环境,更具有高性能,开发周期短等特点,十分方便进行电子产品的开发和设计。
EDA技术,技术以大规模可编程逻辑器件为设计载体,以硬件描述语言为系统逻辑描述主要表达方式,以计算机、大规模可编程逻辑器件的开发软件及实验开发系统为设计工具,通过有关的开发软件,自动完成用软件的方式设计的电子系统到硬件系统的逻辑编译,逻辑化简,逻辑分割,逻辑映射,编程下载等工作。最终形成集成电子系统或专用集成芯片的一门新技术。
本设计利用VHDL硬件描述语言结合可编程逻辑器件进行的,并通过数码管动态显示计时结果。数字钟可以由各种技术实现,如单片机等.利用可编程逻辑器件具有其他方式没有的特点,它具有易学,方便,新颖,有趣,直观,设计与实验工程成功率高,理论与实践结合紧密,体积小,容量大,I/O口丰富,易编程和加密等特点,并且它还具有开放的界面,丰富的设计库,模块化的工具以及LPM定制等优良性能,应用非常方便。因此,本设计采用可编程逻辑器件实现。
本设计主要研究基于FPGA的数字钟,要求时间以24小时为一个周期,显示年、月、日、时、分、秒。具有校时以及报时功能,可以对年、月、日、时、分及秒进行单独校对,使其校正到标准时间。
2.数字钟整体设计方案
2.1数字钟的功能
1〕以24小时制显示时、分、秒计数;
2〕时间清零,时设置,分设置功能;
3〕整点报时功能。
2.2引脚说明以及设计方案
clk为秒脉冲输入端,由晶振与分频计数器〔CD4060〕组成的脉冲发生电路提供频率为1Hz的秒脉冲输入信号;smclk为动态扫描控制模块的输入端,由脉冲发生电路输入频率约1kHz的脉冲信号;hourset、minset和reset分别为时设置、分设置和时间清零输入端,连接按钮开关;a、b、c、d、e、f、g、dp为显示段码输出,接数码管的段码输入〔led7s6-len7s0〕;sel0、sel1、sel2接SN74LS138N译码器的输入端。
3.可编程逻辑器件FPGA的顶层设计
用顶层设计采用原理图输入设计、底层设计采用VHDL设计的原理图与VHDL混合设计方法设计带整点报时功能的数字钟,所以此设计可分为顶层与底层设计,共分为六个模块,即时模块、分模块、秒模块、动态扫描控制模块、段码译码模块和整点报时模块。
秒模块主体为60进制的计数器,daout为向动态扫描控制模块提供秒的个位和十位数据的信号。reset为秒清零;enmin为分钟进位,每60秒产生一个高电平的信号,作为分模块的时钟输入;clk为秒模块的时钟输入,接1Hz脉冲信号;min_set为分钟设置,低电平是不影响秒模块工作,当它为高电平时,enmin信号会随之产生一个和clk频率相同的信号,到达调整分钟的目的。
分模块主体为60进制的计数器,daout为向动态扫描控制模块提供分的个位和十位数据的信号。Enhour为分钟进位,每60分产生一个高电平的信号,作为时模块的时钟输入;秒计数到60时的进位输出信号enhour1和分钟调整输入信号minset,经或关系后接分的脉冲输入端clk;clk1为时调整脉冲,接1Hz脉冲;hour_set为时钟设置,低电平是不影响分模块工作,当它为高电平时,enmin信号会随之产生一个和clk频率相同的信号,到达调整时的目的。
时模块为一个24进制的计数器,daout为向动态扫描控制模块提供秒的个位和十位数据的信号。分计数到60时的进位输出信号enhour1和时调整输入信号hourset,经或关系后接时脉冲输入端clk。daout为向动态扫描控制模块提供时的个位和十位数据的信号。
动态扫描模块中smclk为动态扫描控制模块的脉冲输入,由外部脉冲发生电路提供,频率约为1kHz;sel0、sel1、sel2接外部3-8译码器74LS138的输入端A、B、C;sec[6..0]、min[6..0]、hour[5..0]分别为秒模块、分模块、时模块计数段码输出控制信号。该模块实现时间的动态扫描显示控制。
整点报时模块用于产生整点时的LED发光二极管彩灯和报时输出。整点声音报时输出信号speak接蜂鸣器输入,信号lamp[2..0]控制整点时产生60秒的LED发光二极管彩灯闪烁报时输出信号。
图2-1顶层电路设计原理图
4.数字时钟的底层模块设计
4.1秒模块设计
图3-1秒模块顶层设计原理图
4.1.1秒模块VHDL程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitysecis
port(clk,reset,min_set:instd_logic;--clk为1Hz的秒脉冲输入信号,reset为秒清零〔复位〕信号
--min_set为分钟调整
enmin:outstd_logic;--enmin为秒模块进位输出
daout:outstd_logic_vector(6downto0));--2n-1≥60,n=7,27=64,分钟用7位二进制数表示
--daout〔6..4〕为十位,daout〔3..0〕为个位,60循环计数
endentitysec;
architecturebehaveofsecis
signalcount:std_logic_vector(6downto0);--定义内部计数节点,60循环计数
signalenmin1,enmin2:std_logic;
--enmin为60秒产生的进位,enmin2为调分键产生的向分模块的进位
begin
daout<=count;
enmin2<=(min_setandclk);
enmin<=(enmin1orenmin2);--60秒钟到和调分键均向分模块产生进位脉冲
process(clk,reset,min_set)
begin
if(reset='0')thencount<="0000000";--检测秒模块的1Hz脉冲上升沿
elsif(clk'eventandclk='1')then
if(count(3downto0)="1001")then--秒的个位是否到“9〞
ifcount(6downto4)="101"then--秒各位到“9〞后,十位计数到“5〞
enmin1<='1';
--秒模块的60秒进位输出enmin置“1〞,向分模块产生进位
count<="0000000";--秒计数值“0000000〞〔零秒〕
else
count<=count+7;
--秒各位到“9〞后,十位计数没到“5〞,那么加“7〞变为“0〞,同时向十位进位
endif;
else
count<=count+1;--秒个位没计到“9〞时,秒计数值加“1〞
enmin1<='0';--秒模块的60秒进位输出enmin1置“0〞,不向分模块进位
endif;
endif;
endprocess;
endbehave;
4.2秒模块的仿真实现
由图3-2可以看出clk输入脉冲信号时,动态扫描控制模块daout和count开始启动计数,此时分设置min_set为低电平。在570.0ns时将min_set设置为高电平,此刻分进位enmin产生与clk相同频率的信号脉冲,当在593.0.0ns时,min_set为低电平,那么enmin也为低电平〔无脉冲〕。当723.0ns时,清零reset设置为低电平,此刻daout和count都将清零,当735.0ns时reset恢复为高电平,daout和coutn两者重新开始计数。605.0ns时daout计数到六十,enmin产生脉冲后daout和count清零并重新开始计数。
如上所述功能实现。
图3-2秒模块仿真图
4.3分模块设计
图3-3分模块顶层设计原理图
4.3.1分模块VHDL程序
LIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
ENTITYminIS
PORT(clk,clk1,hour_set:INSTD_LOGIC;--clk为分钟模块的脉冲输入信号,接秒模块的进位输出
--clk1接秒脉冲输入,hour_set为小时调整
enhour:OUTSTD_LOGIC;--enhour为分钟模块的进位输出
daout:OUTSTD_LOGIC_VECTOR(6DOWNTO0));
--2n-1≥60,n=7,27=64,分钟用7位二进制数表示
--daout〔6..4〕为十位,daout〔3..0〕,60循环计数
ENDENTITYmin;
ARCHITECTUREbehaveOFminIS
SIGNALcount:STD_LOGIC_VECTOR(6DOWNTO0);--定义内部计数节点,60循环计数
SIGNALenhour1,enhour2:STD_LOGIC;
--enhour1为60分钟产生的进位。enhour2为调时键的脉冲
BEGIN
daout<=count;
enhour2<=(hour_setandclk1);
enhour<=(enhour1orenhour2);--60分钟到和调时键均向小时模块产生进位脉冲
PROCESS(clk)
BEGIN
IF(clk'eventandclk='1')THEN--检测分钟模块的脉冲上升沿
IF(count(3downto0)="1001")THEN--分钟的各位是否到“9〞
IFcount(6downto4)="101"THEN--分钟各位到“9〞后,十位计数到“5〞
enhour1<='1';
--分钟模块的60分钟进位输出enhour1置“1〞,向时模块产生进位
count<="0000000";--分钟计数值回零“0000000〞〔零分〕
ELSE
count<=count+7;
--分钟各位到“9〞后,十位计数没到“5〞,那么“7〞变为“0〞,同时向十位进位
ENDIF;
ELSE
count<=count+1;--分钟各位没计到“9〞时,分钟计数值加“1〞
enhour1<='0';--分钟模块的60分钟进位输出enhour1置“0〞,不向时模块进位
ENDIF;
ENDIF;
ENDPROCESS;
ENDbehave;
4.3.2分模块的仿真实现
由图3-4可以看出,当clk输入脉冲信号时,态扫描控制模块daout和count开始启动计数,这时时进位enhour为低电平,且时设置hour_set也为低电平。在1.05us时,将hour_set设置为高电平,此时enhour产生与clk1相同的频率信号。当1.09us时,hour_set恢复低电平,enhour也变为低电平〔无脉冲〕。1.21us时,daout计数到60,enhour产生脉冲,daout和count清零并将重新计数。
如上所述功能实现。
图3-4分模块仿真图
4.4时模块设计
图3-5时模块顶层设计原理图
4.4.1时模块VHDL程序
LIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
ENTITYhourIS
PORT(clk:INSTD_LOGIC;
daout:OUTSTD_LOGIC_VECTOR(5DOWNTO0));
--2n-1≥24,n=6,26=32,小时用6位二进制数表示
--daout〔5..4〕为十位,daout〔3..0〕为个位,24循环计数
ENDENTITYhour;
ARCHITECTUREbehaveOFhourIS
SIGNALcount:STD_LOGIC_VECTOR(5DOWNTO0);--定义内部计数节点,24循环计数
BEGIN
daout<=count;
PROCESS(clk)
BEGIN
IF(clk'eventandclk='1')THEN--检测小时模块的脉冲上升沿
IF(count(3downto0)="1001")THEN--小时的各位是否到“9〞
IF(count<16#23#)THENcount<=count+7;
--小时各位到“9〞后,计数没到“23〞,那么加“7〞变为“0〞,同时向十位进位
ELSEcount<="000000";
--小时各位到“9〞后,如果计数值大于“23〞,那么置小时为“零〞
ENDIF;
ELSIF(count<16#23#)THENcount<=count+1;
--小时个位没计到“9〞且计数没到“23〞时,加“1〞
ELSEcount<="000000";--小时计数已到“23〞时,计数值回零“000000〞〔零时〕
ENDIF;
ENDIF;
ENDPROCESS;
ENDbehave;
4.4.2时模块的仿真实现
由图3-6可以看出,当clk输入脉冲信号时,动态扫描控制模块daout和count开始启动计数。在970.0ns时,daout和count到达24,并且从重新开始计数。
如上所述功能实现。
图3-6时模块仿真图
4.5动态显示扫描模块设计
图3-7动态显示扫描模块顶层设计原理图
4.5.1动态显示扫描模块VHDL程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entityselmkis
port(clk1:instd_logic;--动态扫描输入脉冲
sec,min:instd_logic_vector(6downto0);--7位二进制数表示的秒、分计数输入
hour:instd_logic_vector(5downto0);--6位二进制数表示的小时计数输入
daout:outstd_logic_vector(3downto0);--4位十进制码计数输入
dp:outstd_logic;--时、分、秒间的间隔“点〞输出
sel:outstd_logic_vector(2downto0));
--3位数码管位选输出,接外部3-8译码器输出,译码输出再经驱动接数码管共阴极端
endentityselmk;
architecturebehaveofselmkis
signalcount:std_logic_vector(2downto0);
--定义内部计数节点,六进制循环计数〔6个数码管显示〕
begin
sel<=count;
process(clk1)
begin
if(clk1'eventandclk1='1')then--检测动态扫描输入脉冲上升沿
if(count>="101")thencount<="000";
elsecount<=count+1;--“000~101〞六进制循环计数
endif;
endif;
casecountis
when"000"=>daout<=sec(3downto0);dp<='0';
--“000〞时选择“秒的各位〞计数值显示,点不亮
when"001"=>daout(3)<='0';daout(2downto0)<=sec(6downto4);dp<='0';
--“001〞时选择“秒的各位〞计数值显示,点不亮
when"010"=>daout<=min(3downto0);dp<='1';
--“010〞时选择“分的各位〞计数值显示,点亮
when"011"=>daout(3)<='0';daout(2downto0)<=min(6downto4);dp<='0';
--“011〞时选择“分的各位〞计数值显示,点不亮
when"100"=>daout<=hour(3downto0);dp<='1';
--“100〞时选择“时的各位〞计数值显示,点亮
whenothers=>daout(3downto2)<="00";
daout(1downto0)<=hour(5downto4);dp<='0';
--“101〞时选择“时的各位〞计数值显示,点不亮
endcase;
endprocess;
endbehave;
4.5.2动态显示扫描模块的仿真实现
由图3-8可以看出,当clk1输入脉冲信号时,随着信号的变化,sec的十位、个位,min的十位、个位,hour的十位、个位分别送进了daout中。
图3-8动态显示扫描模块顶层设计原理图
4.6段码译码模块设计
图3-9段码译码顶层设计原理图
4.6.1段码译码模块VHDL程序
libraryieee;
useieee.std_logic_1164.all;
entitydecl7sis
port(num:instd_logic_vector(3downto0);
led7s:outstd_logic_vector(6downto0));
endentitydecl7s;
architecturebehaveofdecl7sis
begin
process(num)
begin
casenumis
--abcdefg--字形
when"0000"=>led7s<="1111110";
when"0001"=>led7s<="0110000";
when"0010"=>led7s<="1101101";
when"0011"=>led7s<="1111001";
when"0100"=>led7s<="0110011";
when"0101"=>led7s<="1011011";
when"0110"=>led7s<="1011111";
when"0111"=>led7s<="1110000";
when"1000"=>led7s<="1111111";
when"1001"=>led7s<="1111011";
whenothers=>null;
endcase;
endprocess;
endbehave;
4.6.2段码译码模块的仿真实现
由图3-10可以看出,此模块是将扫描模块的dout信号输出的BCD码转换为数码管可以显示的段码。
如上所述功能实现。
图3-10段码译码模块时序仿真图
4.7整点报时模块设计
图3-11整点报时模块顶层设计原理图
4.7.1整点报时模块VHDL程序
LIBRARYieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitybsmkis
port(clk:instd_logic;--脉冲输入,可接1Hz秒脉冲输入,用于整点声报时发出间断报时响声
dain:instd_logic_vector(6downto0);--分钟模块计数输入
speak:outstd_logic;--整点声报时输出,外接蜂鸣器
lamp:outstd_logic_vector(2downto0));
--整点光报时输出,可外接红、蓝、黄三个发光二极管
endentitybsmk;
architecturebehaveofbsmkis
signalcount:std_logic_vector(1downto0);--定义内部计数节点
begin
process(clk)
begin
speak<=count(0)andclk;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电分的课程设计
- 2024年地下停车场车位出租合同范本:高效便捷租赁服务3篇
- 2024年版公路货物运输协议范例文件版B版
- 早期干预教育课程设计
- 2024年果蔬买卖协议
- 2024年度智能家居产品全生命周期售后服务与维保综合协议3篇
- 2024年虫草批发销售协议版B版
- 2024年度消防技术服务合同范本6篇
- 2024年股权退出合同规定本
- 2024年自建房施工监理合同2篇
- 2024-2025学年度第一学期四年级数学寒假作业
- 读后续写+旧忆新愁:办公室冷遇触发校园往事追思+讲义-2025届浙江省嘉兴市高三上学期一模英语试题
- 川藏铁路勘察报告范文
- 喷漆安全管理制度模版(3篇)
- Java Web程序设计教程(第二版)(微课版)01 Web应用开发概述
- 上海黄浦区2025届物理高一第一学期期末质量跟踪监视模拟试题含解析
- 肺结核课件教学课件
- 八年级上册物理全册知识点总结(人教)
- 高考英语词汇3500词-乱序版
- 2024年广告代理合同的广告投放范围与分成比例
- 2024年光伏发电项目融资贷款合同
评论
0/150
提交评论