多功能数字钟课程设计VHDL代码书上程序改
基于VHDL的多功能数字钟的设计
文章编号:1671-251X(2006)03-0092-03基于VHDL 的多功能数字钟的设计樊永宁1, 张晓丽2(1.宁夏煤业集团有限责任公司,宁夏银川 750000;2.西安科技大学通信与信息工程学院,陕西西安 710054)摘要:介绍了利用VH DL 硬件描述语言设计的多功能数字钟的思路和技巧。
在MAX+PLU SII 开发环境中编译和仿真了所设计的程序,并在可编程逻辑器件上下载验证。
仿真和验证结果表明,该设计方法切实可行,具有一定的借鉴性。
关键词:数字钟;硬件描述语言;VH DL;MAX+PLUSII 中图分类号:TP39 文献标识码:B 0 引言随着电子设计自动化(EDA)的高速发展,电子系统的设计技术和工具发生了深刻的变化。
EDA 的关键技术之一是要求用形式化方式来描述数字系统的硬件电路,即要用所谓硬件描述语言来描述硬件电路。
本文即介绍如何利用V H DL 硬件描述语言设计一个具有年、月、日、时、分、秒计时显示、调整时间和整点报时功能的数字钟,并且利用MAX+PLU SII 开发环境进行编译、仿真,最终下载到可编程逻辑器件FPGA 上进行验证。
1 设计原理数字钟电路原理框图如图1所示。
图1 数字钟电路原理框图收稿日期:2006-03-30数字钟电路由秒、分、时、日、月、年6个计数模块和1个报警模块、1个时间数据动态扫描模块、1个显示译码模块组成。
设置计数年份从2000年到2099年,即年计数模块是1个100进制计数器。
秒计数模块的计数时钟clk为1H z的标准信号。
当数字钟处于正常计时状态时,秒计数器的进位输出信号enmin作为分钟模块的计数信号,分计数模块的进位输出enhour 作为小时模块的计数信号,依次,时进位输出en2 day,日进位输出enmon,月进位输出enyear,分别作为日、月、年的计数信号。
定义一个手动脉冲输入set。
当set=0时,数码管显示时、分、秒;当set=1时,数码管显示年、月、日。
电子时钟课程设计--基于VHDL的电子钟的设计
电子技术课程设计题目基于VHDL的电子钟的设计学院名称电气工程学院指导教师 XXX职称教授班级电力XXX班学号 2007XXX学生姓名XXX2010年 01 月 15 日课程设计任务书学院电气工程学院专业电气工程及其自动化班级电力XXX班学号 2007XXXXXXX姓名 XXX 指导老师 XXX一设计课题名称基于VHDL的电子钟的设计二电子钟功能本课题要求所设计的电子钟能够正常进行时、分、秒计时,并显示计时结果。
同时具有校时功能。
三设计要求1.详细说明设计方案;2.用VHDL编写设计程序;3.给出系统仿真结果;4.进行硬件验证。
目录第一章1.1引言----------------------------------------------------------------4 1.2 课题设计的背景、目的---------------------------------------4第二章2.1 EDA的简单介绍------------------------------------------------ 6 2.2 VHDL的简单介绍----------------------------------------------- 6 2.3 Quartus2 软件----------------------------------------------- 7 第三章3.1电子钟的结构图--------------------------------------------------9 3.2小时模块------------------------------------------------ 9 3. 3分钟模块---------------------------------------------- 11 3.4 秒钟模块-------------------------------------------12 3.5 时间设置模块--------------------------------------------- 14 心得体会------------------------------------------------------------17参考文献------------------------------------------------------------18第一章1.1 引言随着科学技术的不断发展,人们对时间计量的精度要求越来越高。
数字钟的设计课程设计VHDL
数字钟的设计 课程设计 VHDL一、课程目标知识目标:1. 理解数字时钟的基本原理和VHDL语言编程基础;2. 学会使用VHDL语言设计简单的数字时钟电路;3. 掌握数字时钟各模块的功能及其相互关系;4. 了解数字时钟在实际应用中的重要性。
技能目标:1. 能够运用VHDL语言编写简单的数字时钟程序;2. 能够对设计的数字时钟进行功能仿真和时序分析;3. 能够根据实际需求调整和优化数字时钟设计;4. 培养学生的团队协作能力和问题解决能力。
情感态度价值观目标:1. 培养学生对数字电路设计和VHDL编程的兴趣和热情;2. 增强学生对我国集成电路产业的认识,提高国家自豪感;3. 培养学生严谨、认真、负责的学习态度,为未来从事相关工作奠定基础。
课程性质:本课程为电子信息类专业的实践课程,旨在帮助学生掌握数字时钟设计的基本方法和技能。
学生特点:学生已具备一定的数字电路基础和VHDL编程知识,具有一定的自学能力和动手能力。
教学要求:结合学生特点,注重理论与实践相结合,强化实践操作,鼓励学生创新和团队协作。
通过本课程的学习,使学生能够独立完成数字时钟的设计与实现,达到学以致用的目的。
二、教学内容1. 数字时钟原理概述:数字时钟的组成、工作原理和性能指标;2. VHDL语言基础:VHDL程序结构、数据类型、运算符、顺序语句和并行语句;3. 数字时钟设计方法:分频器、计数器、秒表、时钟显示等模块的设计原理和实现方法;4. 数字时钟电路仿真:功能仿真和时序分析,优化设计;5. 数字时钟综合设计:根据实际需求,完成数字时钟的各个模块设计和整体集成;6. 数字时钟实践操作:动手实践,调试和优化数字时钟设计。
教学大纲安排:第一周:数字时钟原理概述,VHDL语言基础;第二周:数字时钟各个模块的设计方法;第三周:数字时钟电路仿真,功能验证;第四周:数字时钟综合设计,实践操作。
教学内容关联教材章节:1. 数字时钟原理概述:第三章 数字电路基础;2. VHDL语言基础:第四章 VHDL硬件描述语言;3. 数字时钟设计方法:第五章 数字系统设计;4. 数字时钟电路仿真:第六章 数字电路仿真;5. 数字时钟综合设计:第五章 数字系统设计;6. 数字时钟实践操作:实验指导书相关内容。
多功能数字电子钟_VHDL
四、各功能模块的源程序代码 :
-- CONTOR 模块 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity contor is
1 )“小时” 校时状态: 进入“小时”校时状态后,显示 “小时” 的数码管闪烁,每按动“ k” 键一次,“小时” +1,若不按动“ k”键 则小时数不变,一直按下“ k” 键则小时数一 4Hz 的频率递增计数。
2 )“分”校时状态:进入“分”校时状态后,显示“分”的数 码管闪烁,每按动“ k” 键一次,“分” +1,若不按动“ k”键则分数 不变,一直按下“ k” 键则分数一 4Hz的频率递增计数。
chs,cms,css,f4 :in std_logic; bsg,bmg,bhg,bsd,bmd,bhd :buffer std_logic_vector(3 downto 0); comout :out std_logic); end time_com; architecture time_comx of time_com is begin com:process(hh,mh,sh,hl,ml) begin if(bhg=hh and bhd=hl and bmg=mh and bmd=ml and bsg=sh)then comout<='1'; else comout<='0'; end if; end process; set:process(f4) begin if(f4'event and f4='1')then if(chs='1'and k='0')then if(bhg="0010" and bhd="0011")then bhd<="0000";bhg<="0000"; elsif(bhd="1001")then bhd<="0000";bhg<=bhg+1; elsif(bhd="0000"or bhd="0001" or bhd="0010"or bhd="0011"or bhd="0100"or bhd="0101"or bhd="0110"or bhd="0111"or bhd="1000")then bhd<=bhd+1; end if; end if; end if; end process; process(f4) begin if(f4'event and f4='1')then if(cms='1'and k='0')then if(bmg="0101" and bmd="1001")then
EDA数字钟课程设计--用VHDL语言实现数字钟的设计
课程设计报告设计题目:用VHDL语言实现数字钟的设计班级:电子1002班学号:20102625姓名:于晓指导教师:李世平、李宁设计时间:2012年12月摘要数字钟是一种用数字电路技术实现时、分、秒计时的钟表。
本设计主要是实现数字钟的功能,程序用VHDL语言编写,整体采用TOP-TO-DOWN设计思路,具有基本的显示年月日时分秒和星期的功能,此外还有整点报时功能。
该数字钟的实现程序分为顶层模块、年月模块、日模块、时分秒定时模块、数码管显示模块、分频模块、星期模块,此外还有一个库。
该程序主要是用了元件例化的方法,此外还有进程等重要语句。
没有脉冲时,显示时分秒,set按钮产生第一个脉冲时,显示年月日,第2个脉冲到来时可预置年份,第3个脉冲到来时可预置月份,依次第4、5、6、7、8个脉冲到来时分别可预置日期、时、分、秒、星期,第 9个脉冲到来时设置星期后预置结束,正常工作,显示的是时分秒和星期。
调整设置通过Up来控制,UP为高电平,upclk有脉冲到达时,预置位加1,否则减1。
当整点到达时,报时器会鸣响,然后手动按键停止报时。
关键词:数字钟,VHDL,元件例化,数码管1、课程设计目的掌握利用可编程逻辑器件和EDA设计工具进行电子系统设计的方法2、课程设计内容及要求设计实现一个具有带预置数的数字钟,具有显示年月日时分秒的功能。
用6个数码管显示时分秒,set按钮产生第一个脉冲时,显示切换年月日,第2个脉冲到来时可预置年份,第3个脉冲到来时可预置月份,依次第4、5、6、7个脉冲到来时分别可预置日期、时、分、秒,第 8个脉冲到来后预置结束,正常工作,显示的是时分秒。
Up为高电平时,upclk有脉冲到达时,预置位加1.否则减1,还可以在此基础上增加其它功能。
3、VHDL程序设计3.1整体设计思路本设计采用top-down 模式设计,分模块进行,各功能都使用元件例化方式设计,主要有LED显示模块、时分秒定时模块、日期模块、年月模块、分频模块、星期模块,此外还创建了一个程序包,用来实现年月日、时分秒的加减调整。
基于VHDL语言的多功能数字钟设计
摘要VHDL作为一种硬件描述语言,可用于数字电路与系统的描述、模拟和自动设计与仿真等,是当今电子设计自动化的核心技术。
本文使用VHDL语言设计了一个数字时钟电路,给出了设计该数字系统的流程和方法。
本设计方法具有硬件描述能力强,设计方法灵活,便于修改等优点,大大降低了数字系统设计的难度,提高了工作效率。
本设计采用EDA技术,以硬件描述语言VHDL为系统逻辑描述手段设计文件,在MAX+PlusⅡ工具软件环境下,采用自顶向下的设计方法,由各个基本模块共同构建了一个基于CPLD的数字钟。
系统主芯片采用EPM7128SLC84,由时钟模块、控制模块、计时模块、数据译码模块、显示以及报时模块组成。
经编译和仿真所设计的程序,在可编程逻辑器件上下载验证,本系统能够完成时、分、秒的分别显示,由按键输入进行数字钟的校时、清零、启停功能。
关键词:硬件描述语言,VHDL,数字电路设计, 数字钟Digital Clock Design Based On The Hardware DescriptionLanguage(VHDL)Author: 。
Tutor: 。
AbstractVHDL can be used to describe,simulate and digital system automatically. Nowdays,it becomes a key technology in automatic electronic design. There is a lot of superiority in this description language.This article introduces the method and the process using VHDL to design a digital system by an example of digital clock dasign. The result given in this paper shows that VHDL is one of the strongest tools in hardware description and it is a flexible among the design method. The method given in this paper can reduce the difficulty of digital system design and improve the work efficiency.The use of EDA design technology, hardware-description language VHDL description logic means for the system design documents, in MaxplusII tools environment, a top-down design, by the various modules together build a CPLD-based digital clock.The main system chips used EPM7128SLC84, make up of the clock module, control module, time module, data decoding module, display and broadcast module. After compiling the design and simulation procedures, the programmable logic device to download verification, the system can complete the hours, minutes and seconds respectively, using keys to modify, cleared , start and stop the digital clock.Key words: Hardware description language,VHDL, Digital circuit design, digital clock目录1 绪论 (1)1.1课题背景 (1)1.2本课题研究的内容 (1)2 总体设计方案 (3)3 单元模块电路设计 (4)3.1时间显示电路模块设计 (4)3.2按键及指示灯电路模块的设计 (5)3.3蜂鸣器及有源晶振电路的设计 (7)3.4CPLD编程下载电路的设计 (8)3.5电源电路的设计 (9)3.5.1变压器次级电压估算 (9)3.5.2 变压器输入功率的计算 (9)3.5.3 滤波电容参数的选取 (10)3.6EPM7128SLC84器件介绍 (10)4 CPLD 编程设计 (11)4.1系统信号的定义及顶层模块 (11)4.2时钟节拍产生模块 (12)4.3模式选择功能模块 (14)4.4快速时间设置功能模块 (16)4.5秒、分、时计时与时间调整模块 (16)4.6闹铃时间设置模块 (18)4.7闹铃与整点报时模块 (19)4.8七段显示译码模块 (20)4.9LED显示模块 (22)5 系统功能仿真 (25)5.1时钟节拍产生模块的仿真波形 (25)5.2模式选择功能模块的仿真波形 (26)5.3闹铃设置功能模块的仿真波形 (27)5.4七段译码功能模块的仿真波形 (28)5.5LED显示功能模块的仿真波形 (30)5.6系统总体功能仿真波形 (31)总结 (32)致谢 (33)参考文献 (34)附录A:基于CPLD的多功能数字钟电路图 (35)附录B:基于VHDL语言的时、分、秒等电路的源码 (36)1绪论1.1 课题背景我们已经进入了数字化和信息化的时代,其特点是各种数字产品的广泛应用。
多功能数字钟报告及VHDL源程序
多功能数字钟报告及VHDL源程序一、系统功能概述功能描述;1.完成秒/分/时的依次显示并正确计数;2.实现整点报时,有扬声器发出报时声音;3.时间设置,在计时状态下按下set键,进入校时状态,再按下s1键实现秒校验,按下s2键实现分计时,按下s3键实现时校验。
4.实现12/24小时转换,按下change键,进入24小时计时;二、系统组成以及系统各部分的设计1、系统结构描述本设计未采用模块构成电路图结构,也未用顶层文件,而由简单的vhdl语句构成.。
首先,进入进程后由if语句判断启动键是否有效,当启动键有效时,再判断秒校时键是否有效,然后依次判断分校时,时校时。
当校时键有效时,时间设置按脉冲依次计时,到设置值后断开校时键,最后断开启动校时键,即实现时间的设置。
计时功能由if语句嵌套实现,外层实现秒计时,内层依次实现分计时,时计时。
最后将变量值传给输出端口。
整点报时功能的实现,通过判断时、分、秒高低位都为0来输出高电位,否者,输出低电位。
2.设计源程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity shuzizhong isport(clk,set,change,s1,s2,s3:in std_logic;second1,second2,minite1,minite2,hour1,hour2:out std_logic_vector(3 downto 0); cout:out std_logic);end entity;architecture one of shuzizhong isbeginpro1:process(clk,set,s1,s2,s3,change)variablemsecond1,msecond2,mminite1,mminite2,mhour11,mhour12,mhour21,mhour22:std_logic_vecto r(3 downto 0);beginif clk'event and clk='1' thenif set='1' then -----启动校验if s1='1'then msecond1:=msecond1+1;if msecond1="1010"then msecond1:="0000";msecond2:=msecond2+1;if msecond2="0110"then msecond2:="0000";end if;end if;end if; --------秒校验if s2='1'thenmminite1:=mminite1+1;if mminite1="1010"then mminite1:="0000";mminite2:=mminite2+1;if mminite2="0110"then mminite2:="0000";end if;end if;end if; ---------分校验if s3='1' thenmhour11:=mhour11+1;mhour21:=mhour21+1;if mhour11="1010" then mhour11:="0000";mhour12:=mhour12+1;end if;if mhour11="0011" and mhour12="0001"then mhour11:="0001";mhour12:="0000"; end if;if mhour21="1010" then mhour21:="0000";mhour22:=mhour22+1;end if;if mhour21="0100"and mhour22="0010"thenmhour21:="0000";mhour22:="0000";end if;end if;-------时校验else msecond1:=msecond1+1;-----正常计时工作if msecond1="1010"then msecond1:="0000";msecond2:=msecond2+1;if msecond2="0110"then msecond2:="0000";mminite1:=mminite1+1;if mminite1="1010"then mminite1:="0000";mminite2:=mminite2+1;if mminite2="0110"then mminite2:="0000";mhour11:=mhour11+1;mhour21:=mhour21+1;if mhour11="1010" then mhour11:="0000";mhour12:=mhour12+1;end if;if mhour11="0011" and mhour12="0001"then mhour11:="0001";mhour12:="0000";end if;-------12小时制if mhour21="1010" then mhour21:="0000";mhour22:=mhour22+1;end if;if mhour21="0100"and mhour22="0010"then mhour21:="0000";mhour22:="0000";end if;----------24小时制end if;end if;end if;end if;if (msecond1="0000") and (msecond2="0000") and (mminite1="0000") and (mminite2="0000") then cout<='1';else cout<='0';end if;-----------整点报时end if;end if;second1<=msecond1;second2<=msecond2;minite1<=mminite1;minite2<=mminite2;if change='0' then hour1<=mhour11;hour2<=mhour12;else hour1<=mhour21;hour2<=mhour22;------12/24小时制转换end if;end process;end architecture one;---------结束2、系统以及各个模块的仿真波形1.整体计时波形图2.时间设置波形图3、下载时选择的开发系统模式以及管脚定义选择模式0表1 GW48-CK开发系统工作模式:三、课程设计过程中遇到的问题以及解决方法通过这次课程设计,我遇到了很多困难,开始自己尝试了数字锁,数字钟实验的编程,但总是与理想效果相去甚远,只有偶尔一个模块设计正确,为了体验这次程序的完整过程,最后不得不借用了同学的成功版本。
基于VHDL的数字时钟课程设计
数字时钟设计1.设计要求(1)能显示周、时、分、秒,精确到0.1秒(2)可自行设置时间(3)可设置闹铃,并且对闹铃时间长短可控制2.设计分析(1)根据题目要求可分解为正常计时、时间设置和闹铃设置三大模块(2)正常计时模块可分解为周、时、分、秒等子模块(3)时间设置模块分别进行秒置数、分置数、时置数和周置数(4)闹铃设置模块分解为闹钟判定和闹铃时长设定3.设计结构图4.设计流程图否是否--Second1(秒计数6进制和10进制)Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity second1 isPort( clks,set:in std_logic;s1,s0:in std_logic_vector(3 downto 0);Secs,Secg: buffer std_logic_vector(3 downto 0);cout1:out std_logic);End second1;Architecture a of second1 isBeginProcess(clks,set)variable ss,sg: std_logic_vector(3 downto 0);--(ss:秒十位;sg秒个位) variable co: std_logic;BeginIf set='1' then ss:=s1; sg:=s0;Elsif clks'event and clks='1' thenif ss="0101" and sg="1001" then ss:="0000"; sg:="0000";co:='1'; elsif sg<"1001" then sg:=sg+1;co:='0';elsif sg="1001" then sg:="0000";ss:=ss+1;co:='0';end if;end if;cout1<=co;-- (进位信号)Secs<=ss;Secg<=sg;end process;End a;仿真波形图:--Min1(分计数器6进制和10进制alm实现整点报时)Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity min1 isPort(clkm,set:in std_logic;m1:in std_logic_vector(3 downto 0);m0:in std_logic_vector(3 downto 0);mins,ming:out std_logic_vector(3 downto 0);enmin,alarm: out std_logic);End;Architecture a of min1 isBeginProcess(clkm,set)variable ms,mg :std_logic_vector(3 downto 0);variable so,alm :std_logic;Beginif set='0' then ms:=m1;mg:=m0;Elsif clkm'event and clkm='1' thenif ms="0101" and mg="1001" then ms:="0000";mg:="0000"; so :='1'; alm:='1'; elsif mg<"1001" then mg:=mg+1; so :='0';alm:='0';elsif mg="1001" then mg:="0000";ms:=ms+1; so :='0';alm:='0';end if;end if;alarm<=alm;enmin<= so;mins<=ms;ming<=mg;End process;End a;仿真波形图:--Hour1(时计数器4进制与2进制)Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity hour1 isPort(clkh,set:in std_logic;h1,h0:in std_logic_vector(3 downto 0);hours,hourg:buffer std_logic_vector(3 downto 0);enhour: out std_logic);End;Architecture a of hour1 isBeginProcess(clkh,set)variable hs,hg :std_logic_vector(3 downto 0);variable ho:std_logic;BeginIf set='1' then hs:=h1; hg:=h0;Elsif clkh'event and clkh='1' thenif hs="0010"and hg="0011" then hs:="0000";hg:="0000"; ho :='1'; elsif hg<"1001" then hg:=hg+1; ho :='0';elsif hg="1001" then hg:="0000";hs:=hs+1; ho :='0';end if;end if;hours<=hs;hourg<=hg;enhour<=ho;End process;End a;仿真波形图:Library ieee; (星期计数器,7进制)Use ieee.std_logic_1164.all;Use ieee.std_logic_arith.all;Use ieee.std_logic_unsigned.all;Entity week isPort(clkd,set,reset:in std_logic;d1:in std_logic_vector(3 downto 0); -- ――置数端(星期)day:buffer std_logic_vector(3 downto 0)); -- ――星期输出端end;Architecture a of week isBeginProcess(clkd,reset,set,d1)BeginIf reset='0' then day<="0000"; -- ――对星期计时器清0 Elsif set='0' then day<=d1; -- ――对星期计时器置d1的数Elsif clkd'event and clkd='1' thenIf day=6 then day<="0000"; -- ――重复计数Else day<=day+1;End if;End if;End process;End;仿真波形图:--Second2(秒置数模块,6进制和10进制)Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity second2 isPort( clks1:in std_logic;Secs,Secg: out std_logic_vector(3 downto 0));End;Architecture a of second2 isBeginProcess(clks1)variable ss,sg: std_logic_vector(3 downto 0);--(ss:秒十位;sg秒个位) Beginif clks1'event and clks1='1' thenif ss="0101" and sg="1001" then ss:="0000"; sg:="0000";elsif sg<"1001" then sg:=sg+1;elsif sg="1001" then sg:="0000";ss:=ss+1;end if;end if;Secs<=ss;Secg<=sg;end process;End a;仿真波形图:--Min2(分置数模块,6进制和10进制)Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity min2 isPort(clkm1:in std_logic;mins,ming:buffer std_logic_vector(3 downto 0));End;Architecture a of min2 isBeginProcess(clkm1)variable ms,mg :std_logic_vector(3 downto 0);Beginif clkm1'event and clkm1='1' thenif ms="0101" and mg="1001" then ms:="0000";mg:="0000"; elsif mg<"1001" then mg:=mg+1;elsif mg="1001" then mg:="0000";ms:=ms+1;end if;end if;mins<=ms;ming<=mg;End process;End a;仿真波形图:--Hour2(时置数模块,4进制与2进制)Library ieee;Use ieee.std_logic_1164.all;Use ieee.std_logic_unsigned.all;Entity hour2 isPort(clkh1:in std_logic;hours,hourg:buffer std_logic_vector(3 downto 0)); End;Architecture a of hour2 isBeginProcess(clkh1)variable hs,hg :std_logic_vector(3 downto 0);Beginif clkh1'event and clkh1='1' thenif hs="0010"and hg="0011" then hs:="0000";hg:="0000"; elsif hg<"1001" then hg:=hg+1;elsif hg="1001" then hg:="0000";hs:=hs+1;end if;end if;hours<=hs;hourg<=hg;End process;End a;仿真波形图:Library ieee; (星期置数模块,7进制)Use ieee.std_logic_1164.all;Use ieee.std_logic_arith.all;Use ieee.std_logic_unsigned.all;Entity week2 isPort(clkd1:in std_logic;day:buffer std_logic_vector(3 downto 0)); -- ――星期输出端end;Architecture a of week2 isBeginProcess(clkd1)Beginif clkd1'event and clkd1='1' thenIf day=6 then day<="0000"; -- ――重复计数Else day<=day+1;End if;End if;End process;End;仿真波形图:library ieee; (闹钟设置模块)use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity nz isport(ml,mh:in std_logic_vector(3 downto 0);hl,hh:in std_logic_vector(3 downto 0);mlo,mho:in std_logic_vector(3 downto 0);hlo,hho:in std_logic_vector(3 downto 0);set:in std_logic;output:out std_logic);end nz;architecture behav of nz issignal opt:std_logic;beginprocess(set,ml,mh,hl,hh,mlo,mho,hlo,hho)beginif set='1' thenif(ml=mlo and mh=mho and hl=hlo and hh=hho)then opt<='1';else opt<='0';end if;end if;output<=opt;end process;end behav;library ieee; (闹钟响铃时长设置)use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all; entity timeset isport( nz:in std_logic;sj:in integer range 0 to 1200;clk:in std_logic;ring:out std_logic);end timeset;architecture behav of timeset is signal count:integer range 0 to 1200; beginprocess(clk)variable co1:std_logic;beginif(clk'event and clk='1') thenif(nz='1') and (count/=sj) thencount<=count+1;co1:='1';else co1:='0';end if;end if;ring<=co1;end process;end behav;闹钟功能模块测试波形图:时间重置模块测试波形图。
基于VHDL的多功能数字闹钟设计
2 S h o o lc c l n ie r g S uh e t i tn ies y C e g u6 3 , hn ) . c o l f et a E gn e n , o tw s Ja o gUnv ri , h n d 0 C ia E r i i o t 1 1 0
得采用 了“ 自顶向下” 设计思想的 E A 解决方案得到了广泛的应用, D 从而极大地提高 了设计效率, 缩短了
产 品 的研制周 期 .再加 上其 采用 硬件 描述语 言 作为输 入 、库 的引入 、设计 文档 管理 、强 大的 电路仿 真功 能 和知识 产权 的保 护等优 点 【, 其 在现 在大 规模 电子设 计 中得 到 了广 泛 的应用 . J使 J
Ab t a t T r e f a i l r p s l a e g v n a mi g a h e i n o l f n t n l i i lco k a d t e sr n n a s r c : h e e sb e p o o as r i e i n tt e d sg fmu t u ci a g t l c n h to g a d we k i o d a
p o r mma l e i e F GA n a d r e c i t n l n u g r ga bed vc P a d h r wa e d s r i a g a e VHDL i c o d n e wi h t o ft p d wn d sg ,a d p o n a c r a c t t e me h d o — o e i n n h o e c d l r i l td wi o t r . a hmo u e a esmu ae t s fwa e h
数字时钟的VHDL设计说明
数字系统设计与硬件描述语言期末考试作业题目:数字时钟的VHDL设计学院:信息学院专业:物联网工程学号: 3011204286姓名:赵洋2013-11-06一、选题设计描述1.功能介绍设计一台能显示时、分、秒的数字钟。
由时钟信号经分频产生秒脉冲;计时计数器用24进制计时电路;可手动校时,能分别进行时、分的校正;具有整点报时功能。
2.算法简介设计原理图1 数字钟的系统框图该系统由振荡器、分频器、“时、分、秒”计数器、译码器及显示器、校时电路、整点报时电路等组成。
振荡器和分频器产生整个系统的时基信号,它直接决定计时系统的精度。
“秒计数器”采用六十进制计数器,每累计60秒向“分计数器”进位;“分计数器”采用六十进制计数器,每累计60分向“时计数器”进位;“时计数器”采用二十四进制计数器,按照“24翻1”规律计数。
“时、分、秒”计数器的输出经译码器送显示器显示。
校时电路用来当计时出现误差时对“时、分、秒”进行校对调整。
设计过程1. 设计思路时钟脉冲信号作为数字钟的时间基准,再经分频器输出标准秒脉冲。
秒计数器计满60后向分计数器进位,分计数器计满60后向小时计数器进位,小时计数器是计满24后,系统自动复位重新开始计数。
计数器的输出经译码电路后送到显示器显示。
可以用校时电路进行校时。
2.数字钟的设计方案数字钟的设计包括编码模块、分频模块、秒计时模块、分计时模块、小时计时模块和报时模块。
该数字钟可以实现3个功能:计时功能、报时功能和设置时间功能。
2.1. 编码模块编码模块主要是对时(sethour)、分(setmin)、秒(setsec)的设置输入。
2.2. 分频模块在数字钟的设计中,外部输入时钟信号clk1的频率为8hz,其分频后的频率为clk,使其分频结果为1hz,用来提供给秒计时模块、分计时模块、小时计时模块。
2.3. 秒计时模块将“秒计时脉冲”clk接信号源单元的1HZ脉冲信号,此时秒显示将从00计时到59,然后回到00,重新计时。
基于VHDL的多功能数字钟设计
西安欧亚学院本科毕业论文(设计)题目:基于VHDL的多功能数字钟设计学生姓名:指导教师:所在分院:专业:班级:二O 年月基于VHDL的多功能数字钟设计摘要:本设计为一个多功能的数字钟,具有时、分、秒计数显示功能、校时功能、定时闹钟功能以及校园打铃功能。
此数字钟是一个将“时”、“分”、“秒”显示于人的视觉器官的计时装置,它的计时周期为24小时,显示满刻度为23时59分59秒;校时功能可以根据需要自行设置时间;本课题还应定时闹铃功能,可以在任意时间响闹铃;此外,本课题具有校园打铃功能,即在每天固定时间(春季和夏季作息时间不同)响铃20s。
本设计采用EDA技术,以硬件描述语言VHDL为系统逻辑描述手段设计文件,在Quartus II 9.0工具软件环境下,采用自顶向下的设计方法,由各个基本模块共同构建了一个基于FPGA的数字钟。
硬件系统主芯片采用EP1C6TC144,整个软件方案由时钟模块、控制模块、计时模块、数据译码模块、显示以及报时模块组成。
经编译和仿真所设计的程序,在可编程逻辑器件上下载验证。
本系统用晶体振荡器产生时间标准信号,这里采用石英晶体振荡器,然后经过分频得到需要的秒计时信号。
根据60秒为1分、60分为1小时、24小时为1天的计数周期,分别组成两个60进制(秒、分)、一个24进制(时)的计数器,构成秒、分、时的计数,实现计时的功能。
显示器件选用LED七段数码管,在译码显示电路输出的驱动下,显示出清晰、直观的数字符号。
关键词:数字钟;硬件描述语言;VHDL;FPGA;键盘接口Multi-Functional Digital Clock Basedon VHDLAbstract: The propose of this thesis is to design a multi-functional digitalclock with the hour, minute and second display function, time adjusting function, the alarm function and the campus ring function. This digital clock can display hour, minute and second, which has an timing period of 24 hours, and the maximum time is 23:59:59. With time adjusting function, one can set arbitrary time manually. This clock should also have alarm function that can ring at desired time. Besides, this design can be used as a campus ring system, i.e. ring at pre-setted time, which is different at spring and autumn.This design is based on EDA technique, and use VHDL as the programing language. In Quartus II 9.0, we use the Down design method, and constitute a digital clock with several basic blocks. The main hardware IC is EP1C6TC144, and the software scheme contains blocks such as clock block, control block, timing block, LED decoding block, display block and ring block. After compile and simulation, we download the software to FPGA chip. This system need oscillator to generate standard time, then get second signal after frequency division. In corroding to the rule that there are 60 seconds in a minute, 60 minutes in a hour, and 24 hours in a day, we need two 60 counter and one 24 counter to implement the clock function. We choose LED as the display component, which can display clear and ocular digital symbol under the control of LED decoding circuit.Keywords: digital clock; hardware description language; VHDL; FPGA; keyboard interface目录1 绪论 (1)1.1 选题背景 (2)1.1.1 课题相关技术的发展 (2)1.1.2 课题研究的必要性 (3)1.1设计功能要求 (4)1.2 课题研究的内容 (4)2 FPGA开发流程简介 (5)2.1 FPGA概述 (5)2.2 FPGA基本结构 (5)2.3 FPGA系统设计流程 (8)2.4 FPGA开发编程原理 (10)3 数字钟总体设计方案 (11)3.1 系统方案的选择 (11)3.2 数字钟的构成 (14)3.2 数字钟的工作原理 (16)4 单元电路设计 (17)4.1 分频模块电路设计与实现 (17)4.2 校时控制模块电路设计与实现 (19)4.2.1 键盘接口电路原理 (19)4.2.2 键盘接口的VHDL描述 (20)4.3 计数模块设计与实现 (25)4.3.1 秒和分计数模块 (25)4.3.2 时计数模块 (27)4.3.3 时钟校时模块 (29)4.3.3 带校时功能的整体时钟模块 (30)4.4 定时闹铃模块 (32)4.4.1 闹铃控制模块 (32)4.4.2 闹铃比较模块 (34)4.5 校园打铃闹铃模块 (35)4.5.1 校园打铃模块 (35)4.5.2 打铃时间调整模块 (38)4.6 显示电路设计与实现 (39)5 结论与研究展望 (46)5.1 结论 (46)5.2 研究展望 (48)致谢 (49)参考文献 (50)1 绪论现代社会的标志之一就是信息产品的广泛使用,而且是产品的性能越来越强,复杂程度越来越高,更新步伐越来越快。
VHDL课程设计---多功能数字钟
多功能电子时钟报告一、实验目的1.学习数字系统设计的自顶向下设计法及控制器的设计。
2.加深利用EDA技术实现数字系统的体会。
二、实验仪器及器件1.EDA 开发软件(Quartus7.2)(1套)2.电脑(1台)3.实验板(1个)三、实验要求及设计方案1.设计一个具有24进制计时、显示、整点报时、时间设置和闹钟功能的数字钟,要求时钟的最小分辨率时间为1s。
2.数字钟的设计方案如下:系统输入:mode为计时显示和闹钟定时显示转换输入;set为校时和定时设置的时、分、秒转换输入;k为校时的时、分、秒手动加1输入;4*4矩阵键盘为闹钟设置调节闹钟的时、分、秒、时钟的清零以及暂停;clk40M为板载时钟信号;reset为系统复位信号。
输入信号均由按键和4*4矩阵键盘产生。
系统输出:七段数码管显示输出;蜂鸣器(bell)声音信号输出(用LED灯代替)。
3.多功能数字钟系统功能的具体描述如下:计时:正常工作状态下,每日按24小时计时制计时并显示,蜂鸣器逢整点报时。
校时:在计时显示状态下,按下“set键”,进入“小时”校时状态,再次按下“set键”,进入“分”校时状态,继续按下“set键”,进入“秒”校时状态,第四次按下“set键”又回复到正常计时显示状态。
1)“小时”校时状态:进入“小时”校时状态后,显示“小时”的数码管闪烁,每按动“k”键一次,“小时”+1,若不按动“k”键则小时数不变,一直按下“k”键则小时数以4Hz的频率递增计数。
2)“分”校时状态:进入“分”校时状态后,显示“分”的数码管闪烁,每按动“k”键一次,“分”+1,若不按动“k”键则分数不变,一直按下“k”键则分数以4Hz的频率递增计数。
3)“秒”校时状态:进入“秒”校时状态后,显示“秒”的数码管闪烁,每按动“k”键一次,“秒”+1,若不按动“k”键则秒数不变,一直按下“k”键则秒数以4Hz的频率递增计数。
整点报时:蜂鸣器在“59”分钟的第51、53、55、57秒发出频率为512Hz的低音,在“59”秒发出频率为1024Hz的高音,结束时为整点。
多功能数字钟课程设计VHDL代码书上程序改解析
library ieee;use ieee.std_logic_1164.all;entity clock isport(clk1hz:in std_logic;--1hz脉冲--clk100:in std_logic;--100hz脉冲--weekclk:in std_logic;--星期调整脉冲--start_stop:in std_logic;--秒表启动/停止控制--reset:in std_logic;--秒表复位--adclk:in std_logic;--校时脉冲--setselect:in std_logic;--调整位选择脉冲--mode:in std_logic;--功能选择脉冲--showdate:in std_logic;--日期显示--dis:out std_logic_vector(23 downto 0;--显示输出-- glisten:out std_logic_vector(5 downto 0;--闪烁指示-- weekout:out std_logic_vector(3 downto 0;--星期输出-- qh:out std_logic--整点报时--;end clock;architecture arch of clock iscomponent adjustport (adclk: in std_logic;data_in: out std_logic_vector(7 downto 0 ;end component;component controlport (setclk: in std_logic;setlap: out std_logic_vector (1 downto 0; mode: in std_logic;module: out std_logic_vector (2 downto 0 ;end component;component weekcounterport (clk: in std_logic;clk2: in std_logic;q: out std_logic_vector(3 downto 0;end component;component stopwatchport (clk: in std_logic;reset: in std_logic;start_stop: in std_logic;centsec: out std_logic_vector(7 downto 0; sec: out std_logic_vector(7 downto 0; min: out std_logic_vector(7 downto 0;end component;component h_m_s_countport (clk: in std_logic;set: in std_logic;setlap: in std_logic_vector (1 downto 0; d:in std_logic_vector(7 downto 0;sec:out std_logic_vector(7 downto 0;min:out std_logic_vector(7 downto 0; hour:out std_logic_vector(7 downto 0; qh:out std_logic;qc: out std_logic;end component;component y_m_d_countport (clk: in std_logic;set: in std_logic;setlap: in std_logic_vector(1 downto 0; data_in: in std_logic_vector(7 downto 0; day: out std_logic_vector (7 downto 0; month: out std_logic_vector (7 downto 0; year: out std_logic_vector (7 downto 0 ;end component;component displayport (module: in std_logic_vector (2 downto 0;showdate:in std_logic;clk:in std_logic;setlap:in std_logic_vector(1 downto 0;watch: in std_logic_vector (23 downto 0;time:in std_logic_vector(23 downto 0;date:in std_logic_vector(23 downto 0;dis: out std_logic_vector (23 downto 0;glisten:out std_logic_vector(5 downto 0 ;end component;signaldata_in,mcentsec,msec,mmin,ssec,smin,shour,sdate,smonth,syear:std_logic_vector(7 downto 0;signal setlap:std_logic_vector(1 downto 0;signal module:std_logic_vector(2 downto 0;signal qc:std_logic;signal watch,time,date:std_logic_vector(23 downto 0;beginu1:adjust port map(adclk,data_in;u2:control port map(setselect,setlap,mode,module;u3:stopwatch port map(clk100,reset,start_stop,mcentsec,msec,mmin;u4:h_m_s_count port map(clk1hz,module(1,setlap,data_in,ssec,smin,shour,qh,qc; u5:y_m_d_count port map(qc,module(2,setlap,data_in,sdate,smonth,syear;u6:display port map(module,showdate,clk1hz,setlap,watch,time,date,dis,glisten; u7:weekcounter port map(qc,weekclk,weekout;watch<=mmin&msec&mcentsec;time<=shour&smin&ssec;date<=syear&smonth&sdate;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity adjust isport (adclk: in std_logic;data_in: out std_logic_vector(7 downto 0;end adjust;architecture arch of adjust issignal temp2,temp1:std_logic_vector(3 downto 0; beginprocess(adclkbeginif rising_edge(adclkthenif temp1="1001" thentemp2<=temp2+'1';temp1<="0000";elsetemp1<=temp1+'1';end if;if temp2="1001" and temp1="1001" thentemp1<="0000";temp2<="0000";end if;end if;data_in<=temp2&temp1;end process;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity control isport (setclk: in std_logic;--调整脉冲--setlap: out std_logic_vector (1 downto 0;--调整位选择脉冲-- mode: in std_logic;--功能选择脉冲--module: out std_logic_vector (2 downto 0--功能输出--;end control;architecture arch of control issignal ssetlap:std_logic_vector(1 downto 0;signal s:std_logic_vector(3 downto 0;beginprocess(mode,setclkbeginif mode='1'thenssetlap<="00";elsif rising_edge(setclk then if ssetlap="10"then ssetlap<="00";elsessetlap<=ssetlap+'1';end if;end if;end process;setlap<=ssetlap;process(modebeginif rising_edge(mode then case s is when"0001"=>s<="0010"; when"0010"=>s<="0100"; when"0100"=>s<="1000"; when"1000"=>s<="0001";when others=>s<="0010";end case;end if;end process;module<=s(3 downto 1;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity counter60 isport (clk: in std_logic;--计数脉冲--clr: in std_logic;--复位--q: out std_logic_vector(7 downto 0;--计数值-- qc:out std_logic--进位输出-- ;end counter60;architecture arch of counter60 issignal temp1,temp2:std_logic_vector(3 downto 0; beginprocess(clr,clkbeginif clr='1'thentemp1<="0000";temp2<="0000";elsif rising_edge(clkthenif temp1="1001" thentemp2<=temp2+'1';temp1<="0000";elsetemp1<=temp1+'1';end if;if temp2="0101" and temp1="1001" then temp1<="0000";temp2<="0000";qc<='1';elseqc<='0';end if;end if;q<=temp2&temp1;end process;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity counter99 isport (clk: in std_logic;--100vhz计数脉冲--en: in std_logic;--计数使能--clr: in std_logic;--复位--q: out std_logic_vector(7 downto 0;--计数值--qc: out std_logic--进位--;end counter99 ;architecture arch of counter99 issignal temp1,temp2:std_logic_vector(3 downto 0; beginprocess(clr,clkbeginif clr='1'thentemp1<="0000";temp2<="0000";elsif rising_edge(clkthenif en='1' thenif temp1="1001" thentemp2<=temp2+'1';temp1<="0000";elsetemp1<=temp1+'1';end if;if temp2="1001" and temp1="1001" then temp1<="0000";temp2<="0000";qc<='1';elseqc<='0';end if;end if;end if;q<=temp2&temp1;end process;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity daycounter isport (clk: in std_logic;--计数脉冲--set: in std_logic;--调整信号--day_in: in std_logic_vector(7 downto 0;--调整输入-- day_out: out std_logic_vector(7 downto 0;--天输出-- qc: out std_logic;--进位--day28: in std_logic;--该位为1表示该月为28天--day29: in std_logic;--该位为1表示该月为29天--day30: in std_logic; --该位为1表示该月为30天-- day31: in std_logic--该位为1表示该月为31天--;end daycounter;architecture arch of daycounter issignal temp1,temp2:std_logic_vector(3 downto 0; signal days:std_logic_vector(7 downto 0;begindays<="00101000" when day28='1'else"00101001"when day29='1'else"00110000"when day30='1'else "00110001"when day31='1'else"00000000";process(clk,set,day_in,daysbeginif set='1' thentemp2<=day_in(7 downto 4;temp1<=day_in(3 downto 0;elsif rising_edge(clkthenif temp1="1001" thentemp2<=temp2+'1';temp1<="0000";elsetemp1<=temp1+'1';end if;if temp2&temp1=days then temp2<="0000";temp1<="0001";qc<='1';elseqc<='0';end if;end if;end process;day_out<=temp2&temp1; end arch;library ieee;use ieee.std_logic_1164.all; entity days_control isport (month: in std_logic_vector(7 downto 0;--月份--year2: in std_logic;--年份高位数字bcd码最低位--year1: in std_logic_vector(1 downto 0;--年份低位数字bcd码末两位--day28: out std_logic; --该位为1表示该月为28天--day29: out std_logic; --该位为1表示该月为29天--day30: out std_logic; --该位为1表示该月为30天--day31: out std_logic--该位为1表示该月为31天--;end days_control;architecture arch of days_control isbeginprocess(month,year2,year1begincase month iswhen "00000001"=>day28<='0';day29<='0';day30<='0';day31<='1';when "00000010"=>if (year2='0'and year1="00"or (year2='1'and year1="10" then day28<='0';day29<='1';day30<='0';day31<='0';elseday28<='1';day29<='0';day30<='0';day31<='0';end if;when "00000011"=>day28<='0';day29<='0';day30<='0';day31<='1'; when "00000100"=>day28<='0';day29<='0';day30<='1';day31<='0'; when "00000101"=>day28<='0';day29<='0';day30<='0';day31<='1'; when "00000110"=>day28<='0';day29<='0';day30<='1';day31<='0'; when "00000111"=>day28<='0';day29<='0';day30<='0';day31<='1'; when "00001000"=>day28<='0';day29<='0';day30<='0';day31<='1'; when "00001001"=>day28<='0';day29<='0';day30<='1';day31<='0'; when "00010000"=>day28<='0';day29<='0';day30<='0';day31<='1'; when "00010001"=>day28<='0';day29<='0';day30<='1';day31<='0'; when "00010010"=>day28<='0';day29<='0';day30<='0';day31<='1'; when others=>day28<='0';day29<='0';day30<='0';day31<='1';end case;end process;end arch;library ieee;use ieee.std_logic_1164.all;entity display isport (module: in std_logic_vector (2 downto 0;--功能选择--showdate:in std_logic;--显示日期--clk:in std_logic;--闪烁脉冲--setlap:in std_logic_vector(1 downto 0;--闪烁位选择-- watch: in std_logic_vector (23 downto 0;--秒表计数值输入-- time:in std_logic_vector(23 downto 0;--时分秒计数值输入-- date:in std_logic_vector(23 downto 0;--年月日计数值输入-- dis: outstd_logic_vector (23 downto 0;--显示输出--glisten:out std_logic_vector(5 downto 0--闪烁输出--;end display;architecture arch of display isbeginprocess(module,showdate,watch,time,datebeginif showdate='1'thendis<=date;elsecase module iswhen"001"=>dis<=watch;when"010"=>dis<=time; when"100"=>dis<=date;when others=>dis<=time;end case;end if;end process;process(clk,module,setlapbeginif module="010"or module="100"then case setlap iswhen"00"=>glisten(1 downto 0<=clk&clk; glisten(5 downto 2<="0000"; when"01"=>glisten(3 downto 2<=clk&clk; glisten(5 downto 4<="00";glisten(1 downto 0<="00"; when"10"=>glisten(5 downto 4<=clk&clk; glisten(3 downto 0<="0000";when others=>glisten<="000000";end case;else glisten<="000000";end if;end process;end arch;library ieee;use ieee.std_logic_1164.all;entity dmux isport (set:in std_logic;--调整信号--setlap: in std_logic_vector (1 downto 0;--调整位选择-- d: in std_logic_vector(7 downto 0;--调整输入--set1:out std_logic;set2:out std_logic;set3:out std_logic;q1: out std_logic_vector(7 downto 0;q2: out std_logic_vector(7 downto 0;q3: out std_logic_vector(7 downto 0;end dmux;architecture arch of dmux isbeginprocess(set,setlap,dbeginif set='1' thencase setlap iswhen"00"=>set1<='1';set2<='0';set3<='0'; q1<=d;when"01"=>set1<='0';set2<='1';set3<='0'; q2<=d;when"10"=>set1<='0';set2<='0';set3<='1'; q3<=d;when others=>set1<='0';set2<='0';set3<='0'; end case;elseset1<='0';set2<='0';set3<='0';end if;end process;end arch;library ieee;use ieee.std_logic_1164.all;entity h_m_s_count isport (clk: in std_logic;--1hz脉冲--set: in std_logic;--调整信号--setlap: in std_logic_vector (1 downto 0;--调整位选择-- d:in std_logic_vector(7 downto 0;--调整输入--sec:out std_logic_vector(7 downto 0;--秒输出--min:out std_logic_vector(7 downto 0;--分输出--hour:out std_logic_vector(7 downto 0;--小时输出-- qh:out std_logic;--整点报时--qc: out std_logic--进位--;end h_m_s_count;architecture arch of h_m_s_count iscomponent sec_mincounterport (clk: in std_logic;set:in std_logic;d:in std_logic_vector(7 downto 0;q:out std_logic_vector(7 downto 0; qc:out std_logic;end component;component hourcounterport (clk: in std_logic;set:in std_logic;d:in std_logic_vector(7 downto 0;q: out std_logic_vector(7 downto 0; qc:out std_logic;end component;component dmuxport (set:in std_logic;setlap: in std_logic_vector (1 downto 0; d: in std_logic_vector(7 downto 0;set1:out std_logic;set2:out std_logic;set3:out std_logic;q1: out std_logic_vector(7 downto 0;q2: out std_logic_vector(7 downto 0;q3: out std_logic_vector(7 downto 0;end component;signal secset,minset,hourset: std_logic;signal secin,minin,hourin:std_logic_vector(7 downto 0;signal qcsec,qcmin,qchour: std_logic;beginu1:dmux port map(set,setlap,d,secset,minset,hourset,secin,minin,hourin; u2:sec_mincounter port map(clk,secset,secin,sec,qcsec;u3:sec_mincounter port map(qcsec,minset,minin,min,qcmin;u4:hourcounter port map(qcmin,hourset,hourin,hour,qchour;qh<=qcmin;qc<=qchour;end arch;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity hourcounter isport (clk: in std_logic;--计数脉冲--set:in std_logic;--调整信号--d:in std_logic_vector(7 downto 0;--调整时间--q: out std_logic_vector(7 downto 0;--小时输出-- qc:out std_logic--进位-- ;end hourcounter;architecture arch of hourcounter issignal temp1,temp2:std_logic_vector(3 downto 0; beginprocess(clk,setbeginif set='1'thentemp2<=d(7 downto 4;temp1<=d(3 downto 0;elsif rising_edge(clk thenif temp1="1001" thentemp2<=temp2+'1';temp1<="0000";elsetemp1<=temp1+'1';end if;if temp2="0010" and temp1="0100" then temp1<="0000";temp2<="0000";qc<='1';elseqc<='0';end if;end if;end process;q<=temp2&temp1;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity monthcounter isclk: in std_logic;--计数脉冲--set: in std_logic;--调整信号--month_in: in std_logic_vector(7 downto 0;--调整输入-- month_out: out std_logic_vector(7 downto 0;--月输出-- qc: out std_logic--进位--;end monthcounter;architecture arch of monthcounter issignal temp1,temp2:std_logic_vector(3 downto 0;beginprocess(clk,set,month_inbeginif set='1' thentemp2<=month_in(7 downto 4;temp1<=month_in(3 downto 0;elsif rising_edge(clk thenif temp1="1001" thentemp2<=temp2+'1';temp1<="0000";elsetemp1<=temp1+'1';end if;if temp2="0001"and temp1="0010" then temp2<="0000";temp1<="0001";qc<='1';elseqc<='0';end if;end if;end process;month_out<=temp2&temp1;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity sec_mincounter isport (clk: in std_logic;--计数脉冲--set:in std_logic;--调整信号--d:in std_logic_vector(7 downto 0;--调整时间输入-- q:out std_logic_vector(7 downto 0;--分和秒输出-- qc:out std_logic--进位--;end sec_mincounter;architecture arch of sec_mincounter issignal temp1,temp2:std_logic_vector(3 downto 0; beginprocess(clk,setbeginif set='1'thentemp2<=d(7 downto 4;temp1<=d(3 downto 0;elsif rising_edge(clk thenif temp1="1001" thentemp2<=temp2+'1';temp1<="0000";elsetemp1<=temp1+'1';end if;if temp2="0101" and temp1="1001" then temp1<="0000";temp2<="0000";qc<='1';elseqc<='0';end if;end if;end process ;q<=temp2&temp1;end arch;library ieee;use ieee.std_logic_1164.all;entity stopwatch isport (clk: in std_logic;--100hz脉冲--reset: in std_logic;--复位--start_stop: in std_logic;--启动/停止--centsec: out std_logic_vector(7 downto 0;--百分秒输出,当超过60分转为秒-- sec: out std_logic_vector(7 downto 0;--秒输出,当超过60分转为分--min: out std_logic_vector(7 downto 0--分输出,当超过60分转为小时--;end stopwatch;architecture arch of stopwatch iscomponent counter99port (clk: in std_logic;en: in std_logic;clr: in std_logic;q: out std_logic_vector(7 downto 0;qc: out std_logic;end component;component counter60port (clk: in std_logic;clr: in std_logic;q: out std_logic_vector(7 downto 0;qc: out std_logic;end component;signal qc1,qc2,qc3,qc4,flag:std_logic;signal tcentsec,tsec,tmin,thour:std_logic_vector(7 downto 0; begin u1:counter99 port map(clk,start_stop,reset,tcentsec,qc1;u2:counter60 port map(qc1,reset,tsec,qc2;u3:counter60 port map(qc2,reset,tmin,qc3;u4:counter60 port map(qc3,reset,thour,qc4;process(qc3beginif rising_edge(qc3thenflag<='1';end if;if flag='1' thencentsec<=tsec;sec<=tmin;min<=thour;elsecentsec<=tcentsec;sec<=tsec;min<=tmin;end if;end process;end arch;library ieee;use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity weekcounter isport (clk: in std_logic;--天脉冲-clk2: in std_logic;--外部星期调整脉冲-q: outstd_logic_vector(3 downto 0--星期输出-; end weekcounter; architecture arch of weekcounter is signal temp:std_logic_vector(3 downto 0; signal cp:std_logic; begincp<=clk or clk2; process begin wait until rising_edge(cp; if temp="0111" thentemp<="0001"; else temp<=temp+'1'; end if; q<=temp; end process; end arch; library ieee; use ieee.std_logic_1164.all; entity y_m_d_count is port ( clk: in std_logic;--计数脉冲-set: in std_logic;--调整信号-setlap: in std_logic_vector(1 downto 0;--调整位选择-data_in: in std_logic_vector(7 downto 0;--调整输入-day: out std_logic_vector (7 downto 0;--日输出-month: out std_logic_vector (7 downto 0;--月输出-year: out std_logic_vector (7 downto 0--年输出-; end y_m_d_count; architecture arch of y_m_d_count is component daycounter port ( clk: in std_logic; set: in std_logic; day_in: instd_logic_vector(7 downto 0; day_out: out std_logic_vector(7 downto 0; qc: out std_logic; day28: in std_logic; day29: in std_logic;day30: in std_logic; day31: in std_logic ; end component; component monthcounter port ( clk: in std_logic; set: in std_logic; month_in: in std_logic_vector(7 downto 0; month_out: out std_logic_vector(7 downto 0; qc: out std_logic ; end component; component yearcounter port ( clk: in std_logic; set: in std_logic; year_in: instd_logic_vector(7 downto 0; year_out: out std_logic_vector(7 downto 0 ; end component; component dmux port ( set:in std_logic; setlap: in std_logic_vector (1 downto 0; d: instd_logic_vector(7 downto 0; set1:out std_logic; set2:out std_logic; set3:out std_logic; q1: out std_logic_vector(7 downto 0; q2: out std_logic_vector(7 downto 0; q3: outstd_logic_vector(7 downto 0 ; end component; component days_control port ( month: in std_logic_vector(7 downto 0; year2: in std_logic; year1: in std_logic_vector(1 downto 0; day28: out std_logic; day29: out std_logic; day30: out std_logic; day31: out std_logic ;end component; signal dayset,monthset,yearset: std_logic; signal qcday,qcmonth: std_logic; signal dayin,monthin,yearin: std_logic_vector(7 downto 0; signalsmonth,syear:std_logic_vector(7 downto 0; signal day28,day29,day30,day31:std_logic;begin u1:dmux port map(set,setlap,data_in,dayset,monthset,yearset,dayin,monthin,yearin; u2:daycounter port map(clk,dayset,dayin,day,qcday,day28,day29,day30,day31;u3:monthcounter port map(qcday,monthset,monthin,smonth,qcmonth; u4:yearcounter port map(qcmonth,yearset,yearin,syear; u8:days_control portmap(smonth,syear(4,syear(1 downto 0,day28,day29,day30,day31; month<=smonth; year<=syear; end arch; library ieee; use ieee.std_logic_1164.all; useieee.std_logic_unsigned.all; use ieee.std_logic_arith.all; entity yearcounter is port ( clk: in std_logic;--计数脉冲-set: in std_logic;--调整信号-year_in: in std_logic_vector(7 downto 0;--调整输入-year_out: out std_logic_vector(7 downto 0--年输出-; end yearcounter; architecture arch of yearcounter is signal temp1,temp2:std_logic_vector(3 downto 0; begin process(clk,set,year_in begin if set='1' then temp2<=year_in(7 downto 4; temp1<=year_in(3 downto 0; elsif rising_edge(clk then if temp1="1001" thentemp2<=temp2+'1'; temp1<="0000"; else temp1<=temp1+'1'; end if; if temp2="1001" and temp1="1001" then temp1<="0000";temp2<="0000"; end if; end if; end process; year_out<=temp2&temp1; end arch;。
vhdl设计实例
vhdl设计实例VHDL设计实例:数字电子钟引言:数字电子钟是一种常见的电子设备,用于显示当前时间。
本文将介绍如何使用VHDL设计一个简单的数字电子钟。
一、设计概述数字电子钟由时钟模块、数码管显示模块和控制模块组成。
时钟模块用于生成计时脉冲,数码管显示模块用于将时钟模块输出的计时脉冲转换为对应的数字显示,控制模块用于调整时钟和设置时间。
二、时钟模块设计时钟模块是整个电子钟的核心,它需要能够精确地生成计时脉冲。
使用VHDL语言,可以使用计数器和时钟分频器实现时钟模块。
计数器用于计数,时钟分频器用于将计数器的输出分频为1秒钟一次的脉冲。
三、数码管显示模块设计数码管显示模块用于将时钟模块输出的计时脉冲转换为数字显示。
在数码管显示模块中,每个数码管对应一个数字显示,通过切换不同的数码管,可以实现显示小时、分钟和秒钟。
使用VHDL语言,可以使用多路复用器和BCD转换器实现数码管显示模块。
四、控制模块设计控制模块用于调整时钟和设置时间。
通过增加按钮和减少按钮,可以实现调整时钟的功能。
通过设置按钮,可以进入设置时间的模式,并通过增加按钮和减少按钮设置小时、分钟和秒钟。
使用VHDL语言,可以使用状态机实现控制模块。
五、测试与验证在设计完成后,需要进行测试和验证。
可以使用仿真工具对设计的各个模块进行仿真,验证其功能是否正常。
同时,还可以将设计烧录到FPGA开发板上进行实际测试,确保数字电子钟能够正常工作。
六、总结本文以VHDL设计实例为题,详细介绍了数字电子钟的设计过程。
通过时钟模块、数码管显示模块和控制模块的设计,实现了一个简单的数字电子钟。
通过测试和验证,确保了设计的正确性和可靠性。
希望本文对读者理解VHDL设计实例并进行创作有所帮助。
通过自己的实践和研究,不断探索和创新,可以设计出更多实用的数字电子设备。
让我们一起努力,推动数字电子技术的发展!。
vhdl数字时钟课程设计
HEFEI UNIVERSITYEDA设计报告题目系别班级姓名指导老师完成时间目录一、设计要求 (3)1.功能介绍 (3)2.性能与功能设计 (3)二、方案设计 (3)三、程序框图 (3)四、程序原理图 (4)五、程序仿真与分析 (5)1.秒计数器 (5)2.分计数器 (5)3.小时计数器 (6)4.整点报时报警 (6)5.时钟系统波形图 (7)六、程序代码 (7)七、总结与体会 (11)一、设计要求1、功能介绍1)具有时、分、秒计数显示功能,以24小时循环计时。
2)具有调节小时、分钟及清零的功能。
3)具有整点报时功能。
2.性能及功能设计1)时钟计数:完成时、分、秒的正确计时并且显示所计的数字;对秒、分——60进制计数,即从0到59循环计数,时钟——24进制计数,即从0到23循环计数,并且在数码管上显示数值。
2)时间设置:手动调节分钟、小时,可以对所设计的时钟任意调时间,这样使数字钟真正具有使用功能。
我们可以通过实验板上的键7和键4进行任意的调整,同时可以通过改变频率来改变计数。
3)清零功能:reset为复位键,低电平时实现清零功能,高电平时正常计数。
可以根据我们自己任意时间的复位。
4)蜂鸣器在整点时有报时信号产生,蜂鸣器报警。
产生报警声音。
二、方案设计根据各部分分配的功能可知,本系统可以由秒计数器、分钟计数器、小时计数器、整点报时、分的调整以及小时的调整和一个顶层文件构成。
采用自顶向下的设计方法,子模块利用VHDL语言设计,顶层文件用原理图的设计方法。
显示:小时采用24进制,而分钟和秒均60进制。
三、程序框图四、程序原理图五、程序仿真与分析1、秒计数器1)秒计数器的仿真波形图2)波形分析利用60进制计数器完成00到59的循环计数功能,当秒计数至59时,再来一个时钟脉冲则产生进位输出,即enmin=1;reset作为复位信号低电平有效,即高电平时正常循环计数,低电平清零。
因为这种60进制的VHDL语言是很好写的,它并不复杂,再说我们必须要学会这些基本的硬件语言的描写。
基于VHDL的多功能电子钟
数字系统课程设计报告课程设计题目:基于vhdl语言的电子钟组员:陈洪彬,麦俊辉,缪超课程设计要求:设计一个用4位数码管显示的电子钟,包括整点报时,闹钟功能,4按键输入采用 VHDL 语言描述系统功能,并在 QUARTUS II 工具软件中进行仿真,下载到 EDA 实验板进行验证。
编写设计报告,要求包括方案选择、程序代码清单、调试过程、测试结果及心得体会。
一、软硬件资源分析实验室提供了Altera公司的cyclone系列EP1C6Q240C8实验开发板,该开发板提供了四个自由按键,八个发光LED,蜂鸣器,四个七段数码管,四位拨码开关等等硬件资源。
我们所设计的数字钟用到了四个自由按键用于对显示的选择,对设置时间的选择,还有用于用于设置时间时的加一操作,四个七段数码管用于显示,蜂鸣器用于整点报时和闹钟,还有四个发光LED用于判断自由按键的通断。
以下列表对数字钟中用到的硬件资源进行说明:下表)抖自由按键Key4in Key3 P_128 修改时间时加一,停止闹钟长按一下脉冲来时改变,消抖七段数码管dout,selout 7LED1_C1~C3 P_168P_169P_170P_173 显示正常时间及修改状态动态扫描法实现显示四个数码管全用总体设计框图:操作说明:按键状态Key4out Key3out Key2out Key1out 实现功能上升沿 1 0 0 修改小时(时钟)上升沿 1 1 0 修改分钟(时钟)上升沿 1 0 1 修改小时(闹钟)上升沿 1 1 1 修改分钟(闹钟)X(0或1)0 1 0 显示时分(时钟)x 0 0 0 显示分秒(时钟)x 0 0 1 显示时分(闹钟)x 0 1 1 显示分(闹钟)Key1的1表示闹钟,0表示时钟;Key2则是‘时-分’切换或者‘时分-分秒’切换。
各模块介绍(1)分频器在数字钟的设计中,采用了芯片内部提供的50MHz 全局时钟,将其分频率后产生一个接近 1Hz秒时钟 clk1,一个 2Hz 左右的闪烁时钟clk2,一个显示模块800Hz的clk3,一个用于消抖模块的20000Hz的clk4。
基于VHDL的多功能数字钟的设计
1 摘要本文介绍了利用VHDL硬件描述语言设计的多功能数字钟的思路和技巧。
本设计是一个多功能数字钟,具有计时、校时、清零等简单功能,在QuartusII 开发环境中编译和仿真了所设计的程序,并在可编程逻辑器件(ALTEA EPM7064SLI44-7)上下载验证。
关键字:QuartusII,数字钟, ALTEA EPM7064SLI44-7,VHDL2 引言随着电子设计自动化(EDA)的高速发展,电子系统的设计技术和工具发生了深刻的变化。
EDA的关键技术之一是要求用形式化方式来描述数字系统的硬件电路,即要用所谓硬件描述语言来描述硬件电路。
本文即介绍如何利用VHDL硬件描述语言设计一个具有时、分、秒计时显示、调整时间功能的数字钟,并且利用QuartusII开发环境进行编译、仿真,最终下载到可编程逻辑器件FPGA上进行验证。
3 实验要求设计制作一个多功能计时器,设计要求如下:1.计时功能:数字钟以24个小时为一个周期,必须显示时、分、秒。
2.清零功能:在板上设置一个手动清零开关,通过它可以对电路实现实时的手动清零。
3.校时功能:可随时对电路进行校时功能,并设置两个开关(a/b)控制。
按下a开关时(手不松开),数字时钟的秒钟数迅速增加(4HZ的时钟频率来驱动),并按60循环,计满60后再回00。
按下b开关时(手不松开),数字时钟的分钟数迅速增加(4HZ的时钟频率来驱动),并按60循环,计满60后再回00。
4 系统原理框图数字时钟实际上是一个对标准1Hz进行计时的计数电路,秒计数器满60后向分计数器进位,分计数器满60后向时计数器进位,时计数器按24翻1规律计数,计数输出经译码器送LED显示器,由于计数的起始时间不可能与标准时间一致,故需要在电路上加上一个校时电路。
5 各功能实现原理整个数字钟的设计包括七个模块,分别为分频、清零、计时、校时、BCD编码、扫描、译码,各模块的设计解决方案具体如下。
5.1 分频功能实现因为我们需要1HZ的频率来用来驱动秒计时器,而硬件提供的时钟频率是4HZ,所以我们要进行分频。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
library ieee;use ieee.std_logic_1164.all;entity clock isport(clk1hz:in std_logic;--1hz脉冲--clk100:in std_logic;--100hz脉冲--weekclk:in std_logic;--星期调整脉冲--start_stop:in std_logic;--秒表启动/停止控制--reset:in std_logic;--秒表复位--adclk:in std_logic;--校时脉冲--setselect:in std_logic;--调整位选择脉冲--mode:in std_logic;--功能选择脉冲--showdate:in std_logic;--日期显示--dis:out std_logic_vector(23 downto 0);--显示输出-- glisten:out std_logic_vector(5 downto 0);--闪烁指示-- weekout:out std_logic_vector(3 downto 0);--星期输出-- qh:out std_logic--整点报时--);end clock;architecture arch of clock iscomponent adjustport (adclk: in std_logic;data_in: out std_logic_vector(7 downto 0));end component;component controlport (setclk: in std_logic;setlap: out std_logic_vector (1 downto 0);mode: in std_logic;module: out std_logic_vector (2 downto 0));end component;component weekcounterport (clk: in std_logic;clk2: in std_logic;q: out std_logic_vector(3 downto 0));end component;component stopwatchport (clk: in std_logic;reset: in std_logic;start_stop: in std_logic;centsec: out std_logic_vector(7 downto 0);sec: out std_logic_vector(7 downto 0);min: out std_logic_vector(7 downto 0));end component;component h_m_s_countport (clk: in std_logic;set: in std_logic;setlap: in std_logic_vector (1 downto 0);d:in std_logic_vector(7 downto 0);sec:out std_logic_vector(7 downto 0);min:out std_logic_vector(7 downto 0);hour:out std_logic_vector(7 downto 0);qh:out std_logic;qc: out std_logic);end component;component y_m_d_countport (clk: in std_logic;set: in std_logic;setlap: in std_logic_vector(1 downto 0);data_in: in std_logic_vector(7 downto 0);day: out std_logic_vector (7 downto 0);month: out std_logic_vector (7 downto 0);year: out std_logic_vector (7 downto 0));end component;component displayport (module: in std_logic_vector (2 downto 0);showdate:in std_logic;clk:in std_logic;setlap:in std_logic_vector(1 downto 0);watch: in std_logic_vector (23 downto 0);time:in std_logic_vector(23 downto 0);date:in std_logic_vector(23 downto 0);dis: out std_logic_vector (23 downto 0);glisten:out std_logic_vector(5 downto 0) );end component;signal data_in,mcentsec,msec,mmin,ssec,smin,shour,sdate,smonth,syear:std_logic_vector(7 downto 0);signal setlap:std_logic_vector(1 downto 0);signal module:std_logic_vector(2 downto 0);signal qc:std_logic;signal watch,time,date:std_logic_vector(23 downto 0);beginu1:adjust port map(adclk,data_in);u2:control port map(setselect,setlap,mode,module);u3:stopwatch port map(clk100,reset,start_stop,mcentsec,msec,mmin);u4:h_m_s_count port map(clk1hz,module(1),setlap,data_in,ssec,smin,shour,qh,qc);u5:y_m_d_count port map(qc,module(2),setlap,data_in,sdate,smonth,syear);u6:display port map(module,showdate,clk1hz,setlap,watch,time,date,dis,glisten);u7:weekcounter port map(qc,weekclk,weekout);watch<=mmin&msec&mcentsec;time<=shour&smin&ssec;date<=syear&smonth&sdate;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity adjust isport (adclk: in std_logic;data_in: out std_logic_vector(7 downto 0));end adjust;architecture arch of adjust issignal temp2,temp1:std_logic_vector(3 downto 0);beginprocess(adclk)beginif rising_edge(adclk)thenif temp1="1001" thentemp2<=temp2+'1';temp1<="0000";elsetemp1<=temp1+'1';end if;if temp2="1001" and temp1="1001" thentemp1<="0000";temp2<="0000";end if;end if;data_in<=temp2&temp1;end process;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity control isport (setclk: in std_logic;--调整脉冲--setlap: out std_logic_vector (1 downto 0);--调整位选择脉冲-- mode: in std_logic;--功能选择脉冲--module: out std_logic_vector (2 downto 0)--功能输出--);end control;architecture arch of control issignal ssetlap:std_logic_vector(1 downto 0);signal s:std_logic_vector(3 downto 0);beginprocess(mode,setclk)beginif mode='1'thenssetlap<="00";elsif rising_edge(setclk) thenif ssetlap="10"thenssetlap<="00";elsessetlap<=ssetlap+'1';end if;end if;end process;setlap<=ssetlap;process(mode)beginif rising_edge(mode) thencase s iswhen"0001"=>s<="0010";when"0010"=>s<="0100";when"0100"=>s<="1000";when"1000"=>s<="0001";when others=>s<="0010";end case;end if;end process;module<=s(3 downto 1);end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity counter60 isport (clk: in std_logic;--计数脉冲--clr: in std_logic;--复位--q: out std_logic_vector(7 downto 0);--计数值-- qc:out std_logic--进位输出--);end counter60;architecture arch of counter60 issignal temp1,temp2:std_logic_vector(3 downto 0); beginprocess(clr,clk)beginif clr='1'thentemp1<="0000";temp2<="0000";elsif rising_edge(clk)thenif temp1="1001" thentemp2<=temp2+'1';temp1<="0000";elsetemp1<=temp1+'1';end if;if temp2="0101" and temp1="1001" thentemp1<="0000";temp2<="0000";qc<='1';elseqc<='0';end if;end if;q<=temp2&temp1;end process;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity counter99 isport (clk: in std_logic;--100vhz计数脉冲--en: in std_logic;--计数使能--clr: in std_logic;--复位--q: out std_logic_vector(7 downto 0);--计数值--qc: out std_logic--进位--);end counter99 ;architecture arch of counter99 issignal temp1,temp2:std_logic_vector(3 downto 0); beginprocess(clr,clk)beginif clr='1'thentemp1<="0000";temp2<="0000";elsif rising_edge(clk)thenif en='1' thenif temp1="1001" thentemp2<=temp2+'1';temp1<="0000";elsetemp1<=temp1+'1';end if;if temp2="1001" and temp1="1001" thentemp1<="0000";temp2<="0000";qc<='1';elseqc<='0';end if;end if;end if;q<=temp2&temp1;end process;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity daycounter isport (clk: in std_logic;--计数脉冲--set: in std_logic;--调整信号--day_in: in std_logic_vector(7 downto 0);--调整输入-- day_out: out std_logic_vector(7 downto 0);--天输出-- qc: out std_logic;--进位--day28: in std_logic;--该位为1表示该月为28天--day29: in std_logic;--该位为1表示该月为29天--day30: in std_logic; --该位为1表示该月为30天-- day31: in std_logic--该位为1表示该月为31天--);end daycounter;architecture arch of daycounter issignal temp1,temp2:std_logic_vector(3 downto 0); signal days:std_logic_vector(7 downto 0);begindays<="00101000" when day28='1'else"00101001"when day29='1'else"00110000"when day30='1'else "00110001"when day31='1'else"00000000";process(clk,set,day_in,days)beginif set='1' thentemp2<=day_in(7 downto 4);temp1<=day_in(3 downto 0);elsif rising_edge(clk)thenif temp1="1001" thentemp2<=temp2+'1';temp1<="0000";elsetemp1<=temp1+'1';end if;if temp2&temp1=days thentemp2<="0000";temp1<="0001";qc<='1';elseqc<='0';end if;end if;end process;day_out<=temp2&temp1;end arch;library ieee;use ieee.std_logic_1164.all;entity days_control isport (month: in std_logic_vector(7 downto 0);--月份--year2: in std_logic;--年份高位数字bcd码最低位--year1: in std_logic_vector(1 downto 0);--年份低位数字bcd码末两位--day28: out std_logic; --该位为1表示该月为28天--day29: out std_logic; --该位为1表示该月为29天--day30: out std_logic; --该位为1表示该月为30天--day31: out std_logic--该位为1表示该月为31天--);end days_control;architecture arch of days_control isbeginprocess(month,year2,year1)begincase month iswhen "00000001"=>day28<='0';day29<='0';day30<='0';day31<='1';when "00000010"=>if (year2='0'and year1="00")or (year2='1'and year1="10") then day28<='0';day29<='1';day30<='0';day31<='0';elseday28<='1';day29<='0';day30<='0';day31<='0';end if;when "00000011"=>day28<='0';day29<='0';day30<='0';day31<='1';when "00000100"=>day28<='0';day29<='0';day30<='1';day31<='0';when "00000101"=>day28<='0';day29<='0';day30<='0';day31<='1';when "00000110"=>day28<='0';day29<='0';day30<='1';day31<='0';when "00000111"=>day28<='0';day29<='0';day30<='0';day31<='1';when "00001000"=>day28<='0';day29<='0';day30<='0';day31<='1';when "00001001"=>day28<='0';day29<='0';day30<='1';day31<='0';when "00010000"=>day28<='0';day29<='0';day30<='0';day31<='1';when "00010001"=>day28<='0';day29<='0';day30<='1';day31<='0';when "00010010"=>day28<='0';day29<='0';day30<='0';day31<='1';when others=>day28<='0';day29<='0';day30<='0';day31<='1';end case;end process;end arch;library ieee;use ieee.std_logic_1164.all;entity display isport (module: in std_logic_vector (2 downto 0);--功能选择--showdate:in std_logic;--显示日期--clk:in std_logic;--闪烁脉冲--setlap:in std_logic_vector(1 downto 0);--闪烁位选择-- watch: in std_logic_vector (23 downto 0);--秒表计数值输入-- time:in std_logic_vector(23 downto 0);--时分秒计数值输入-- date:in std_logic_vector(23 downto 0);--年月日计数值输入-- dis: out std_logic_vector (23 downto 0);--显示输出--glisten:out std_logic_vector(5 downto 0)--闪烁输出--);end display;architecture arch of display isbeginprocess(module,showdate,watch,time,date)beginif showdate='1'thendis<=date;elsecase module iswhen"001"=>dis<=watch;when"010"=>dis<=time;when"100"=>dis<=date;when others=>dis<=time;end case;end if;end process;process(clk,module,setlap)beginif module="010"or module="100"thencase setlap iswhen"00"=>glisten(1 downto 0)<=clk&clk;glisten(5 downto 2)<="0000";when"01"=>glisten(3 downto 2)<=clk&clk;glisten(5 downto 4)<="00";glisten(1 downto 0)<="00";when"10"=>glisten(5 downto 4)<=clk&clk;glisten(3 downto 0)<="0000";when others=>glisten<="000000";end case;else glisten<="000000";end if;end process;end arch;library ieee;use ieee.std_logic_1164.all;entity dmux isport (set:in std_logic;--调整信号--setlap: in std_logic_vector (1 downto 0);--调整位选择-- d: in std_logic_vector(7 downto 0);--调整输入--set1:out std_logic;set2:out std_logic;set3:out std_logic;q1: out std_logic_vector(7 downto 0);q2: out std_logic_vector(7 downto 0);q3: out std_logic_vector(7 downto 0));end dmux;architecture arch of dmux isbeginprocess(set,setlap,d)beginif set='1' thencase setlap iswhen"00"=>set1<='1';set2<='0';set3<='0';q1<=d;when"01"=>set1<='0';set2<='1';set3<='0';q2<=d;when"10"=>set1<='0';set2<='0';set3<='1';q3<=d;when others=>set1<='0';set2<='0';set3<='0';end case;elseset1<='0';set2<='0';set3<='0';end if;end process;end arch;library ieee;use ieee.std_logic_1164.all;entity h_m_s_count isport (clk: in std_logic;--1hz脉冲--set: in std_logic;--调整信号--setlap: in std_logic_vector (1 downto 0);--调整位选择-- d:in std_logic_vector(7 downto 0);--调整输入--sec:out std_logic_vector(7 downto 0);--秒输出--min:out std_logic_vector(7 downto 0);--分输出--hour:out std_logic_vector(7 downto 0);--小时输出-- qh:out std_logic;--整点报时--qc: out std_logic--进位--);end h_m_s_count;architecture arch of h_m_s_count iscomponent sec_mincounterport (clk: in std_logic;set:in std_logic;d:in std_logic_vector(7 downto 0);q:out std_logic_vector(7 downto 0);qc:out std_logic);end component;component hourcounterport (clk: in std_logic;set:in std_logic;d:in std_logic_vector(7 downto 0);q: out std_logic_vector(7 downto 0);qc:out std_logic);end component;component dmuxport (set:in std_logic;setlap: in std_logic_vector (1 downto 0);d: in std_logic_vector(7 downto 0);set1:out std_logic;set2:out std_logic;set3:out std_logic;q1: out std_logic_vector(7 downto 0);q2: out std_logic_vector(7 downto 0);q3: out std_logic_vector(7 downto 0));end component;signal secset,minset,hourset: std_logic;signal secin,minin,hourin:std_logic_vector(7 downto 0);signal qcsec,qcmin,qchour: std_logic;beginu1:dmux port map(set,setlap,d,secset,minset,hourset,secin,minin,hourin); u2:sec_mincounter port map(clk,secset,secin,sec,qcsec);u3:sec_mincounter port map(qcsec,minset,minin,min,qcmin);u4:hourcounter port map(qcmin,hourset,hourin,hour,qchour);qh<=qcmin;qc<=qchour;end arch;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity hourcounter isport (clk: in std_logic;--计数脉冲--set:in std_logic;--调整信号--d:in std_logic_vector(7 downto 0);--调整时间--q: out std_logic_vector(7 downto 0);--小时输出-- qc:out std_logic--进位--);end hourcounter;architecture arch of hourcounter issignal temp1,temp2:std_logic_vector(3 downto 0); beginprocess(clk,set)beginif set='1'thentemp2<=d(7 downto 4);temp1<=d(3 downto 0);elsif rising_edge(clk) thenif temp1="1001" thentemp2<=temp2+'1';temp1<="0000";elsetemp1<=temp1+'1';end if;if temp2="0010" and temp1="0100" thentemp1<="0000";temp2<="0000";qc<='1';elseqc<='0';end if;end if;end process;q<=temp2&temp1;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity monthcounter isclk: in std_logic;--计数脉冲--set: in std_logic;--调整信号--month_in: in std_logic_vector(7 downto 0);--调整输入-- month_out: out std_logic_vector(7 downto 0);--月输出-- qc: out std_logic--进位--);end monthcounter;architecture arch of monthcounter issignal temp1,temp2:std_logic_vector(3 downto 0);beginprocess(clk,set,month_in)beginif set='1' thentemp2<=month_in(7 downto 4);temp1<=month_in(3 downto 0);elsif rising_edge(clk) thenif temp1="1001" thentemp2<=temp2+'1';temp1<="0000";elsetemp1<=temp1+'1';end if;if temp2="0001"and temp1="0010" thentemp2<="0000";temp1<="0001";qc<='1';elseqc<='0';end if;end if;end process;month_out<=temp2&temp1;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity sec_mincounter isport (clk: in std_logic;--计数脉冲--set:in std_logic;--调整信号--d:in std_logic_vector(7 downto 0);--调整时间输入--q:out std_logic_vector(7 downto 0);--分和秒输出--qc:out std_logic--进位--);end sec_mincounter;architecture arch of sec_mincounter issignal temp1,temp2:std_logic_vector(3 downto 0);beginprocess(clk,set)beginif set='1'thentemp2<=d(7 downto 4);temp1<=d(3 downto 0);elsif rising_edge(clk) thenif temp1="1001" thentemp2<=temp2+'1';temp1<="0000";elsetemp1<=temp1+'1';end if;if temp2="0101" and temp1="1001" thentemp1<="0000";temp2<="0000";qc<='1';elseqc<='0';end if;end if;end process ;q<=temp2&temp1;end arch;library ieee;use ieee.std_logic_1164.all;entity stopwatch isport (clk: in std_logic;--100hz脉冲--reset: in std_logic;--复位--start_stop: in std_logic;--启动/停止--centsec: out std_logic_vector(7 downto 0);--百分秒输出,当超过60分转为秒-- sec: out std_logic_vector(7 downto 0);--秒输出,当超过60分转为分--min: out std_logic_vector(7 downto 0)--分输出,当超过60分转为小时--);end stopwatch;architecture arch of stopwatch iscomponent counter99port (clk: in std_logic;en: in std_logic;clr: in std_logic;q: out std_logic_vector(7 downto 0);qc: out std_logic);end component;component counter60port (clk: in std_logic;clr: in std_logic;q: out std_logic_vector(7 downto 0);qc: out std_logic);end component;signal qc1,qc2,qc3,qc4,flag:std_logic;signal tcentsec,tsec,tmin,thour:std_logic_vector(7 downto 0); beginu1:counter99 port map(clk,start_stop,reset,tcentsec,qc1);u2:counter60 port map(qc1,reset,tsec,qc2);u3:counter60 port map(qc2,reset,tmin,qc3);u4:counter60 port map(qc3,reset,thour,qc4);process(qc3)beginif rising_edge(qc3)thenflag<='1';end if;if flag='1' thencentsec<=tsec;sec<=tmin;min<=thour;elsecentsec<=tcentsec;sec<=tsec;min<=tmin;end if;end process;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity weekcounter isport (clk: in std_logic;--天脉冲--clk2: in std_logic;--外部星期调整脉冲--q: out std_logic_vector(3 downto 0)--星期输出--);end weekcounter;architecture arch of weekcounter issignal temp:std_logic_vector(3 downto 0);signal cp:std_logic;begincp<=clk or clk2;processbeginwait until rising_edge(cp);if temp="0111" thentemp<="0001";elsetemp<=temp+'1';end if;q<=temp;end process;end arch;library ieee;use ieee.std_logic_1164.all;entity y_m_d_count isport (clk: in std_logic;--计数脉冲--set: in std_logic;--调整信号--setlap: in std_logic_vector(1 downto 0);--调整位选择-- data_in: in std_logic_vector(7 downto 0);--调整输入-- day: out std_logic_vector (7 downto 0);--日输出--month: out std_logic_vector (7 downto 0);--月输出--year: out std_logic_vector (7 downto 0)--年输出--);end y_m_d_count;architecture arch of y_m_d_count iscomponent daycounterport (clk: in std_logic;set: in std_logic;day_in: in std_logic_vector(7 downto 0);day_out: out std_logic_vector(7 downto 0);qc: out std_logic;day28: in std_logic;day29: in std_logic;day30: in std_logic;day31: in std_logic);end component;component monthcounterport (clk: in std_logic;set: in std_logic;month_in: in std_logic_vector(7 downto 0);month_out: out std_logic_vector(7 downto 0);qc: out std_logic);end component;component yearcounterport (clk: in std_logic;set: in std_logic;year_in: in std_logic_vector(7 downto 0);year_out: out std_logic_vector(7 downto 0));end component;component dmuxport (set:in std_logic;setlap: in std_logic_vector (1 downto 0);d: in std_logic_vector(7 downto 0);set1:out std_logic;set2:out std_logic;set3:out std_logic;q1: out std_logic_vector(7 downto 0);q2: out std_logic_vector(7 downto 0);q3: out std_logic_vector(7 downto 0));end component;component days_controlport (month: in std_logic_vector(7 downto 0);year2: in std_logic;year1: in std_logic_vector(1 downto 0);day28: out std_logic;day29: out std_logic;day30: out std_logic;day31: out std_logic);end component;signal dayset,monthset,yearset: std_logic;signal qcday,qcmonth: std_logic;signal dayin,monthin,yearin: std_logic_vector(7 downto 0);signal smonth,syear:std_logic_vector(7 downto 0);signal day28,day29,day30,day31:std_logic;beginu1:dmux port map(set,setlap,data_in,dayset,monthset,yearset,dayin,monthin,yearin);u2:daycounter port map(clk,dayset,dayin,day,qcday,day28,day29,day30,day31);u3:monthcounter port map(qcday,monthset,monthin,smonth,qcmonth);u4:yearcounter port map(qcmonth,yearset,yearin,syear);u8:days_control port map(smonth,syear(4),syear(1 downto 0),day28,day29,day30,day31); month<=smonth;year<=syear;end arch;library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity yearcounter isport (clk: in std_logic;--计数脉冲--set: in std_logic;--调整信号--year_in: in std_logic_vector(7 downto 0);--调整输入--year_out: out std_logic_vector(7 downto 0)--年输出--);end yearcounter;architecture arch of yearcounter issignal temp1,temp2:std_logic_vector(3 downto 0);beginprocess(clk,set,year_in)beginif set='1' thentemp2<=year_in(7 downto 4);temp1<=year_in(3 downto 0);elsif rising_edge(clk) thenif temp1="1001" thentemp2<=temp2+'1';temp1<="0000";elsetemp1<=temp1+'1';end if;if temp2="1001" and temp1="1001" thentemp1<="0000";temp2<="0000";end if;end if;end process;year_out<=temp2&temp1; end arch;。