vhdl课程设计(电子钟+闹铃)
基于vhdl的电子闹钟设计
基于VHDL的数字闹钟设计摘要:随着EDA技术的发展和应用领域的扩大与深入,EDA技术在电子信息、通信、自动控制及计算机应用领域的重要性日益突出。
EDA技术就是依赖功能强大的计算机,在EDA工具软件平台上,对以硬件描述语言VHDL为系统逻辑描述手段完成的设计文件,自动地完成逻辑优化和仿真测试,直至实现既定的电子线路系统功能。
本文介绍了基于VHDL硬件描述语言设计的多功能数字闹钟的思路和技巧。
在Quart us11开发环境中编译和仿真了所设计的程序,并逐一调试验证程序的运行状况。
仿真和验证的结果表明,该设计方法切实可行,该数字闹钟可以实现调时定时闹钟播放音乐功能具有一定的实际应用性。
关键字:闹钟FPGA VHDLQuartus II一、电子钟相关功能描述如下:(1) 计时功能:这是本计时器设计的基本功能,可进行时、分、秒计时,并显示。
(2)闹钟功能:如果当前时间与设置的闹钟时间相同,则扬声器发出一段音乐,并维持一分钟。
(3) 调时调分调闹钟功能:当需要校时或者要重新设置闹钟的时间时,可通过实验箱上的按键控制。
二、设计原理:数字闹钟电路的基本结构由两个60进制计数器和一个24进制计数器组成,分别对秒、分、小时进行计时,当计时到23时59分59秒时,再来一个计数脉冲,则计数器清零,重新开始计时。
秒计数器的计数时钟CLK为1Hz的标准信号。
当数字闹钟处于计时状态时,秒计数器的进位输出信号作为分钟计数器的计数信号,分钟计数器的进位输出信号又作为小时计数器的计数信号时、分、秒的计时结果通过6个数码管来动态显示。
数字闹钟除了能够正常计时外,还应能够对时间进行调整。
因此,通过模式选择信号KEY1、KEY2控制数字钟的工作状态,即控制数字钟,使其分别工作于正常计时,调整分、时和设定闹钟分、时5个状态。
当数字闹钟处于计时状态时,3个计数器允许计数,且秒、分、时计数器的计数时钟信号分别为CLK,秒的进位,分的进位;当数字闹钟处于调整时间状态时,被调的分或时会一秒一秒地增加;当数字钟处于闹钟定时状态时,可以设定小时和分;当计时到所设定的时刻时,spea k将会被赋予梁祝音乐信号用于驱动扬声器,持续1分钟。
基于vhdl数字闹钟设计说明书
毕业设计(论文)论文题目:基于VHDL的数字闹钟设计所属系部:指导老师:职称:学生姓名:班级、学号:专业:毕业设计(论文)任务书题目:基于VHDL的数字闹钟设计任务与要求:设计一个带闹钟功能的24小时计时器。
完成功能:1.计时功能:每隔1分钟计时1次,并在显示屏上显示当前时间。
2.闹钟功能:如果当前时间与设置的闹钟时间相同,扬声器发出蜂鸣声。
时间:年月日至年月日共周所属系部:学生姓名:学号:专业:指导单位或教研室:指导教师:职称:毕业设计(论文)进度计划表本表作评定学生平时成绩的依据之一。
基于VHDL的数字闹钟设计【摘要】随着EDA技术的发展和应用领域的扩大与深入,EDA技术在电子信息、通信、自动控制及计算机应用领域的重要性日益突出。
EDA技术就是依赖功能强大的计算机,在EDA工具软件平台上,对以硬件描述语言VHDL为系统逻辑描述手段完成的设计文件,自动地完成逻辑优化和仿真测试,直至实现既定的电子线路系统功能。
本文介绍了基于VHDL硬件描述语言设计的多功能数字闹钟的思路和技巧。
在Quartus 11开发环境中编译和仿真了所设计的程序,并逐一调试验证程序的运行状况。
仿真和验证的结果表明,该设计方法切实可行,该数字闹钟可以实现调时定时闹钟功能具有一定的实际应用性。
关键词:数字闹钟 FPGA VHDL Quartus IIAbstract: With the EDA technology development and expansion of application fields and in-depth, EDA technology in the electronic information, communication, automatic control and computer applications of growing importance. EDA technology is dependent on a powerful computer, the software platform in the EDA tools for the hardware description language VHDL description for the system logic means completed design documents, automatically complete the test logic optimization and simulation, electronic circuit set up to achieve the system functionality. This article describes the VHDL hardware description language based on multi-function digital alarm clock design ideas and techniques. In the Quartus 11 compiler and development environment designed to simulate the process, and one by one to debug verification process operating conditions. Simulation and verification results show that the design method is feasible, digital alarm clock can adjust the time when the alarm clock to play music with some practical application.Key words: Alarm Clock FPGA VHDL Quartus II目录1 选题背景 (6)1.1选题研究内容 (6)1.2课题研究功能课题研究功能 (6)1.3课题相关技术应用 (6)2 FPGA 简介 (8)2.1FPGA概述 (8)2.2FPGA编程原理 (8)2.3FPGA设计流程 (9)3 总体设计思想 (10)3.1基本原理 (10)3.2设计框图 (10)4 设计步骤和调试过程 (11)4.1总体设计电路 (11)4.2模块设计和相应模块程序 (12)4.3仿真及仿真结果分析 (14)4.4实验调试结果 (15)结束语 (16)文献 (17)1 选题背景1.1 选题研究内容设计一个 24 小时的闹钟,该闹钟由显示屏、数字键、TIME 键、ALARM 键、扬声器组成。
基于VHDL的数字电子时钟的设计
目录基于VHDL的数字电子时钟的设计.............................................................. 错误!未定义书签。
目录 .. (1)摘要 (2)引言 (2)一、设计分析 (3)1.1 设计要求 (3)1.2 性能指标及功能设计性能指标 (3)二、设计方案 (3)三、设计环境 (4)3.1 硬件设计环境 (4)3.1.1 可编程器件EP2C5Q208C8N 及开发板系统 (5)3.1.2 64位的计算机一台 (5)3.2 软件设计环境 (5)3.2.1 QuartusⅡ软件开发平台(8.0版本) (5)3.2.2 Windows7操作系统 (5)3.2.3 硬件描述语言VHDL (5)四、整体设计流图 (7)4.1 各模块的原理性功能介绍 (7)4.1.1 可编程器件EP2C5Q208C8N (7)4.1.2 CPLD-JTAG接口 (7)4.1.3 晶振和蜂鸣器 (7)4.1.4 LED数码管显示 (8)4.1.5 独立按键 (9)4.1.6 拨码开关 (9)4.1.7 QuartusⅡ软件开发平台(8.0版本) (9)4.2 设计的整体框架 (10)4.2.1在各个模块都编译通过的基础上在顶层用原理图的方法实现。
(10)4.2.2 设计原理及流程图 (11)4.2.3逻辑流程图 (12)4.2.4状态转移图 (13)五、系统的模块化设计 (13)5.1 软件程序模块化设计 (13)5.1.1 秒/分/时输入模块的软件设计 (13)5.1.2 秒/分/时计数模块的软件设计 (14)5.1.3 模式选择模块的软件设计 (14)5.1.4 数码管 (15)5.1.5 闹钟模块的软件设计 (16)5.1.5 系统时钟的软件设计 (18)5.2 硬件的测试 (20)5.2.1模拟时钟电路图与实物图 (20)设计心得 (23)致谢 (24)参考文献 (24)摘要随着人类的不断进步,现代电子设计技术已进入一个全新的阶段,传统的电子设计方法、工具和器件在更大的程度上被EDA所取代。
电子时钟课程设计--基于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课程设计(电子钟+闹铃)
数字钟的设计一.体系功效概述(一).体系实现的功效:1.具有“时”.“分”.“秒”的十进制数字显示(小时从00~ 23).2.具有手动校时.校分.校秒的功效.3.有准时和闹钟功效,可以或许在设定的时光发出闹铃声.4.能进行整点报时.从59分50秒起,每隔2秒发一次低音“嘟”的旌旗灯号,持续5次,最后一次为高音“嘀”的旌旗灯号.(二).各项设计指标:1.显示部分采取的6个LED显示器,从高位至低位分离显示时.分.秒.2.有一个设置调闹钟准不时光.正常时光的按钮,选择调的对象.3.有三个按钮分离调时.分.秒的时光.4.有一个按钮用作开启/封闭闹铃.5.别的须要两个时钟旌旗灯号来给体系供给脉冲旌旗灯号,使时钟和闹钟正常工作,分离为1Hz.1kHz的脉冲.二.体系构成以及体系各部分的设计1.体系构造描写//请求:体系(或顶层文件)构造描写,各个模块(或子程序)的功效描写;(一)体系的顶层文件:1、顶层文件图:(见下页)2、各模块的解释:(1).7个输入量clk_1khz.clk_1hz.key_slt.key_alarm.sec_set.min_set.hou r_set:个中clk_1khz为闹铃模块供给时钟,处理后能产生“嘟”.“嘀”和变更的闹铃声音;clk_1hz为计时模块供给时钟旌旗灯号,每秒计数一次;key_slt选择设置对象:准时或正常时光;key_alarm可以或许开启和封闭闹铃;sec_set.min_set.hour_set用于设置时光或准时,与key_slt相联系关系.各按键输出为脉冲旌旗灯号.(2).CNT60_A_SEC模块:这个模块式将clk_1hz这个时钟旌旗灯号进行60进制计数,并产生一个分钟的触发旌旗灯号.该模块能将当前计数值及时按BCD码的格局输出.将该输出接到两位LED数码后能不时显示秒的状况.经由过程alarm_clk可以选择设置对象为时光照样准时价.在设置时光模式上,key上的一个输入脉冲可以将clk的输入旌旗灯号加一.在设置准时模式上,key上的脉冲只修正准时价,不影响时光脉冲clk的状况.同时该模块具有两个输出口out_do.out_di来触发整点报时的“嘟”.“嘀”声音.(3).CNT60_A_MIN模块:这个模块式将CNT60_A_SEC的输出旌旗灯号进行60进制计数,并产生一个时位的触发旌旗灯号.该模块能将当前计数值及时按BCD码的格局输出.将该输出接到两位LED数码后能不时显示分的状况.经由过程alarm_clk可以选择设置对象为时光照样准时价.在设置时光模式上,key上的一个输入脉冲可以将clk的输入旌旗灯号加一.在设置准时模式上,key上的脉冲只修正准时价,不影响时光脉冲clk的状况.同时该模块具有三个输出口out_do.out_di.out_alarm来触发整点报时的“嘟”.“嘀”.闹铃声音.(4).CNT24_A_HOUR模块:这个模块式将CNT60_A_MIN的输出旌旗灯号做24进制计数.该模块能将当前计数值及时按BCD码的格局输出.将该输出接到两位LED数码后能不时显示时的状况.经由过程alarm_clk 可以选择设置对象为时光照样准时价.在设置时光模式上,key 上的一个输入脉冲可以将clk的输入旌旗灯号加一.在设置准时模式上,key上的脉冲只修正准时价,不影响时光脉冲clk的状况.同时该模块具有一个输出口out_alarm来触发整点报时的闹铃声音.(5).PWM_OUT模块:该模块为PWM产生模块,经由过程EN可开启和封闭PWM输出.模块依据CLK旌旗灯号二分频产生的高下音,并组合,能输出三种声音状况——“嘟”.“嘀”.闹铃.而该三种声音要被秒.分.时的输出触发才干输出PWM.(二)体系各个模块的VHDL程序:(1).CNT60_A_SEC模块:程序源代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt60_a_sec isport(clk,clr,enb: in std_logic;--clk:时钟输入旌旗灯号,clr:清零端,enb:使能端key: in std_logic;--输入按键脉冲,调剂闹铃准时或时光alarm_clk: in std_logic;--1:alarm 0:clk--设置模式选择:闹铃调节模式.时光调节模式qout_sl: out std_logic_vector(3 downto 0); --显示输出秒的低位qout_sh: out std_logic_vector(3 downto 0);--显示输出秒的高位co: out std_logic; --进位输出,触发分计数模块out_do: out std_logic;--在整点报时中输出“嘟”触发旌旗灯号out_di: out std_logic --在整点报时中输出“嘀”触发旌旗灯号);end;architecture a of cnt60_a_sec issignal qout2_l:std_logic_vector(3 downto 0);signal qout2_h:std_logic_vector(3 downto 0);signal alarm_l:std_logic_vector(3 downto 0);signal alarm_h:std_logic_vector(3 downto 0);signal clk1,clk2,tclk,aclk,ac_slt: std_logic;beginprocess(alarm_clk) --当该端口输入一个脉冲时,修正设置模式:时光调剂或闹铃模式切换beginif alarm_clk'event and alarm_clk='1' thenif ac_slt='0' then--假如为准时模式,将改为闹铃模式ac_slt<='1';elseac_slt<='0';end if;end if;end process;process(key,clk,ac_slt)--依据设置模式,处理key上的脉冲旌旗灯号beginif ac_slt='0' then --时光调剂模式aclk<='0';if clk='1' and key='1' then --clk=1则tclk<=0,经由过程挖洞方法添加一个脉冲tclk<='0';elsif clk='0' and key='1' then --clk=0,则tclk<=1,产生一个高电平,添加一脉冲tclk<='1';elsetclk<=clk;end if;elsif ac_slt='1' then --闹铃调剂模式tclk<=clk;aclk<=key; --key上的脉冲直接修正闹铃准时价end if;end process;process(tclk,clr,enb) --60进制计数,个位.十位放在两个暂时变量中,暗示秒的状况beginif clr='1' then--clearing works at the state of high voltageqout2_l<="0000";qout2_h<="0000";elsif tclk'event and tclk='1' thenif enb='1' then--enable works at high voltageif qout2_l="1001" and qout2_h="0101" thenqout2_l<="0000";--a full mode is completed and a carryout is generatedqout2_h<="0000";elsif qout2_l="1001" thenqout2_l<="0000";qout2_h<=qout2_h+1;elseqout2_l<=qout2_l+1;-- in process of countingend if;end if;end if;end process;process(aclk,clr,enb)--修正闹铃的准时价if clr='1' then--clearing works at the state of high voltagealarm_l<="0000";alarm_h<="0000";elsif aclk'event and aclk='1' thenif enb='1' then--enable works at high voltageif alarm_l="1001" and alarm_h="0101" thenalarm_l<="0000";--a full mode is completed and a carryout is generatedalarm_h<="0000";elsif alarm_l="0101" thenalarm_l<="0000";alarm_h<=alarm_h+1;elsealarm_l<=alarm_l+1;-- in process of countingend if;end if;end if;end process;process(qout2_l,qout2_h,alarm_l,alarm_h,alarm_clk)-- 产生进位,显示时光或闹铃准时价if qout2_l="0000" and qout2_h="0000" thenco<='1';elseco<='0';end if;if ac_slt='0' then -- 显示时光qout_sl<=qout2_l;qout_sh<=qout2_h;else -- 显示准时价qout_sh<=alarm_h;qout_sl<=alarm_l;end if;end process;process(qout2_l,qout2_h) -- 依据秒的状况输出“嘟”.“嘀”触发旌旗灯号beginif qout2_h="0101" thenif qout2_l="0000" thenout_do<='1';elsif qout2_l="0010" thenout_do<='1';elsif qout2_l="0100" then out_do<='1';elsif qout2_l="0110" then out_do<='1';elsif qout2_l="1000" then out_do<='1';elseout_do<='0';end if;elsif qout2_h="0000" then if qout2_l="0000" then out_di<='1';out_do<='0';elseout_di<='0';end if;elseout_do<='0';out_di<='0';end if;end process;end;(2).CNT60_A_MIN模块:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt60_a_min isport(clk,clr,enb: in std_logic;--clk:时钟输入旌旗灯号,clr:清零端,enb:使能端key: in std_logic;--输入按键脉冲,调剂闹铃准时或时光alarm_clk: in std_logic;--1:alarm 0:clk--设置模式选择:闹铃调节模式.时光调节模式qout_ml: out std_logic_vector(3 downto 0);--显示输出分的低位qout_mh: out std_logic_vector(3 downto 0);--显示输出分的高位co: out std_logic; --进位输出,触发时计数模块out_alarm:out std_logic;--闹铃触发旌旗灯号,时光到后输出高电平触发闹铃out_do,out_di: out std_logic--在整点报时中输出“嘟”“嘀”触发旌旗灯号);end;architecture a of cnt60_a_min issignal qout2_l:std_logic_vector(3 downto 0);signal qout2_h:std_logic_vector(3 downto 0);signal alarm_l:std_logic_vector(3 downto 0);signal alarm_h:std_logic_vector(3 downto 0);signal clk1,clk2,tclk,aclk,ac_slt: std_logic;beginprocess(alarm_clk)--当该端口输入一个脉冲时,修正设置模式:时光调剂或闹铃模式切换beginif alarm_clk'event and alarm_clk='1' thenif ac_slt='0' then--假如为准时模式,将改为闹铃模式ac_slt<='1';elseac_slt<='0';end if;end if;end process;process(key,clk,ac_slt)--依据设置模式,处理key上的脉冲旌旗灯号beginif ac_slt='0' then --时光调剂模式aclk<='0';if clk='1' and key='1' then--clk=1则tclk<=0,经由过程挖洞方法添加一个脉冲tclk<='0';elsif clk='0' and key='1' then--clk=0,则tclk<=1,产生一个高电平,添加一脉冲tclk<='1';elsetclk<=clk;end if;elsif ac_slt='1' then --闹铃调剂模式tclk<=clk;aclk<=key;--key上的脉冲直接修正闹铃准时价end if;end process;process(tclk,clr,enb) --60进制计数,个位.十位放在两个暂时变量中,暗示分的状况beginif clr='1' then--clearing works at the state of high voltageqout2_l<="0000";qout2_h<="0000";elsif tclk'event and tclk='1' thenif enb='1' then--enable works at high voltageif qout2_l="1001" and qout2_h="0101" thenqout2_l<="0000";--a full mode is completed and a carryout is generatedqout2_h<="0000";elsif qout2_l="1001" thenqout2_l<="0000";qout2_h<=qout2_h+1;elseqout2_l<=qout2_l+1;-- in process of countingend if;end if;end if;end process;process(aclk,clr,enb)--修正闹铃的准时价beginif clr='1' then--clearing works at the state of high voltagealarm_l<="0000";alarm_h<="0000";elsif aclk'event and aclk='1' thenif enb='1' then--enable works at high voltageif alarm_l="1001" and alarm_h="0101" thenalarm_l<="0000";--a full mode is completed and a carryout is generatedalarm_h<="0000";elsif alarm_l="0101" thenalarm_l<="0000";alarm_h<=alarm_h+1;elsealarm_l<=alarm_l+1;-- in process of countingend if;end if;end if;end process;process(qout2_l,qout2_h,alarm_l,alarm_h,alarm_clk)-- 产生进位,显示时光或闹铃准时价of high voltagebeginif qout2_l="0000" and qout2_h="0000" thenco<='1';elseco<='0';end if;if ac_slt='0' thenqout_ml<=qout2_l;qout_mh<=qout2_h;elseqout_mh<=alarm_h;qout_ml<=alarm_l;end if;end process;process(qout2_l,qout2_h,alarm_l,alarm_h)–断定准时价与时光值相等,输出闹铃触发旌旗灯号beginif qout2_l=alarm_l and qout2_h=alarm_h thenout_alarm<='1';elseout_alarm<='0';end if;end process;process(qout2_l,qout2_h)-- 依据分的状况输出“嘟”.“嘀”触发旌旗灯号beginif qout2_l="1001" and qout2_h="0101" thenout_do<='1';elseout_do<='0';end if;if qout2_l="0000" and qout2_h="0000" thenout_di<='1';elseout_di<='0';end if;end process;end;(3).CNT24_A_HOUR模块:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt24_a_hour isport(clk,clr,enb: in std_logic;--clk:时钟输入旌旗灯号,clr:清零端,enb:使能端key: in std_logic;--输入按键脉冲,调剂闹铃准时或时光alarm_clk: in std_logic;--1:alarm 0:clk--设置模式选择:闹铃调节模式.时光调节模式qout_hl: out std_logic_vector(3 downto 0);--显示输出时的低位qout_hh: out std_logic_vector(3 downto 0);--显示输出时的高位co: out std_logic;--进位输出out_alarm:out std_logi--闹铃触发旌旗灯号输出);end;architecture a of cnt24_a_hour issignal qout2_l:std_logic_vector(3 downto 0);signal qout2_h:std_logic_vector(3 downto 0);signal alarm_l:std_logic_vector(3 downto 0);signal alarm_h:std_logic_vector(3 downto 0);signal clk1,clk2,tclk,aclk,ac_slt: std_logic;beginprocess(alarm_clk)--当该端口输入一个脉冲时,修正设置模式:时光调剂或闹铃模式切换beginif alarm_clk'event and alarm_clk='1' thenif ac_slt='0' then--假如为准时模式,将改为闹铃模式ac_slt<='1';elseac_slt<='0';end if;end if;end process;process(key,clk,ac_slt)--依据设置模式,处理key上的脉冲旌旗灯号beginif ac_slt='0' then --时光调剂模式aclk<='0';if clk='1' and key='1' then--clk=1则tclk<=0,经由过程挖洞方法添加一个脉冲tclk<='0';elsif clk='0' and key='1' then--clk=0,则tclk<=1,产生一个高电平,添加一脉冲tclk<='1';elsetclk<=clk;end if;elsif ac_slt='1' then --闹铃调剂模式tclk<=clk;aclk<=key; --key上的脉冲直接修正闹铃准时价end if;end process;process(tclk,clr,enb)--24进制计数,个位.十位放在两个暂时变量中,暗示时的状况beginif clr='1' then--clearing works at the state of high voltageqout2_l<="0000";qout2_h<="0000";elsif tclk'event and tclk='1' thenif enb='1' then--enable works at high voltageif qout2_l="1001" thenqout2_l<="0000";--a full mode is completed and a carryout is generatedqout2_h<=qout2_h+1;elsif qout2_l="0011" and qout2_h="0010" thenqout2_l<="0000";qout2_h<="0000";elseqout2_l<=qout2_l+1;-- in process of countingend if;end if;end if;end process;process(aclk,clr,enb)--修正闹铃的准时价beginif clr='1' then--clearing works at the state of high voltagealarm_l<="0000";alarm_h<="0000";elsif aclk'event and aclk='1' thenif enb='1' then--enable works at high voltageif alarm_l="1001" thenalarm_l<="0000";--a full mode is completed and a carryout is generatedalarm_h<=qout2_h+1;elsif alarm_l="0011" and alarm_h="0010" thenalarm_l<="0000";alarm_h<="0000";elsealarm_l<=alarm_l+1;-- in process of countingend if;end if;end if;end process;process(qout2_l,qout2_h,alarm_l,alarm_h,alarm_clk)-- 产生进位,显示时光或闹铃准时价of high voltagebeginif qout2_l="0000" and qout2_h="0000" thenco<='1';elseco<='0';end if;if ac_slt='0' thenqout_hl<=qout2_l;qout_hh<=qout2_h;elseqout_hh<=alarm_h;qout_hl<=alarm_l;end if;end process;process(qout2_l,qout2_h,alarm_l,alarm_h)--准时价与时光值相等,则输出闹钟触发旌旗灯号beginif qout2_l=alarm_l and qout2_h=alarm_h thenout_alarm<='1';elseout_alarm<='0';end if;end process;end;2.体系以及各个模块的仿真波形(1).体系仿真波形:注:因为下面的模块仿真消失毛刺,导致体系的仿真图有必定的问题.(2).CNT60_A_SEC模块:注:在50.52.54.56.58处有嘟触发输出,00处有嘀触发输出等.(3).CNT60_A_MIN模块:注:本图展现了按键调节时光值和准时价的仿真波形(部分仿真图).注:该模块的仿真波形图,具有嘟.嘀声音触发输出,准时与时光相等时有闹铃触发输出等.(4).CNT24_A_HOUR模块注:该模块的仿真图,包含按键调剂时光.准时价,闹钟触发输出等.(5).PWM_OUT模块(分三段剪切下来的,展现了三种声音的后果)(1).“嘟”.“嘀”输出波形(只有在en有脉冲,打开PWMO后,才有用)注:在打开输出后,当两路嘟.嘀触发输入同时有用时分离输出嘟.嘀声音.当两路闹铃触发同时有用时开端闹铃声音的输出.注:闹铃输出的变更情形(“嘀”.“嘟”瓜代发声).注:闹铃输出的变更情形.3.下载时选择的开辟体系模式以及管脚界说表1 GW48-CK开辟体系工作模式:3三.课程设计过程中碰到的问题以及解决办法主如果在“调剂时光”和“调剂准时”的上面碰到异常大的艰苦.与开端想象的不一样,一个过程中不克不及参加时钟旌旗灯号,没可以或许将按键脉冲直接与时钟脉冲进行累加.同时,在对VHDL的语法的熟习上也消费了大量的时光.最后的解决办法是,经由过程另一个过程,先将这两个旌旗灯号进行处理后,分离产生aclk和tclk分离为准时调剂部分.和时光调剂部分供给时钟旌旗灯号.调剂按键的脉冲旌旗灯号和正常的时钟旌旗灯号不是按照简略的或运算来处理的.1).假如要调剂时光:1、当时钟旌旗灯号是高电平,按键旌旗灯号也是高电日常平凡,则给tclk赋值0.2、当时钟旌旗灯号是高电平,按键旌旗灯号是低电日常平凡,则给tclk赋值1.3、当时钟旌旗灯号是低电平,按键旌旗灯号是高电日常平凡,则给tclk赋值1.4、当时钟旌旗灯号是低电平,按键旌旗灯号是低电平是,则给tclk赋值0.如许无论按键脉冲是在高电平照样低电平,或者是在高下电平两种状况下消失,其最终成果都是会多产生一个脉冲旌旗灯号,导致计数值变更,达到修正时光的目标.时代,aclk始终不变.2).假如要调剂准时:1.时钟输入旌旗灯号赋值给tclk2.按键输入旌旗灯号赋值给aclk如许,当按键脉冲停止时,准时调剂旌旗灯号会消失一个脉冲.而时钟旌旗灯号不受影响.别的,在闹铃产生上也碰到了一些小问题,最后,经由过程在产生周期较长的旌旗灯号,切换输出值的内容“嘟”还有“嘀”,最后的后果就是“嘟”.“嘀”声音瓜代发出.在仿真时,大多半模块会消失毛刺,会导致最后的总仿真成果不是很乐不雅,会评脉冲的几个干扰加上去.这方面,我试图调了良久也没解决.不过因为在现实下载后照样相比较较正常的,仿真中的毛刺最后没有清除失落.。
电子秒表设计VHDL
一、设计题目:基于VHDL语言的电子秒表设计(可调时,有闹钟、定时功能)二、设计目的:⑴掌握较复杂的逻辑设计和调试⑵学习用原理图+VHDL语言设计逻辑电路⑶学习数字电路模块层次设计⑷掌握QuartusII软件及Modelsim软件的使用方法三、设计内容:(一)设计要求1、具有以二十四小时计时、显示、整点报时、时间设置和闹钟的功能。
2、设计精度要求为1S。
(二).系统功能描述1 . 系统输入:系统状态及校时、定时转换的控制信号为k、set、ds;时钟信号clk,采用实验箱的50MHz;系统复位信号为reset。
输入信号均由按键产生。
系统输出:8位LED七段数码管显示输出,蜂鸣器声音信号输出。
多功能数字钟系统功能的具体描述如下:2. 计时:set=1,ds=1工作状态下,每日按24h计时制计时并显示,蜂鸣器无声,逢整点报时。
3. 校时:在set=0,ds=0状态下,按下“k键”,进入“小时”校准状态,之后按下“k键”则进入“分”校准状态,继续按下“k键”则进入“秒校准”状态,之后如此循环。
1)“小时”校准状态:在“小时”校准状态下,显示“小时”数码管以1Hz的频率递增计数。
2)“分”校准状态:在“分”校准状态下,显示“分”的数码管以1Hz的频率递增计数。
3)“秒”复零状态:在“秒复零”状态下,显示“分”的数码管以1Hz的频率递增计数。
4. 整点报时:蜂鸣器在“59”分钟的第50—59,以1秒为间隔分别发出1000Hz,500Hz的声音。
5. 显示:采用扫描显示方式驱动8个LED数码管显示小时、分、秒。
闹钟:闹钟定时时间到,蜂鸣器发出交替周期为1s的1000Hz、500Hz的声音,持续时间为一分钟;6. 闹钟定时设置:在set=0,ds=1状态下,按下“k”,进入闹钟的“时”设置状态,之后按下“k键”进入闹钟的“分”设置状态,继续按下“k 键”则进入“秒”设置状态, 之后如此循环。
1)闹钟“小时”设置状态:在闹钟“小时”设置状态下,显示“小时”的数码管以1Hz 的频率递增计数。
数字钟的设计课程设计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的自动打铃设计_毕业设计 精品
基于VHDL的自动打铃设计目录摘要 (1)Abstract (2)绪论 (3)第1章基本概念简介 (4)1.1 VHDL简介 (4)1.2 FPGA/CPLD简介 (4)1.3 Quartus II的简介 (5)第2章设计整体概述 (6)2.1 设计方案 (6)2.2 设计原理图 (6)2.3 设计流程图 (7)第3章各模块设计分析 (8)3.1 计数器模块 (8)3.1.1 秒和分计数器模块 (8)3.1.2 时计数器模块 (10)3.2 计时校时模块 (12)3.3 打铃功能模块 (13)3.4 顶层设计及原理图 (16)第4章引脚设定与下载验证 (19)4.1 引脚设定 (19)4.2 下载验证 (21)总结 (22)参考文献 (23)致谢............................................ (错误!未定义书签。
) 附录芯片引脚对照表.. (25)摘要随着EDA 技术的发展和应用领域的扩大与深入,EDA 技术在电子信息、通信、自动控制及计算机应用领域的重要性日益突出。
EDA 技术就是以计算机为工具,设计者在EDA软件平台上,对以硬件描述语言HDL(Hardware Description language)为系统逻辑描述手段完成的设计文件,然后由计算机自动地完成逻辑编译、化简、分割、综合、优化、布局、布线和仿真,直至对于特定目标芯片的适配编译、逻辑映射和编程下载等工作。
本设计是基于VHDL语言的自动打铃系统。
在论文中,介绍了基于VHDL语言自动打铃系统的思路,整个系统需包含秒计时模块、分计时模块、时计时模块、校时模块、打铃模块。
在Quartus II 开发环境中编译和仿真所设计的程序,并逐一调试验证程序的运行状况。
仿真和验证的结果表明,该设计方法切实可行,该打铃系统可以实现调时定时打铃功能,具有一定的实际应用性。
关键字:EDA、VHDL、打铃、Quartus IIAbstractWith the development of EDA technology and the expansion of application, the function of EDA technology in the field of electronic information communication, automatic control and computer application, is becoming more and more important. EDA technology use computer as a tool. However, designers only need to use the hardware description language HDL to describe the system on the EDA software platform. Then computer automatically finishes partition, synthesis, optimization, simulation and other function until the electronic circuit system achieves the stated performance.This design is based on the VHDL hardware description language to project a system. I introduce ideas of the bell system in this design. All of the design includes second timer module, minute timer module, hour timer module, module to adjust time and module to ring the bell according to the require of design. I complete the description of different modules with VHDL language in the Quartus II development environment, and debug one by one to check the operational status of the verification process. Simulation results show that the design method is feasible, and the bell system can be put into practical applications.Keywords: EDA, VHDL, rang the bell, the Quartus II绪论随着EDA 技术的发展和应用领域的扩大与深入,EDA 技术在电子信息、通信、自动控制及计算机应用领域的重要性日益突出。
基于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设计的12进制可调时钟带闹铃功能
VHDL设计的12进制可调时钟带闹铃功能1、顶层原理图如下:2、各模块生成的电路符号如下:分频模块计数模块闹铃模块二选一模块设置闹铃时间模块显示模块3、各模块程序清单如下:(1)、分频模块(将开发板上的50Mhz的信号进行分频得到1hz的计时信号和1khz的位选信号)library ieee; --对开发板上的50MHZ信号进行分频得到1khz和1hz信号use ieee.std_logic_1164.all;entity div_freq isport(freq_in:in std_logic;flag_1khz,flag_1hz: buffer std_logic);end entity;architecture one of div_freq issignal complete_1khz: integer range 0 to 50000;signal complete_1hz: integer range 0 to 1000;signal test_out:std_logic;beginprocess(freq_in) --此进程得到的是1khz的信号beginif(freq_in 'event and freq_in='1') thencomplete_1khz<=complete_1khz+1;if(complete_1khz=50000) thencomplete_1khz<=0;elsif(complete_1khz<25000) thenflag_1khz<='0';elseflag_1khz<='1';end if;end if;end process;process(flag_1khz) --此进程是得到1hz信号beginif(flag_1khz 'event and flag_1khz='1') thencomplete_1hz<=complete_1hz+1;if(complete_1hz=1000)thencomplete_1hz<=0;flag_1hz<='0';elseflag_1hz<='1';end if;end if;test_out<=flag_1hz;end process;end architecture one;(2)、计时模块library ieee; --此模块是时分秒计时程序use ieee.std_logic_1164.all;entity counter isport(flag_1hz:in std_logic; --1hz信号到来时开始计时pause:in std_logic; --计时与调整的选择,决定是自动计时还是按键调整时间add_min:in std_logic; --按键调整分的信号add_hour:in std_logic; --按键调整时的信号cnt_60s:out integer range 0 to 59; --秒计数值cnt_60m:out integer range 0 to 59; --分计数值cnt_12h:out integer range 0 to 11); --时计数值end entity;architecture one of counter issignal sc_c:std_logic; --秒的进位信号signal min_c:std_logic; --分的进位信号signal selector_min:std_logic; --存放秒的进位信号或者分调整的按键信号signal selector_hour:std_logic; --存放分的进位信号或者时调整的按键信号beginprocess(flag_1hz) --此进程是进行60秒计时variable cnt_60s_v:integer range 0 to 59; --存放秒计时的中间变量,最后传到秒输出端cnt_60sbeginif(flag_1hz 'event and flag_1hz='1') thenif(cnt_60s_v=59) thencnt_60s_v:=0;sc_c<='1';elsecnt_60s_v:=cnt_60s_v+1;sc_c<='0';end if;end if;cnt_60s<=cnt_60s_v; --将计数的中间变量传给秒的输出端end process;process(sc_c,add_min) --此进程是进行60分计时variable cnt_60m_v:integer range 0 to 59 ; --存放分计时的中间变量,最后传到分输出端cnt_60mbeginif(pause='0') thenselector_min<=sc_c; --当计时/ 调整信号为0时正常计时,否则按键调整时间elseselector_min<=add_min;end if;if(selector_min 'event and selector_min='1') thenif(cnt_60m_v=59) thencnt_60m_v:=0;min_c<='1'; --分的进位信号elsecnt_60m_v:=cnt_60m_v+1;min_c<='0';end if;end if;cnt_60m<=cnt_60m_v; --将计数的中间变量传给分输出端end process;process(min_c,selector_hour) --此进程是进行12小时计时variable cnt_12h_v:integer range 0 to 11; --存放时的中间变量,最后传到分输出端cnt_60hbeginif(pause='0') thenselector_hour<=min_c;elseselector_hour<=add_hour;end if;if(selector_hour 'event and selector_hour='1') thenif(cnt_12h_v=11) thencnt_12h_v:=0;elsecnt_12h_v:=cnt_12h_v+1;end if;end if;cnt_12h<=cnt_12h_v;end process;end architecture one;(3)、设置闹铃时间模块library ieee; --设置闹铃时间,定时闹铃use ieee.std_logic_1164.all;entity setalarmtime isport(set_alarm,set_sc,set_min,set_hour:in std_logic;sc_data,min_data: out integer range 0 to 59;hour_data:out integer range 0 to 11);end entity ;architecture one of setalarmtime isbeginprocess(set_sc)variable set_sc_data:integer range 0 to 59; --定义局部变量beginif(set_alarm='1') thenif(set_sc 'event and set_sc='1') thenif(set_sc_data=59)thenset_sc_data:=0;elseset_sc_data:=set_sc_data+1; --设置秒end if;end if;end if;sc_data<=set_sc_data; --秒设置好赋值给输出端end process;process(set_min)variable set_min_data:integer range 0 to 59;beginif(set_alarm='1') thenif(set_min 'event and set_min='1') thenif(set_min_data=59)thenset_min_data:=0;elseset_min_data:=set_min_data+1; --设置分end if;end if;end if;min_data<=set_min_data; --分设置好赋值给输出端end process;process(set_hour)variable set_hour_data:integer range 0 to 11;beginif(set_alarm='1') thenif(set_hour 'event and set_hour='1') thenif(set_hour_data=11)thenset_hour_data:=0;elseset_hour_data:=set_hour_data+1; --设置时end if;end if;end if;hour_data<=set_hour_data; --时设置好赋值给输出端end process;end architecture one;(4)、闹铃模块library ieee;--闹铃模块,时间相等则开始闹铃use ieee.std_logic_1164.all;entity alarm isport(sc,min:in integer range 0 to 59;hour:in integer range 0 to 11; --正常计时的时分秒set_sc,set_min:in integer range 0 to 59;set_hour:in integer range 0 to 11; --设置闹铃时间的时分秒clear_alarm:in std_logic; --停止闹铃信号flag_1s:in std_logic; --1hz信号alarm_start:out bit; --开始闹铃信号alarm_end:out bit; --结束闹铃信号flag_alarm:out bit); --闹铃标志信号end entity;architecture one of alarm issignal flag_alarm_start:bit; --定义开始闹铃信号signal flag_alarm_end:bit; --定义结束闹铃信号beginprocess(sc,min,hour)beginif(flag_1s 'event and flag_1s='1') thenif(sc=set_sc and min=set_min hour=set_hour) thenflag_alarm_start<=not flag_alarm_start; --如果正常计时的时间和设置的闹铃时间相等时开始闹铃elseflag_alarm_start<='0'; --如果时间不相等则不闹铃end if;end if;alarm_start<=flag_alarm_start; 将信号赋值给输出端end process;process(clear_alarm)beginif(clear_alarm 'event and clear_alarm='1') thenflag_alarm_end<=not flag_alarm_end; --如果停止闹铃信号到来则停止闹铃end if;alarm_end<=flag_alarm_end;end process;process(flag_alarm_start,flag_alarm_end)beginflag_alarm<=flag_alarm_start xor flag_alarm_end;end process;end architecture one;(5)、二选一模块library ieee; --选择正常计时时间或者设置闹铃时间use ieee.std_logic_1164.all;entity two_sel_one isport(selector:in std_logic;--选择信号sc,min:in integer range 0 to 59;hour: in integer range 0 to 11;--正常计时时间输入端set_sc,set_min:in integer range 0 to 59;set_hour:in integer range 0 to 11; --设置闹铃时间的输入端sc_out,min_out: out integer range 0 to 59;hour_out:out integer range 0 to 11);--二选一选择后输出end entity ;architecture one of two_sel_one isbeginprocess(sc,min,hour,set_sc,set_min,set_hour)beginif(selector='0') thensc_out<=sc;min_out<=min;hour_out<=hour;--如果选择信号为0时,输出的是正常计时时间elsesc_out<=set_sc;min_out<=set_min;hour_out<=set_hour; --如果选择信号为1时,输出的是设置的闹铃时间end if;end process;end architecture one;(6)、显示模块library ieee; --此程序是将时分秒的十位和个位数分开并且转换成段码,还有位选use ieee.std_logic_1164.all;entity display isport(sc_data:in integer range 0 to 59;min_data:in integer range 0 to 59;hour_data:in integer range 0 to 11;flag_1khz:in std_logic; --1khz的位选信号Q:out std_logic_vector(7 downto 0); --接数码管的段码引脚S:out std_logic_vector(7 downto 0)); --接数码管的位选引脚end entity display;architecture one of display issignal sc_l,sc_h,min_l,min_h,hour_l,hour_h:integer range 0 to 9;signal sc_l_q,sc_h_q,min_l_q,min_h_q,hour_l_q,hour_h_q: std_logic_vector(7 downto 0);beginprocess(sc_data,min_data,hour_data) --将时分秒的十位和各位分开beginsc_l<=sc_data mod 10;sc_h<=integer(sc_data/10);min_l<=min_data mod 10;min_h<=integer(min_data/10);hour_l<=hour_data mod 10;hour_h<=integer(hour_data/10);end process;process(sc_l,sc_h,min_l,min_h,hour_l,hour_h) --将时分秒的个位和十位转换成数码管显示的段码begincase(sc_l)is --秒各位when 0 => sc_l_q<="00000011";when 1 => sc_l_q<="10011111";when 2 => sc_l_q<="00100101";when 3 => sc_l_q<="00001101";when 4 => sc_l_q<="10011001";when 5 => sc_l_q<="01001001";when 6 => sc_l_q<="01000001";when 7 => sc_l_q<="00011111";when 8 => sc_l_q<="00000001";when 9 => sc_l_q<="00001001";when others=>null;end case;case(sc_h)is --秒十位when 0 => sc_h_q<="00000011";when 1 => sc_h_q<="10011111";when 2 => sc_h_q<="00100101";when 3 => sc_h_q<="00001101";when 4 => sc_h_q<="10011001";when 5 => sc_h_q<="01001001";when others=>null;end case;case(min_l)is --分个位when 0 => min_l_q<="00000011";when 1 => min_l_q<="10011111";when 2 => min_l_q<="00100101";when 3 => min_l_q<="00001101";when 4 => min_l_q<="10011001";when 5 => min_l_q<="01001001";when 6 => min_l_q<="01000001";when 7 => min_l_q<="00011111";when 8 => min_l_q<="00000001";when 9 => min_l_q<="00001001";when others=>null;end case;case(min_h)is --分十位when 0 => min_h_q<="00000011";when 1 => min_h_q<="10011111";when 2 => min_h_q<="00100101";when 3 => min_h_q<="00001101";when 4 => min_h_q<="10011001";when 5 => min_h_q<="01001001";when others=>null;end case;case(hour_l)is --时个位when 0 => hour_l_q<="00000011";when 1 => hour_l_q<="10011111";when 2 => hour_l_q<="00100101";when 3 => hour_l_q<="00001101";when 4 => hour_l_q<="10011001";when 5 => hour_l_q<="01001001";when 6 => hour_l_q<="01000001";when 7 => hour_l_q<="00011111";when 8 => hour_l_q<="00000001";when 9 => hour_l_q<="00001001";when others=>null;end case;case(hour_h)is --时十位when 0 => hour_h_q<="00000011";when 1 => hour_h_q<="10011111";when others=>null;end case;end process;process(flag_1khz) --此进程是实现数码管动态显示variable counter_10:integer range 0 to 10;beginif(flag_1khz 'event and flag_1khz='1') thenif(counter_10=7) thencounter_10:=0;elsecounter_10:=counter_10+1;end if;end if;case (counter_10)iswhen 0 => S<="01111111";Q<=sc_l_q;when 1 => S<="10111111";Q<=sc_h_q;when 2 => S<="11011111";Q<="11111101";--显示'-'when 3 => S<="11101111";Q<=min_l_q;when 4 => S<="11110111";Q<=min_h_q;when 5 => S<="11111011";Q<="11111101";--显示'-'when 6 => S<="11111101";Q<=hour_l_q;when 7 => S<="11111110";Q<=hour_h_q;when others=>null;end case;end process;end architecture one;4、硬件仿真如下:。
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语言实现数字电子钟的设计一.设计要求:1、设计容选用适宜的可编程逻辑器件及外围电子元器件,设计一个数字电子钟,利用EDA软件〔QUARTUS Ⅱ〕进展编译及仿真,设计输入可采用VHDL硬件描述语言输入法〕和原理图输入法,并下载到EDA实验开发系统,连接外围电路,完成实际测试。
2、设计要求〔1〕具有时、分、秒计数显示功能。
〔2〕具有清零的功能,且能够对计时系统的小时、分钟进展调整。
〔3〕小时为十二小时制。
二.实验目的:1.通过这次EDA设计中,提高手动能力。
2.深入了解时事时钟的工作原理,以及时事时钟外围硬件设备的组成。
3.掌握多位计数器相连的设计方法。
4.掌握十进制,六进制,二十四进制计数器的设计方法。
5.继续稳固多位共阴极扫描显示数码管的驱动,及编码。
6.掌握扬声器的驱动。
7.LED灯的把戏显示。
8.掌握CPLD技术的层次化设计方法三.实验方案:数字系统的设计采用自顶向下、由粗到细, 逐步分解的设计方法, 最顶层电路是指系统的整体要求, 最下层是具体的逻辑电路的实现。
自顶向下的设计方法将一个复杂的系统逐渐分解成假设干功能模块, 从而进展设计描述, 并且应用EDA 软件平台自动完成各功能模块的逻辑综合与优化, 门级电路的布局, 再下载到硬件中实现设计。
因此对于数字钟来说首先是时分秒的计数功能,然后能显示,附带功能是清零、调整时分。
通过参考EDA 课程设计指导书,现有以下方案:1.作为顶层文件有输入端口:时钟信号,清零按键,调时按键,调分按键;输出端口有:用于接数码管的八段码输出口,扫描用于显示的六个数码管的输出口。
2.底层文件分为:〔1〕时间计数模块。
分秒计数模块计数为60计数,时计数模块为12计数。
〔2〕显示模块。
显示模块由一个六进制计数器模块和一个七段译码器组成。
进制计数器为六选一选择器的选择判断端提供输入信号, 六选一选择器的选择输出端分别接秒个位、秒十位、分个位、分十位和时个位、时十位的选通位用来完成动态扫描显示,同时依次输出秒个位、秒十位、分个位、分十位和时个位、时十位数向给译码模块。
基于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数字钟设计
题目:VHDL数字钟设计1 设计要求1:可以正常计时,能够准确实现由秒到分,由分到时的进位;2:具有修改时间功能,可以对分位和时位置数;3:具有整点报时功能,分位向时位进位时响铃;4:具有闹钟功能,可以设置闹钟时间,当闹钟时间与计时时间一样时响铃;2 设计分析及系统方案设计1:正常计时,采用三个进程,分别控制秒、分、时,低位进程走满时产生进位信号控制高位。
2:修改时间,采用键5、6、7、8和键4配合,当键4按下方可保存修改值。
四键中某一个按下时,每一个时钟沿,分别对应分加1、分减1、时加1、时减1。
3:整点报时,当秒个位为9、秒十位为5,、分个位为9、分十位为5时,再来一个时钟信号则时个位加1以上各位都清零,同时响铃,响铃持续一分钟。
4:闹钟,设置一个闹钟位,当闹钟位置1时调整时间是设置闹钟时间,当闹钟位置0时调整时间是设置正常计时的时间。
设置好闹钟时间后,当正常计时的分个位、分十位、时个位、时十位均与设置的闹钟时间相等时响铃一分钟。
3系统以及模块硬件电路设计下载时选择的开发系统模式以及管脚定义(注:采用模式“0”)4 系统的VHDL设计library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity dc_1 isport( clk,alarm,close,set:in std_logic;--走时频率,闹钟频率,修改控制键,脑中设置控制键choice: in std_logic_vector(3 downto 0);--模式选择键组合speak : out std_logic; --喇叭频率来源s1,s2,m1,m2,h1,h2 :out std_logic_vector(3 downto 0));--时间输出,依次是秒个位,秒十位,分个位,分十位,时个位,时十位end;architecture a of dc_1 issignal s_1,s_2,m_1,h_1,m_2,h_2 : std_logic_vector(3 downto 0);--存正常走时的时间,不能存修改的时间signal ss1,ss2,mm1,hh1,mm2,hh2 : std_logic_vector(3 downto 0);--转存所有时间,赋值给输出signal as1,as2,am1,ah1,am2,ah2 : std_logic_vector(3 downto 0):--存放闹钟设定值signal clksp,x,y: std_logic;--整点报时低频信号,分走满的进位信号,时走满的进位信号signal n:std_logic_vector(1 downto 0); --控制分频产生clksp beginprocess(alarm)begin --get low frequency of strike on the hour if alarm'event and alarm='1' thenif n="10" thenn<="00";clksp<=not clksp;else n<=n+1;end if;end if;end process;process(clk)beginif clk'event and clk='1' then --second if(s_1="0101" and s_2="1001") thens_1<="0000";s_2<="0000";x<='1';elsif (s_2="1001") thens_2<="0000";s_1<=s_1+1;x<='0';else s_2<=s_2+1;x<='0';end if;end if;end process;process(clk) --adjust the second to match minute and hour beginif clk'event and clk='1' then ss1<=s_1;ss2<=s_2;end if;end process;process(clk)begin if close='1' then m_1<=mm1;m_2<=mm2; --minute elsif clk'event and clk='0' thenif s_2="1001" and s_1="0101" thenif m_2="1001" thenm_2<="0000";if (m_1="0101") thenm_1<="0000";y<='1';else m_1<=m_1+1;y<='0';end if;else m_2<=m_2+1;y<='0';end if;end if;end if;end process;process(clk)beginif clk'event and clk='1' then ---change minute if set='0' thenif choice="0000" thenmm1<=m_1;mm2<=m_2;elsif choice="0001" thenif (mm2="1001" and mm1="0101") thenmm2<="0000";mm1<="0000";elsif mm2="1001" thenmm2<="0000";mm1<=mm1+1;else mm2<=mm2+1;end if;elsif choice="0010" thenif (mm2="0000" and mm1="0000") thenmm2<="1001";mm1<="0101";elsif (mm2="0000") thenmm2<="1001";mm1<=mm1-1;else mm2<=mm2-1;end if;end if;end if;end if;end process;process(clk) --hour beginif close='1' then h_1<=hh1;h_2<=hh2;elsif clk'event and clk='0' thenif x='1' and y='1' thenif (h_1="0010" and h_2="0100") thenh_1<="0000" ;h_2<="0000";elsif(h_2="1001") thenh_2<="0000";h_1<=h_1+1;else h_2<=h_2+1;end if;end if;end if;end process;process(clk)beginif clk'event and clk=’1’ then --change hour if set='0' thenif choice="0000" thenhh1<=h_1;hh2<=h_2;elsif choice="0100" thenif (hh2="0100" and hh1="0010") thenhh2<="0000";hh1<="0000";elsif hh2="1001" thenhh2<="0000";hh1<=hh1+1;else hh2<=hh2+1;end if;elsif choice="1000" thenif (hh2="0000" and hh1="0000") thenhh2<="0100";hh1<="0010";elsif (hh2="0000") thenhh2<="1001";hh1<=hh1-1;else hh2<=hh2-1;end if;end if;end if;end if;end process;process(clk,set) --set alarm beginif clk'event and clk='1' thenif set='1' thenif choice="0001" then --set second if (as2="1001" and as1="0101") thenas2<="0000";as1<="0000";elsif as2="1001" thenas2<="0000";as1<=as1+1;else as2<=as2+1;end if;elsif choice="0010" then --set minif (am2="1001" and am1="0101") thenam2<="0000";am1<="0000";elsif am2="1001" thenam2<="0000";am1<=am1+1;else am2<=am2+1;end if;elsif choice="0100" then --set hour if (ah2="0100" and ah1="0010") thenah2<="0000";ah1<="0000";elsif ah2="1001" thenah2<="0000";ah1<=ah1+1;else ah2<=ah2+1;end if;end if;end if;end if;end process;process(clk)begin --display if set='1' thens1<=as1;s2<=as2;m1<=am1;m2<=am2;h1<=ah1;h2<=ah2;elses1<=s_1;s2<=s_2;m1<=mm1;m2<=mm2;h1<=hh1;h2<=hh2;end if;end process;process(clk)begin --alarm control and speaker control if set='0' thenif (mm1=am1 and mm2=am2 and hh1=ah1 and hh2=ah2) thenspeak<=alarm;elsif mm1="0101" and mm2="1001" and ss1="0101" thenif ss2="0010" or ss2="0100" or ss2="0110" or ss2="1000" thenspeak<=clksp;end if;elsif mm1="0000" and mm2="0000" and ss1="0000" and ss2="0000" thenif hh1="0000" and hh2="0000" thenspeak<='0';elsespeak<=alarm;end if;else speak<='0';end if;end if;end process;end;5 结论以及结果说明在windows系统下运行MAX+PLUSII10.2软件,编译仿真成功后,连接引脚,实验箱选择EPF10K10LC84-4。
基于VHDL语言的数字电子钟课程设计
基于VHDL语言的简易电子钟设计[摘要] VHDL是广泛应用的硬件描述语言,可以用在硬件设计流程的建模、综合和模拟等多个阶段。
随着硬件设计规模的不断扩大,应用硬件描述语言进行描述的CPLD结构,成为设计专用集成电路和其他集成电路的主流。
通过应用VHDL对数字时钟的设计,达到对VHDL的理解,同时对CPLD器件加深了解。
该系统在开发软件Quartus Ⅱ环境中设计完成,本文给出了设计该数字时钟系统的流程和方法,最后通过CPLD实现预定功能。
关键词:电子钟;硬件描述语言;VHDL;Quartus Ⅱ;CPLD目录引言 (1)第一章设计任务及功能要求 (1)1.1设计课题内容 (1)1.2功能要求说明 (1)第二章系统设计方案 (2)2.1电子钟工作原理 (2)2.2总体方案设计 (2)第三章电子钟顶层设计 (2)3.1顶层设计分析 (2)3.2 顶层电路图 (3)第四章各功能模块的设计 (4)4.1正常计时模块 (4)4.1.1分频模块设计 (4)4.1.2 60进制计数器设计 (5)4.1.3 24进制计数器设计 (5)4.2整点报时模块 (6)4.2.1整点报时设计思路及原理图 (6)4.2.2整点报时仿真波形 (7)4.3分时校对模块 (7)4.3.1分时校对设计思路及原理图 (7)4.3.2分时校对仿真波形 (7)4.4扫描输出模块 (8)4.4.1扫描输出设计思路及原理图 (8)4.4.2扫描输出仿真波形 (8)4.5译码显示模块 (9)4.5.1译码显示设计思路及原理图 (9)4.5.2译码显示仿真波形 (10)第五章系统硬件实现分析 (10)5.1 引脚分配 (10)5.2 系统硬件测试及分析 (11)第六章结束语 (11)参考文献 (11)附录1顶层电路图 (12)附录2程序代码 (12)引言数字时钟是一种用数字电路技术实现时、分、秒计时的装置,数字时钟走时精度高,稳定性好,使用方便,不需要经常调校,数字式时钟用秒脉冲发生器的精度稳定保证了数字钟的质量。
vhdl闹钟电子钟
数字电路课程设计院系:电信学院专业:姓名:学号:200982083完成日期:2011-12-24数字钟的设计一、系统功能概述(一)、系统实现的功能:1、具有“时”、“分”、“秒”的十进制数字显示(小时从00 ~ 23)。
2、具有手动校时、校分、校秒的功能。
3、有定时和闹钟功能,能够在设定的时间发出闹铃声。
(二)、各项设计指标:1、显示部分采用的6个LED显示器,从高位至低位分别显示时、分、秒。
2、有一个设置调闹钟定时时间、正常时间的按钮,选择调的对象。
3、有三个按钮分别调时、分、秒的时间。
4、有一个按钮用作开启/关闭闹铃。
5、另外需要两个时钟信号来给系统提供脉冲信号,使时钟和闹钟正常工作,分别为1Hz、1kHz的脉冲。
二、系统组成以及系统各部分的设计1、系统结构描述//要求:系统(或顶层文件)结构描述,各个模块(或子程序)的功能描述;(一)系统的顶层文件:1、顶层文件图:(见下页)2、各模块的解释:(1)、7个输入量clk_1khz、clk_1hz、key_slt、key_alarm、sec_set、min_set、hour_set:其中clk_1khz为闹铃模块提供时钟,处理后能产生“嘟”、“嘀”和变化的闹铃声音;clk_1hz为计时模块提供时钟信号,每秒计数一次;key_slt选择设置对象:定时或正常时间;key_alarm能够开启和关闭闹铃;sec_set、min_set、hour_set用于设置时间或定时,与key_slt相关联。
各按键输出为脉冲信号。
(2)、CNT60_A_SEC模块:这个模块式将clk_1hz这个时钟信号进行60进制计数,并产生一个分钟的触发信号。
该模块能将当前计数值实时按BCD码的格式输出。
将该输出接到两位LED数码后能时时显示秒的状态。
通过alarm_clk可以选择设置对象为时间还是定时值。
在设置时间模式上,key上的一个输入脉冲可以将clk的输入信号加一。
在设置定时模式上,key 上的脉冲只修改定时值,不影响时间脉冲clk的状态。
基于VHDL的电子时钟设计
二、试验项目名称:基于vhdl语言的数码管时钟设计三、实验目的:利用FPGA开发板上的数码管,晶振等资源设计出能够显示时、分、秒的时钟。
四、实验内容及原理:(一)、综述本实验目标是利用FPGA逻辑资源,编程设计实现一个数字电子时钟。
实验环境为fpga开发板。
电路设计采用VHDL硬件描述语言编程实现,开发软件为ise7.1i。
(二)、模块框架设计计数时钟由模为60的秒计数器模块、模为60的分计数模块、模为24的小时计数器模块、此外还有最后的数码管显示模块。
1.综合计时模块包括计时及进位两个进程,实现时钟逻辑功能。
2.显示模块将时钟的每次变化所对应的时间及时输出到数码管上。
实质为数码管译码器。
(三)、VHDL编程与仿真:1、各个进程模块以下三个process分别为分频,进位以及计时进程。
分频进程用于统计CLK输入信号输出完整的1秒。
进位进程控制60进制,60进制和24进制的进位关系。
计时进程用于实现电子时钟的基本计时功能,即每秒均变化。
---------------------分频部分-----------------process(clk,reset)beginif(reset='0')thencnt<=0;elsif(clk'event and clk='1')thencnt<=cnt+1;if(cnt=50000000)then ----开发板晶振50M,统计到此时为1S cnt<=0;end if;end if;end process;------------------------------------------------进位共包括秒个位向秒十位进位,秒十位向分个位进位,分个位向分十位进位,分十位向时个位进位,时个位向时十位进位。
根据进位规则则可以实现从0时0分0秒到23时59分59秒之间任意时刻的显示。
-------------各位的进位标志--------------------------process(clk,reset)beginif reset='0'thenjinwei<="000000";elsif clk'event and clk='1'thenif dataout_buf(0)=9 thenjinwei(0)<='1'; -----9S时向秒十位进位------elsejinwei(0)<='0';end if;if(jinwei(0)='1'and dataout_buf(1)=5)thenjinwei(1)<='1'; ------59S时向分个位进位------- elsejinwei(1)<='0';end if;if(jinwei(1)='1' and dataout_buf(3)=9)thenjinwei(2)<='1'; -----9分且秒十位进位时向分十位进位elsejinwei(2)<='0';end if;if(jinwei(2)='1' and dataout_buf(4)=5)thenjinwei(3)<='1'; -----分十位为5且分个位进位时向时个位进位elsejinwei(3)<='0';end if;if(jinwei(3)='1' and dataout_buf(6)=9)thenjinwei(4)<='1'; ----时个位为9且分十位进位时向时十位进位elsejinwei(4)<='0';end if;if(jinwei(4)='1' and dataout_buf(6)=2 and dataout_buf(7)=1)then jinwei(5)<='1'; ----到12时且时个位进位时标记最高标记位elsejinwei(5)<='0';end if;end if;end process;---------------------------------------------------计数进程,其进程逻辑上受分频输出与进位控制,当分频输出变化(即每秒),秒个位自加,当满足进位条件时,调用进位规则,进行时间的跳转。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字钟的设计一、系统功能概述(一)、系统实现的功能:1、具有“时”、“分”、“秒”的十进制数字显示(小时从00 ~ 23)。
2、具有手动校时、校分、校秒的功能。
3、有定时和闹钟功能,能够在设定的时间发出闹铃声。
4、能进行整点报时。
从59分50秒起,每隔2秒发一次低音“嘟”的信号,连续5次,最后一次为高音“嘀”的信号。
(二)、各项设计指标:1、显示部分采用的6个LED显示器,从高位至低位分别显示时、分、秒。
2、有一个设置调闹钟定时时间、正常时间的按钮,选择调的对象。
3、有三个按钮分别调时、分、秒的时间。
4、有一个按钮用作开启/关闭闹铃。
5、另外需要两个时钟信号来给系统提供脉冲信号,使时钟和闹钟正常工作,分别为1Hz、1kHz的脉冲。
二、系统组成以及系统各部分的设计1、系统结构描述//要求:系统(或顶层文件)结构描述,各个模块(或子程序)的功能描述;(一)系统的顶层文件:1、顶层文件图:(见下页)2、各模块的解释:(1)、7个输入量clk_1khz、clk_1hz、key_slt、key_alarm、sec_set、min_set、hour_set:其中clk_1khz为闹铃模块提供时钟,处理后能产生“嘟”、“嘀”和变化的闹铃声音;clk_1hz为计时模块提供时钟信号,每秒计数一次;key_slt选择设置对象:定时或正常时间;key_alarm能够开启和关闭闹铃;sec_set、min_set、hour_set用于设置时间或定时,与key_slt相关联。
各按键输出为脉冲信号。
(2)、CNT60_A_SEC模块:这个模块式将clk_1hz这个时钟信号进行60进制计数,并产生一个分钟的触发信号。
该模块能将当前计数值实时按BCD码的格式输出。
将该输出接到两位LED数码后能时时显示秒的状态。
通过alarm_clk可以选择设置对象为时间还是定时值。
在设置时间模式上,key上的一个输入脉冲可以将clk的输入信号加一。
在设置定时模式上,key 上的脉冲只修改定时值,不影响时间脉冲clk的状态。
同时该模块具有两个输出口out_do、out_di来触发整点报时的“嘟”、“嘀”声音。
(3)、CNT60_A_MIN模块:这个模块式将CNT60_A_SEC的输出信号进行60进制计数,并产生一个时位的触发信号。
该模块能将当前计数值实时按BCD码的格式输出。
将该输出接到两位LED数码后能时时显示分的状态。
通过alarm_clk可以选择设置对象为时间还是定时值。
在设置时间模式上,key上的一个输入脉冲可以将clk的输入信号加一。
在设置定时模式上,key上的脉冲只修改定时值,不影响时间脉冲clk的状态。
同时该模块具有三个输出口out_do、out_di、out_alarm来触发整点报时的“嘟”、“嘀”、闹铃声音。
(4)、CNT24_A_HOUR模块:这个模块式将CNT60_A_MIN的输出信号做24进制计数。
该模块能将当前计数值实时按BCD码的格式输出。
将该输出接到两位LED数码后能时时显示时的状态。
通过alarm_clk可以选择设置对象为时间还是定时值。
在设置时间模式上,key上的一个输入脉冲可以将clk的输入信号加一。
在设置定时模式上,key上的脉冲只修改定时值,不影响时间脉冲clk的状态。
同时该模块具有一个输出口out_alarm来触发整点报时的闹铃声音。
(5)、PWM_OUT模块:该模块为PWM产生模块,通过EN可开启和关闭PWM输出。
模块根据CLK信号二分频产生的高低音,并组合,能输出三种声音状态——“嘟”、“嘀”、闹铃。
而该三种声音要被秒、分、时的输出触发才能输出PWM。
(二)系统各个模块的VHDL程序:(1)、CNT60_A_SEC模块:程序源代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt60_a_sec isport(clk,clr,enb: in std_logic;--clk:时钟输入信号,clr:清零端,enb:使能端key: in std_logic; --输入按键脉冲,调整闹铃定时或时间alarm_clk: in std_logic;--1:alarm 0:clk --设置模式选择:闹铃调节模式、时间调节模式qout_sl: out std_logic_vector(3 downto 0); --显示输出秒的低位qout_sh: out std_logic_vector(3 downto 0);--显示输出秒的高位co: out std_logic; --进位输出,触发分计数模块out_do: out std_logic;--在整点报时中输出“嘟”触发信号out_di: out std_logic --在整点报时中输出“嘀”触发信号);end;architecture a of cnt60_a_sec issignal qout2_l:std_logic_vector(3 downto 0);signal qout2_h:std_logic_vector(3 downto 0);signal alarm_l:std_logic_vector(3 downto 0);signal alarm_h:std_logic_vector(3 downto 0);signal clk1,clk2,tclk,aclk,ac_slt: std_logic;beginprocess(alarm_clk) --当该端口输入一个脉冲时,修改设置模式:时间调整或闹铃模式切换beginif alarm_clk'event and alarm_clk='1' thenif ac_slt='0' then--如果为定时模式,将改为闹铃模式ac_slt<='1';elseac_slt<='0';end if;end if;end process;process(key,clk,ac_slt)--根据设置模式,处理key上的脉冲信号beginif ac_slt='0' then --时间调整模式aclk<='0';if clk='1' and key='1' then --clk=1则tclk<=0,通过挖洞方式添加一个脉冲tclk<='0';elsif clk='0' and key='1' then --clk=0,则tclk<=1,产生一个高电平,添加一脉冲tclk<='1';elsetclk<=clk;end if;elsif ac_slt='1' then --闹铃调整模式tclk<=clk;aclk<=key; --key上的脉冲直接修改闹铃定时值end if;end process;process(tclk,clr,enb) --60进制计数,个位、十位放在两个临时变量中,表示秒的状态beginif clr='1' then--clearing works at the state of high voltageqout2_l<="0000";qout2_h<="0000";elsif tclk'event and tclk='1' thenif enb='1' then--enable works at high voltageif qout2_l="1001" and qout2_h="0101" thenqout2_l<="0000";--a full mode is completed and a carryout is generatedqout2_h<="0000";elsif qout2_l="1001" thenqout2_l<="0000";qout2_h<=qout2_h+1;elseqout2_l<=qout2_l+1;-- in process of countingend if;end if;end if;end process;process(aclk,clr,enb)--修改闹铃的定时值beginif clr='1' then--clearing works at the state of high voltagealarm_l<="0000";alarm_h<="0000";elsif aclk'event and aclk='1' thenif enb='1' then--enable works at high voltageif alarm_l="1001" and alarm_h="0101" thenalarm_l<="0000";--a full mode is completed and a carryout is generatedalarm_h<="0000";elsif alarm_l="0101" thenalarm_l<="0000";alarm_h<=alarm_h+1;elsealarm_l<=alarm_l+1;-- in process of countingend if;end if;end if;end process;process(qout2_l,qout2_h,alarm_l,alarm_h,alarm_clk)-- 产生进位,显示时间或闹铃定时值beginif qout2_l="0000" and qout2_h="0000" thenco<='1';elseco<='0';end if;if ac_slt='0' then -- 显示时间qout_sl<=qout2_l;qout_sh<=qout2_h;else -- 显示定时值qout_sh<=alarm_h;qout_sl<=alarm_l;end if;end process;process(qout2_l,qout2_h) -- 根据秒的状态输出“嘟”、“嘀”触发信号beginif qout2_h="0101" thenif qout2_l="0000" thenout_do<='1';elsif qout2_l="0010" thenout_do<='1';elsif qout2_l="0100" thenout_do<='1';elsif qout2_l="0110" thenout_do<='1';elsif qout2_l="1000" thenout_do<='1';elseout_do<='0';end if;elsif qout2_h="0000" thenif qout2_l="0000" thenout_di<='1';out_do<='0';elseout_di<='0';end if;elseout_do<='0';out_di<='0';end if;end process;end;(2)、CNT60_A_MIN模块:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt60_a_min isport(clk,clr,enb: in std_logic; --clk:时钟输入信号,clr:清零端,enb:使能端key: in std_logic; --输入按键脉冲,调整闹铃定时或时间alarm_clk: in std_logic; --1:alarm 0:clk --设置模式选择:闹铃调节模式、时间调节模式qout_ml: out std_logic_vector(3 downto 0); --显示输出分的低位qout_mh: out std_logic_vector(3 downto 0); --显示输出分的高位co: out std_logic; --进位输出,触发时计数模块out_alarm:out std_logic;--闹铃触发信号,时间到后输出高电平触发闹铃out_do,out_di: out std_logic--在整点报时中输出“嘟”“嘀”触发信号);end;architecture a of cnt60_a_min issignal qout2_l:std_logic_vector(3 downto 0);signal qout2_h:std_logic_vector(3 downto 0);signal alarm_l:std_logic_vector(3 downto 0);signal alarm_h:std_logic_vector(3 downto 0);signal clk1,clk2,tclk,aclk,ac_slt: std_logic;beginprocess(alarm_clk) --当该端口输入一个脉冲时,修改设置模式:时间调整或闹铃模式切换beginif alarm_clk'event and alarm_clk='1' thenif ac_slt='0' then--如果为定时模式,将改为闹铃模式ac_slt<='1';elseac_slt<='0';end if;end if;end process;process(key,clk,ac_slt) --根据设置模式,处理key上的脉冲信号beginif ac_slt='0' then --时间调整模式aclk<='0';if clk='1' and key='1' then--clk=1则tclk<=0,通过挖洞方式添加一个脉冲tclk<='0';elsif clk='0' and key='1' then--clk=0,则tclk<=1,产生一个高电平,添加一脉冲tclk<='1';elsetclk<=clk;end if;elsif ac_slt='1' then --闹铃调整模式tclk<=clk;aclk<=key; --key上的脉冲直接修改闹铃定时值end if;end process;process(tclk,clr,enb) --60进制计数,个位、十位放在两个临时变量中,表示分的状态beginif clr='1' then--clearing works at the state of high voltageqout2_l<="0000";qout2_h<="0000";elsif tclk'event and tclk='1' thenif enb='1' then--enable works at high voltageif qout2_l="1001" and qout2_h="0101" thenqout2_l<="0000";--a full mode is completed and a carryout is generatedqout2_h<="0000";elsif qout2_l="1001" thenqout2_l<="0000";qout2_h<=qout2_h+1;elseqout2_l<=qout2_l+1;-- in process of countingend if;end if;end if;end process;process(aclk,clr,enb) --修改闹铃的定时值beginif clr='1' then--clearing works at the state of high voltagealarm_l<="0000";alarm_h<="0000";elsif aclk'event and aclk='1' thenif enb='1' then--enable works at high voltageif alarm_l="1001" and alarm_h="0101" thenalarm_l<="0000";--a full mode is completed and a carryout is generatedalarm_h<="0000";elsif alarm_l="0101" thenalarm_l<="0000";alarm_h<=alarm_h+1;elsealarm_l<=alarm_l+1;-- in process of countingend if;end if;end if;end process;process(qout2_l,qout2_h,alarm_l,alarm_h,alarm_clk) -- 产生进位,显示时间或闹铃定时值of high voltagebeginif qout2_l="0000" and qout2_h="0000" thenco<='1';elseco<='0';end if;if ac_slt='0' thenqout_ml<=qout2_l;qout_mh<=qout2_h;elseqout_mh<=alarm_h;qout_ml<=alarm_l;end if;end process;process(qout2_l,qout2_h,alarm_l,alarm_h) –判断定时值与时间值相等,输出闹铃触发信号beginif qout2_l=alarm_l and qout2_h=alarm_h thenout_alarm<='1';elseout_alarm<='0';end if;end process;process(qout2_l,qout2_h) -- 根据分的状态输出“嘟”、“嘀”触发信号beginif qout2_l="1001" and qout2_h="0101" thenout_do<='1';elseout_do<='0';end if;if qout2_l="0000" and qout2_h="0000" thenout_di<='1';elseout_di<='0';end if;end process;end;(3)、CNT24_A_HOUR模块:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity cnt24_a_hour isport(clk,clr,enb: in std_logic; --clk:时钟输入信号,clr:清零端,enb:使能端key: in std_logic; --输入按键脉冲,调整闹铃定时或时间alarm_clk: in std_logic;--1:alarm 0:clk--设置模式选择:闹铃调节模式、时间调节模式qout_hl: out std_logic_vector(3 downto 0); --显示输出时的低位qout_hh: out std_logic_vector(3 downto 0); --显示输出时的高位co: out std_logic; --进位输出out_alarm:out std_logi--闹铃触发信号输出);end;architecture a of cnt24_a_hour issignal qout2_l:std_logic_vector(3 downto 0);signal qout2_h:std_logic_vector(3 downto 0);signal alarm_l:std_logic_vector(3 downto 0);signal alarm_h:std_logic_vector(3 downto 0);signal clk1,clk2,tclk,aclk,ac_slt: std_logic;beginprocess(alarm_clk) --当该端口输入一个脉冲时,修改设置模式:时间调整或闹铃模式切换beginif alarm_clk'event and alarm_clk='1' thenif ac_slt='0' then--如果为定时模式,将改为闹铃模式ac_slt<='1';elseac_slt<='0';end if;end if;end process;process(key,clk,ac_slt) --根据设置模式,处理key上的脉冲信号beginif ac_slt='0' then --时间调整模式aclk<='0';if clk='1' and key='1' then--clk=1则tclk<=0,通过挖洞方式添加一个脉冲tclk<='0';elsif clk='0' and key='1' then--clk=0,则tclk<=1,产生一个高电平,添加一脉冲tclk<='1';elsetclk<=clk;end if;elsif ac_slt='1' then --闹铃调整模式tclk<=clk;aclk<=key; --key上的脉冲直接修改闹铃定时值end if;end process;process(tclk,clr,enb) --24进制计数,个位、十位放在两个临时变量中,表示时的状态beginif clr='1' then--clearing works at the state of high voltageqout2_l<="0000";qout2_h<="0000";elsif tclk'event and tclk='1' thenif enb='1' then--enable works at high voltageif qout2_l="1001" thenqout2_l<="0000";--a full mode is completed and a carryout is generatedqout2_h<=qout2_h+1;elsif qout2_l="0011" and qout2_h="0010" thenqout2_l<="0000";qout2_h<="0000";elseqout2_l<=qout2_l+1;-- in process of countingend if;end if;end if;end process;process(aclk,clr,enb) --修改闹铃的定时值if clr='1' then--clearing works at the state of high voltagealarm_l<="0000";alarm_h<="0000";elsif aclk'event and aclk='1' thenif enb='1' then--enable works at high voltageif alarm_l="1001" thenalarm_l<="0000";--a full mode is completed and a carryout is generatedalarm_h<=qout2_h+1;elsif alarm_l="0011" and alarm_h="0010" thenalarm_l<="0000";alarm_h<="0000";elsealarm_l<=alarm_l+1;-- in process of countingend if;end if;end if;end process;process(qout2_l,qout2_h,alarm_l,alarm_h,alarm_clk) -- 产生进位,显示时间或闹铃定时值of high voltagebeginif qout2_l="0000" and qout2_h="0000" thenco<='1';elseco<='0';end if;if ac_slt='0' thenqout_hl<=qout2_l;qout_hh<=qout2_h;elseqout_hh<=alarm_h;qout_hl<=alarm_l;end if;end process;process(qout2_l,qout2_h,alarm_l,alarm_h)--定时值与时间值相等,则输出闹钟触发信号beginif qout2_l=alarm_l and qout2_h=alarm_h thenout_alarm<='1';elseout_alarm<='0';end if;end process;2、系统以及各个模块的仿真波形(1)、系统仿真波形:注:由于下面的模块仿真存在毛刺,导致系统的仿真图有一定的问题。