基于VHDL的闹钟控制系统

合集下载

基于VHDL数字钟系统设计

基于VHDL数字钟系统设计

基于VHDL数字钟数字系统课程设计姓名:周振坤学号:100341239专业:计算机科学与技术基于VHDL数字钟一、内容摘要本次课程设计运用VHDL语言实现了数字钟的各项基本功能,各个模块均用VHDL语言实现。

运用语言编写的程序使得我们的思路更加清晰,逻辑关系更加明确。

相比较其他系统,这个数字钟系统比较可靠,并且修改和升级都很灵活。

二、设计内容及要求数字钟是常见的一种计数装置,以1Hz的频率工作,其主要功能有以下几个方面:(1)以1Hz的频率工作,进行计时;(2)显示时、分、秒信息。

这些显示信息在6个7段数码管上完成;(3)通过按键设置时、分信息,并且具有复位功能。

复位按键可将时、分、秒清零,并做好重新技术的准备。

其他按键还具有预置时、分的功能,分别对当前的时和分信息做递增设置和递减设置。

(4)具有独特的整点报时功能,每当整点来临之前会有3声较低频率的提示音,整点到来的时候会有较高频率的整点报时声,会按照在几点来决定发出声响的次数,例如5点响5声,20点响8声。

三、系统方案及系统框图用VHDL语言编写分频模块和主控制模块,连接输入输出端,在top电路文件中形成最终的框架,整体结构清晰严谨。

这里的主控制模块较为复杂,接下来单独来讲。

先说说分频模块,这里要分出两种频率的信号,一个是用于主控制模块中定时时钟所用的1Hz信号,另一个是扫描时钟所需的1khz 信号。

所以这里采用的是利用计数器实现。

(理论上是分频1hz和1khz,实际上没有这样分频)。

下面是主控制模块的框架结构:主控制模块中又分为主要的5个模块(这里也可以称为进程),按键处理,计时控制,显示处理,定时时钟,扫描时钟。

讲解细节代码的时候再进行详细分析。

·!这里有一个小的问题出现了,在实际操作的时候发现,显示处理的时候如果仅给出“001”等这样的输出很容易,但是我们必须要经过译码才可以得到想要的值。

所以,我们决定用3-8译码器来解决译码的问题,从主控模块中进行分离,从主控制模块中的输出再经过一个3-8译码器才是真正的输出。

vhdl语言实例练习 闹钟系统控制电路

vhdl语言实例练习 闹钟系统控制电路

一、课程设计的目的与要求1.设计目的●熟悉MAXPLUS2/Quartus II软件,掌握软件的VHDL程序输入、程序编译和程序仿真操作;●学习利用VHDL语言设计闹钟系统控制电路程序。

2.设计要求●根据设计正文提出的闹钟控制电路功能设计相应VHDL程序。

●有能力的同学,可以在设计正文提出的闹钟功能基础上,再提出新的功能并完成设计。

二、设计正文设计一个闹钟系统控制电路,其功能如下:计时功能:是钟表的基本功能,这里要求设计的时钟能够显示小时、分钟、秒钟(用户可以选择时钟工作方式是24小时显示方式或12小时显示方式)。

闹钟功能:用户设置闹钟时间,当时钟时间与闹钟时间相同时,闹钟发出警报。

VHDL源程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; ——包含库和程序包entity naozhong isport( clk,reset:in std_logic;resettime: in std_logic_vector(16 downto 0);——端口表定义clk,reset,clocktime等输入变量;elert,hour,minute,secind输出变量clocktime:in std_logic_vector(16 downto 0);elert:out std_logic;hour: out std_logic_vector(4 downto 0);minute: out std_logic_vector(5 downto 0);second: out std_logic_vector(5 downto 0));end naozhong;ARCHITECTURE clock of naozhong isSIGNAL count1 : STD_LOGIC_VECTOR (5 DOWNTO 0);SIGNAL count2 : STD_LOGIC_VECTOR (5 DOWNTO 0);SIGNAL count3 : STD_LOGIC_VECTOR (4 DOWNTO 0); ——设置信号count1count2 count3 BEGINsecond<=count1;minute<=count2;hour<=count3;PROCESS(clk,reset)BEGINif (clocktime=count3&count2&count1) then ——闹钟报警功能:当现在时间与设定报警时间相同时,发出警报elert<='1';elseelert<='0';end if;IF (reset='1')THENcount1<=resettime(5 downto 0);count2<=resettime(11 downto 6); ——计时功能:以24小时的时钟计时count3<= resettime(16 downto 12);elsif (clk'event AND clk='1') thencount1<=count1+'1';if (count1="111011") thencount2<=count2+'1';count1<="000000";if(count2="111011")thencount3<=count3+'1';count2<="000000";if (count3="10111")thencount3<="00000";end if;end if;end if;end if; ——程序结束END PROCESS;END clock;三、实验结果与分析图表1闹钟系统控制—秒钟由图表1看出在时钟信号clk作用下,秒钟由000000,000001,000010,000100,依次递增计时,并且从闹钟定时clocktime=00000000000000000,报时输出elert=1,完成报时功能。

基于Verilog HDL的闹钟设计

基于Verilog HDL的闹钟设计

封面删除~你懂的摘要随着微电子技术、计算机技术、半导体技术的发展,很多传统的数字门电路的设计已经被可编程逻辑器件替代。

而对于传统的模拟控制技术,也被数字控制系统所取代。

数字系统在各个领域显示出了无穷的魅力与优势,如今已经被广泛应用于实际工程中。

本文利用Verilog HDL 语言自顶向下的设计方法设计多功能数字钟, 实现时、分、秒的计时和校时,以及整点报时和闹钟的功能。

突出了其作为硬件描述语言的良好的可读性、可移植性和易理解等优点, 并通过ModelSim SE 6.5 完成综合、仿真。

通过Verilog HDL语言完成数字钟的层次化设计。

关键词:数字电子时钟,有限状态机,功能仿真AbstractAs the microelectronics, computer technology, semiconductor technology, many traditional design of digital gate programmable logic device has been replaced. As for the traditional analog control, digital control systems have also been replaced. Digital systems in various fields has shown infinite charm and advantages, and now has been widely used in practical projects. In this paper, Verilog HDL, the design of top-down multi-functional digital clock designed to achieve the hours, minutes, seconds, time and school, as well as the whole point timekeeping and alarm functions. Highlighted as a hardware description language, good readability, portability and ease of understanding, etc., and through the ModelSim SE 6.5 complete the comprehensive, simulation. Completed by Verilog HDL, the level of the digital clock design.Key words: Digital electronic clock, finite state machine, functional simulation.目录第1章绪论 (1)1.1时钟的发展简史 (1)1.2设计目的 (1)1.3Verilog HDL硬件描述语言 (2)1.4Modelsim仿真工具 (5)第2章数字电路设计方法 (7)2.1数字系统设计简介 (7)2.2有限状态机 (9)第3章数字钟的层次化设计 (13)3.1功能要求 (13)3.2数字钟系统的工作原理 (13)3.3 模块的设计 (13)3.4程序设计 (14)第4章功能仿真 (19)4.1 仿真前准备 (19)4.2 功能仿真 (20)第5章总结 (23)参考文献 (26)第1章绪论1.1时钟的发展简史设计目的公元1300年以前,人类主要是利用天文现象和流动物质的连续运动来计时。

基于VHDL的多功能数字闹钟设计

基于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的数字时钟课程设计

数字时钟设计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语言设计闹钟系统

用VHDL语言设计闹钟系统

用VHDL语言设计闹钟系统(本实验用MAXPLUS2软件和GW48实验箱)--key1输入作为计数器的触发信号用来选择数码管LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY key1_trans_hjc ISPORT (CLR_HJC: IN STD_LOGIC;KEY1_HJC: IN STD_LOGIC;Q_HJC : BUFFER STD_LOGIC_VECTOR(2 DOWNTO 0)); END ENTITY key1_trans_hjc IS;ARCHITECTURE HJC OF key1_trans_hjc ISBEGINPROCESS(CLR_HJC,KEY1_HJC) ISBEGINIF(CLR_HJC='1')THENQ_HJC<="000";ELSIF(KEY1_HJC='1' AND KEY1_HJC'EVENT )THENIF(Q_HJC="100")THENQ_HJC<="001";ELSEQ_HJC<=Q_HJC+"001";END IF;END IF;END PROCESS ;END ARCHITECTURE HJC;--key2用来设定由key1选中的数码管的值LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY KEY2_TRANS_HJC ISPORT (CLR_HJC: IN STD_LOGIC;KEY2_HJC: IN STD_LOGIC;Q2_HJC : BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0)); END ENTITY KEY2_TRANS_HJC;ARCHITECTURE ART OF KEY2_TRANS_HJC ISBEGINPROCESS(CLR_HJC,KEY2_HJC) ISBEGINIF(CLR_HJC='1')THENQ2_HJC<="0000";ELSIF(KEY2_HJC='1' AND KEY2_HJC'EVENT )THENIF(Q2_HJC="1001")THENQ2_HJC<="0000";ELSEQ2_HJC<=Q2_HJC+"0001";END IF;END IF;END PROCESS ;END ARCHITECTURE ART;--keybuffer_hjc实现选择数码管并赋值,LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY KEYBUFFER_HJC ISPORT (KEY1_CTRL_HJC: IN STD_LOGIC_VECTOR(2 DOWNTO 0);KEY2_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);CLK_HJC: IN STD_LOGIC;CLR_HJC: IN STD_LOGIC;NEW_TIME_0_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_TIME_1_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_TIME_2_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_TIME_3_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END ENTITY KEYBUFFER_HJC ;ARCHITECTURE HJC OF KEYBUFFER_HJC ISSIGNAL N_T_0: STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL N_T_1: STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL N_T_2: STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL N_T_3: STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(CLR_HJC,CLK_HJC)ISBEGINIF (CLR_HJC= '1')THENN_T_0 <= "0000";N_T_1 <= "0000";N_T_2 <= "0000";N_T_3 <= "0000";ELSIF(CLK_HJC='1' AND CLK_HJC'EVENT)THENCASE KEY1_CTRL_HJC ISWHEN "001" =>N_T_0 <= KEY2_HJC;WHEN "010" =>N_T_1 <= KEY2_HJC;WHEN "011" =>N_T_2 <= KEY2_HJC;WHEN "100" =>N_T_3 <= KEY2_HJC;WHEN OTHERS =>NULL;END CASE;END IF;END PROCESS ;NEW_TIME_0_HJC <= N_T_0;NEW_TIME_1_HJC <= N_T_1;NEW_TIME_2_HJC <= N_T_2;NEW_TIME_3_HJC <= N_T_3; END ARCHITECTURE HJC;--时钟256HZ,通过分频器FQ1_HJC产生1HZ用来驱动LED,以1HZ闪烁LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY FQ1_HJC ISPORT (CLK_IN_HJC: IN STD_LOGIC;CLR_HJC: IN STD_LOGIC;CLK_OUT1_HJC: OUT STD_LOGIC);END ENTITY FQ1_HJC ;ARCHITECTURE HJC OF FQ1_HJC ISBEGINCLK1S: PROCESS(CLK_IN_HJC, CLR_HJC)ISSUBTYPE T_SHORT IS INTEGER RANGE 0 TO 65535;V ARIABLE CNT1: T_SHORT;BEGINIF (CLR_HJC= '1')THENCNT1:= 0;CLK_OUT1_HJC <= '0';ELSIF (RISING_EDGE(CLK_IN_HJC))THENIF (CNT1 < 128)THENCLK_OUT1_HJC <= '1';CNT1:= CNT1+1;ELSIF (CNT1< 256)THENCLK_OUT1_HJC <= '0';CNT1:= CNT1+1;ELSECNT1:= 0;END IF;END IF;END PROCESS CLK1S;END ARCHITECTURE HJC;--时钟256HZ,通过分频器FQ_HJC产生1/60HZ用来驱动计数器LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY FQ_HJC ISPORT (CLK_IN_HJC: IN STD_LOGIC;CLR_HJC: IN STD_LOGIC;CLK_OUT_HJC: OUT STD_LOGIC);END ENTITY FQ_HJC ;ARCHITECTURE HJC OF FQ_HJC ISBEGINCLK1F: PROCESS(CLK_IN_HJC, CLR_HJC)IS SUBTYPE T_SHORT IS INTEGER RANGE 0 TO 65535;V ARIABLE CNT: T_SHORT;BEGINIF (CLR_HJC= '1')THENCNT:= 0;CLK_OUT_HJC <= '0';ELSIF (RISING_EDGE(CLK_IN_HJC))THENIF (CNT < 7680)THENCLK_OUT_HJC <= '1';CNT:= CNT+1;ELSIF (CNT< 15360)THENCLK_OUT_HJC <= '0';CNT:= CNT+1;ELSECNT:= 0;END IF;END IF;END PROCESS CLK1F ;END ARCHITECTURE HJC;--技术模块,没有新时间时,以24制时钟规律在计数,最小单位1分钟,有新时间时改变系统时间LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY COUNTER_HJC ISPORT (NEW_CURRENT_TIME_0_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_CURRENT_TIME_1_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_CURRENT_TIME_2_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_CURRENT_TIME_3_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);LOAD_NEW_C_HJC: IN STD_LOGIC;CLK_HJC: IN STD_LOGIC;CLR_HJC: IN STD_LOGIC;CURRENT_TIME_0_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CURRENT_TIME_1_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CURRENT_TIME_2_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CURRENT_TIME_3_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END ENTITY COUNTER_HJC ;ARCHITECTURE HJC OF COUNTER_HJC ISSIGNAL I_CURRENT_TIME_0: STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL I_CURRENT_TIME_1: STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL I_CURRENT_TIME_2: STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL I_CURRENT_TIME_3: STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS (CLK_HJC, CLR_HJC, LOAD_NEW_C_HJC)ISBEGINIF (CLR_HJC = '1') THENI_CURRENT_TIME_0 <= "0000";I_CURRENT_TIME_1 <= "0000";I_CURRENT_TIME_2 <= "0000";I_CURRENT_TIME_3 <= "0000";ELSIF (LOAD_NEW_C_HJC = '1') THENI_CURRENT_TIME_0 <= NEW_CURRENT_TIME_0_HJC;I_CURRENT_TIME_1 <= NEW_CURRENT_TIME_1_HJC;I_CURRENT_TIME_2 <= NEW_CURRENT_TIME_2_HJC;I_CURRENT_TIME_3 <= NEW_CURRENT_TIME_3_HJC;ELSIF (RISING_EDGE(CLK_HJC))THENIF (I_CURRENT_TIME_0 < "1001") THEN --分低位<9I_CURRENT_TIME_0 <= I_CURRENT_TIME_0 +"0001";ELSEI_CURRENT_TIME_0 <= "0000";IF (I_CURRENT_TIME_1 <"0101")THEN --分高位<5I_CURRENT_TIME_1 <= I_CURRENT_TIME_1 +"0001";ELSEI_CURRENT_TIME_1 <= "0000";IF (I_CURRENT_TIME_3<"0010")THEN --时高位为0或1时IF (I_CURRENT_TIME_2<"1001")THEN --时低位<9I_CURRENT_TIME_2 <= I_CURRENT_TIME_2 +"0001";ELSEI_CURRENT_TIME_2 <= "0000";I_CURRENT_TIME_3 <= I_CURRENT_TIME_3 +"0001";END IF;ELSEIF (I_CURRENT_TIME_2<"0011")THEN --时高位为2时,时低位<3I_CURRENT_TIME_2 <= I_CURRENT_TIME_2 +1;ELSEI_CURRENT_TIME_2 <= "0000";I_CURRENT_TIME_3 <= "0000";END IF;END IF;END IF;END IF;END IF;END PROCESS;CURRENT_TIME_0_HJC <= I_CURRENT_TIME_0; CURRENT_TIME_1_HJC<= I_CURRENT_TIME_1; CURRENT_TIME_2_HJC <= I_CURRENT_TIME_2; CURRENT_TIME_3_HJC <= I_CURRENT_TIME_3; END ARCHITECTURE HJC;--控制器,本系统有五个状态,S0-初始状态,S1-设置新时间状态S2-确认为时钟时间状态,S3-确认为闹钟时间状态S4-显示闹钟时间状态,控制器就是控制状态转换的LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CONTROLLER_HJC ISPORT (KEY1_HJC : IN STD_LOGIC;ALARM_BUTTON_HJC : IN STD_LOGIC;TIME_BUTTON_HJC : IN STD_LOGIC;CLK_HJC : IN STD_LOGIC;CLR_HJC : IN STD_LOGIC;LOAD_NEW_A_HJC : OUT STD_LOGIC;LOAD_NEW_C_HJC : OUT STD_LOGIC;SHOW_NEW_TIME_HJC : OUT STD_LOGIC;SHOW_A_HJC : OUT STD_LOGIC);END ENTITY CONTROLLER_HJC ISARCHITECTURE HJC OF CONTROLLER_HJC ISTYPE T_STATE IS(S0, S1, S2, S3, S4);SUBTYPE T_SHORT IS INTEGER RANGE 0 TO 65535;CONSTANT KEY_TIMEOUT : T_SHORT :=2560; --从按键状态返回时等待10S CONSTANT SHOW_ALARM_TIMEOUT : T_SHORT :=1280; --从闹钟时间返回时等待5S SIGNAL CURR_STATE : T_STATE;SIGNAL NEXT_STATE : T_STATE;SIGNAL COUNTER_K : T_SHORT;SIGNAL ENABLE_COUNT_K : STD_LOGIC;SIGNAL COUNT_K_END : STD_LOGIC;SIGNAL COUNTER_A : T_SHORT;SIGNAL ENABLE_COUNT_A: STD_LOGIC;SIGNAL COUNT_A_END : STD_LOGIC;BEGINPROCESS(CLK_HJC, CLR_HJC) ISBEGINIF (CLR_HJC = '1') THENCURR_STATE <= S0;ELSE IF (RISING_EDGE(CLK_HJC)) THENCURR_STATE <= NEXT_STATE;END IF;END IF;END PROCESS;PROCESS (KEY1_HJC, ALARM_BUTTON_HJC, TIME_BUTTON_HJC, CURR_STATE, COUNT_A_END, COUNT_K_END) ISBEGINNEXT_STATE <= CURR_STATE;LOAD_NEW_A_HJC <= '0';LOAD_NEW_C_HJC <= '0';SHOW_A_HJC <= '0';SHOW_NEW_TIME_HJC <= '0';ENABLE_COUNT_K <= '0';ENABLE_COUNT_A <= '0';CASE CURR_STATE ISWHEN S0 =>IF (KEY1_HJC = '1') THENNEXT_STATE <= S1;SHOW_NEW_TIME_HJC <= '1';ELSIF (ALARM_BUTTON_HJC = '1')THEN NEXT_STATE <= S4;SHOW_A_HJC <= '1';ELSENEXT_STATE <= S0;END IF;WHEN S1 =>IF (KEY1_HJC = '1')THENNEXT_STATE <= S1;ELSIF (ALARM_BUTTON_HJC ='1')THENNEXT_STATE <= S2;LOAD_NEW_A_HJC <= '1';ELSIF (TIME_BUTTON_HJC = '1')THENNEXT_STATE <= S3;LOAD_NEW_C_HJC <= '1';ELSEIF(COUNT_K_END = '1')THENNEXT_STATE <= S0;ELSENEXT_STATE <= S1;END IF;ENABLE_COUNT_K <= '1';END IF;SHOW_NEW_TIME_HJC <= '1'; WHEN S2 =>IF (ALARM_BUTTON_HJC = '1')THENNEXT_STATE <= S2;LOAD_NEW_A_HJC <= '1';ELSENEXT_STATE <= S0;END IF;WHEN S3 =>IF (TIME_BUTTON_HJC = '1')THENNEXT_STATE <= S3;LOAD_NEW_C_HJC <= '1';ELSENEXT_STATE <= S0;END IF;WHEN S4 =>IF (KEY1_HJC = '1')THENNEXT_STATE <= S1;ELSENEXT_STATE <= S4;IF(COUNT_A_END = '1')THENNEXT_STATE <= S0;ELSENEXT_STATE <= S4;SHOW_A_HJC <= '1';END IF;ENABLE_COUNT_A <= '1';END IF;WHEN OTHERS =>NULL;END CASE;END PROCESS;COUNT_KEY : PROCESS(ENABLE_COUNT_K, CLK_HJC)IS BEGINIF (ENABLE_COUNT_K = '0')THENCOUNTER_K <= 0;COUNT_K_END <= '0';ELSIF (RISING_EDGE(CLK_HJC))THENIF (COUNTER_K >= KEY_TIMEOUT)THENCOUNT_K_END <= '1';ELSECOUNTER_K <= COUNTER_K + 1;END IF;END IF;END PROCESS COUNT_KEY;COUNT_ALARM : PROCESS(ENABLE_COUNT_A, CLK_HJC)IS BEGINIF (ENABLE_COUNT_A = '0')THENCOUNTER_A <= 0;COUNT_A_END <= '0';ELSIF (RISING_EDGE(CLK_HJC))THENIF (COUNTER_A >= SHOW_ALARM_TIMEOUT)THENCOUNT_A_END <= '1';ELSECOUNTER_A <= COUNTER_A + 1;END IF;END IF;END PROCESS COUNT_ALARM;END ARCHITECTURE ;--显示驱动模块,是显示新时间还是闹钟时间,还是时钟时间LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DISPLAYDRIVER_HJC ISPORT(ALARM_TIME_0_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);ALARM_TIME_1_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);ALARM_TIME_2_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);ALARM_TIME_3_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);CURRENT_TIME_0_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);CURRENT_TIME_1_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);CURRENT_TIME_2_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);CURRENT_TIME_3_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_TIME_0_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_TIME_1_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_TIME_2_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_TIME_3_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);SHOW_NEW_TIME_HJC: IN STD_LOGIC;SHOW_A_HJC: IN STD_LOGIC;SOUND_ALARM_HJC: OUT STD_LOGIC;DISPLAY_0_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);DISPLAY_1_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);DISPLAY_2_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);DISPLAY_3_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END ENTITY DISPLAYDRIVER_HJC;ARCHITECTURE HJC OF DISPLAYDRIVER_HJC ISSIGNAL DISPLAY_TIME_0: STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL DISPLAY_TIME_1: STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL DISPLAY_TIME_2: STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL DISPLAY_TIME_3: STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINCTRL:PROCESS(ALARM_TIME_0_HJC,ALARM_TIME_1_HJC,ALARM_TIME_2_HJC,ALARM_T IME_3_HJC,CURRENT_TIME_0_HJC,CURRENT_TIME_1_HJC,CURRENT_TIME_2_HJC,CURRENT_T IME_3_HJC,NEW_TIME_0_HJC,NEW_TIME_1_HJC,NEW_TIME_2_HJC,NEW_TIME_3_HJC,SHOW_A_HJC,SHOW_NEW_TIME_HJC)ISBEGINIF NOT (ALARM_TIME_0_HJC = CURRENT_TIME_0_HJC AND ALARM_TIME_1_HJC = CURRENT_TIME_1_HJC ANDALARM_TIME_2_HJC = CURRENT_TIME_2_HJC AND ALARM_TIME_3_HJC = CURRENT_TIME_3_HJC)THENSOUND_ALARM_HJC <= '0';ELSESOUND_ALARM_HJC <= '1';END IF;IF (SHOW_NEW_TIME_HJC = '1')THENDISPLAY_TIME_0 <= NEW_TIME_0_HJC;DISPLAY_TIME_1 <= NEW_TIME_1_HJC;DISPLAY_TIME_2 <= NEW_TIME_2_HJC;DISPLAY_TIME_3 <= NEW_TIME_3_HJC;ELSIF (SHOW_A_HJC= '1')THENDISPLAY_TIME_0 <= ALARM_TIME_0_HJC;DISPLAY_TIME_1 <= ALARM_TIME_1_HJC;DISPLAY_TIME_2 <= ALARM_TIME_2_HJC;DISPLAY_TIME_3 <= ALARM_TIME_3_HJC;ELSIF (SHOW_A_HJC = '0')THENDISPLAY_TIME_0 <= CURRENT_TIME_0_HJC;DISPLAY_TIME_1 <= CURRENT_TIME_1_HJC;DISPLAY_TIME_2 <= CURRENT_TIME_2_HJC;DISPLAY_TIME_3 <= CURRENT_TIME_3_HJC;ELSEASSERT FALSE REPORT "UNCERTAIN DISPLAY_DRIVER CONTROL!"SEVERITY W ARNING;END IF;END PROCESS CTRL;DISP: PROCESS(DISPLAY_TIME_0,DISPLAY_TIME_1,DISPLAY_TIME_2,DISPLAY_TIME_3)ISBEGINDISPLAY_0_HJC <= DISPLAY_TIME_0;DISPLAY_1_HJC <= DISPLAY_TIME_1;DISPLAY_2_HJC <= DISPLAY_TIME_2;DISPLAY_3_HJC <= DISPLAY_TIME_3;END PROCESS DISP;END ARCHITECTURE;--GW48实验箱扬声器是脉冲驱动,在显示驱动模块产生高电平后与系统时钟相与得脉冲信号LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY YU_HJC ISPORT(ASOUNDIN_HJC :IN STD_LOGIC;CLK_HJC:IN STD_LOGIC;ASOUNDOUT_HJC:OUT STD_LOGIC);END ENTITY YU_HJC;ARCHITECTURE HJC OF YU_HJC ISBEGINASOUNDOUT_HJC<= ASOUNDIN_HJC AND CLK_HJC;END ARCHITECTURE;--设置新闹钟时间LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ALARMREG_HJC ISPORT(NEW_ALARM_TIME_0_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_ALARM_TIME_1_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_ALARM_TIME_2_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_ALARM_TIME_3_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);LOAD_NEW_A_HJC: IN STD_LOGIC;CLK_HJC: IN STD_LOGIC;CLR_HJC: IN STD_LOGIC;ALARM_TIME_0_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);ALARM_TIME_1_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);ALARM_TIME_2_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);ALARM_TIME_3_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0));END ENTITY ALARMREG_HJC ;ARCHITECTURE HJC OF ALARMREG_HJC ISBEGINPROCESS(CLK_HJC, CLR_HJC)ISBEGINIF (CLR_HJC= '1')THENALARM_TIME_0_HJC <= "0000";ALARM_TIME_1_HJC<= "0000";ALARM_TIME_2_HJC<= "0000";ALARM_TIME_3_HJC <= "0000";ELSEIF(RISING_EDGE(CLK_HJC))THENIF (LOAD_NEW_A_HJC = '1')THENALARM_TIME_0_HJC <= NEW_ALARM_TIME_0_HJC;ALARM_TIME_1_HJC <= NEW_ALARM_TIME_1_HJC;ALARM_TIME_2_HJC <= NEW_ALARM_TIME_2_HJC;ALARM_TIME_3_HJC <= NEW_ALARM_TIME_3_HJC;ELSIF (LOAD_NEW_A_HJC /= '0')THENASSERT FALSE REPORT "UNCERTAIN LOAD_NEW_ALARM CONTROL!"SEVERITY WARNING;END IF;END IF;END IF;END PROCESS;END ARCHITECTURE HJC;--顶层文件LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ALARM_HJC ISPORT (KEY1_HJC: IN STD_LOGIC;KEY2_HJC: IN STD_LOGIC;ALARM_BUTTON_HJC: IN STD_LOGIC;TIME_BUTTON_HJC: IN STD_LOGIC;CLK_HJC: IN STD_LOGIC;CLK1_HJC: OUT STD_LOGIC;CLR_HJC: IN STD_LOGIC;DISPLAY_0_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);DISPLAY_1_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);DISPLAY_2_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);DISPLAY_3_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);SOUND_ALARM1_HJC: OUT STD_LOGIC);END ENTITY ALARM_HJC ;ARCHITECTURE HJC OF ALARM_HJC ISCOMPONENT KEY1_TRANS_HJC ISPORT (CLR_HJC: IN STD_LOGIC;KEY1_HJC: IN STD_LOGIC;Q_HJC : BUFFER STD_LOGIC_VECTOR(2 DOWNTO 0));END COMPONENT ;COMPONENT KEY2_TRANS_HJC ISPORT (CLR_HJC: IN STD_LOGIC;KEY2_HJC: IN STD_LOGIC;Q2_HJC : BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0)); END COMPONENT;COMPONENT KEYBUFFER_HJC ISPORT (KEY1_CTRL_HJC: IN STD_LOGIC_VECTOR(2 DOWNTO 0);KEY2_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);CLK_HJC: IN STD_LOGIC;CLR_HJC: IN STD_LOGIC;NEW_TIME_0_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_TIME_1_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_TIME_2_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_TIME_3_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END COMPONENT ;COMPONENT CONTROLLER_HJC ISPORT (KEY1_HJC : IN STD_LOGIC;ALARM_BUTTON_HJC : IN STD_LOGIC;TIME_BUTTON_HJC : IN STD_LOGIC;CLK_HJC : IN STD_LOGIC;CLR_HJC : IN STD_LOGIC;LOAD_NEW_A_HJC : OUT STD_LOGIC;LOAD_NEW_C_HJC : OUT STD_LOGIC;SHOW_NEW_TIME_HJC : OUT STD_LOGIC;SHOW_A_HJC : OUT STD_LOGIC);END COMPONENT ;COMPONENT ALARMREG_HJC ISPORT(NEW_ALARM_TIME_0_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_ALARM_TIME_1_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_ALARM_TIME_2_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_ALARM_TIME_3_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);LOAD_NEW_A_HJC: IN STD_LOGIC;CLK_HJC: IN STD_LOGIC;CLR_HJC: IN STD_LOGIC;ALARM_TIME_0_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);ALARM_TIME_1_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);ALARM_TIME_2_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);ALARM_TIME_3_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END COMPONENT ;COMPONENT COUNTER_HJC ISPORT (NEW_CURRENT_TIME_0_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_CURRENT_TIME_1_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_CURRENT_TIME_2_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_CURRENT_TIME_3_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);LOAD_NEW_C_HJC: IN STD_LOGIC;CLK_HJC: IN STD_LOGIC;CLR_HJC: IN STD_LOGIC;CURRENT_TIME_0_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CURRENT_TIME_1_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CURRENT_TIME_2_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);CURRENT_TIME_3_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END COMPONENT ;COMPONENT DISPLAYDRIVER_HJC ISPORT(ALARM_TIME_0_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);ALARM_TIME_1_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);ALARM_TIME_2_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);ALARM_TIME_3_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);CURRENT_TIME_0_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);CURRENT_TIME_1_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);CURRENT_TIME_2_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);CURRENT_TIME_3_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_TIME_0_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_TIME_1_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_TIME_2_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);NEW_TIME_3_HJC: IN STD_LOGIC_VECTOR(3 DOWNTO 0);SHOW_NEW_TIME_HJC: IN STD_LOGIC;SHOW_A_HJC: IN STD_LOGIC;SOUND_ALARM_HJC: OUT STD_LOGIC;DISPLAY_0_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);DISPLAY_1_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);DISPLAY_2_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);DISPLAY_3_HJC: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); END COMPONENT ;COMPONENT FQ_HJC ISPORT (CLK_IN_HJC: IN STD_LOGIC;CLR_HJC: IN STD_LOGIC;CLK_OUT_HJC: OUT STD_LOGIC);END COMPONENT ;COMPONENT YU_HJC ISPORT(ASOUNDIN_HJC :IN STD_LOGIC;CLK_HJC:IN STD_LOGIC;ASOUNDOUT_HJC:OUT STD_LOGIC);END COMPONENT;COMPONENT FQ1_HJC ISPORT (CLK_IN_HJC: IN STD_LOGIC;CLR_HJC: IN STD_LOGIC;CLK_OUT1_HJC: OUT STD_LOGIC);END COMPONENT;SIGNAL S0: STD_LOGIC_VECTOR(2 DOWNTO 0);SIGNAL S1,S60,S61,S62,S63,S70,S71,S72,S73,S80,S81,S82,S83: STD_LOGIC_VECTOR(3 DOWNTO 0);SIGNAL S2,S3,S4,S5,S9,S10: STD_LOGIC;BEGINU1: KEY1_TRANS_HJC PORT MAP(CLR_HJC,KEY1_HJC,S0);U2: KEY2_TRANS_HJC PORT MAP(CLR_HJC,KEY2_HJC,S1);U3: KEYBUFFER_HJC PORT MAP(S0,S1,CLK_HJC,CLR_HJC,S60,S61,S62,S63);U4: CONTROLLER_HJC PORT MAP(KEY1_HJC,ALARM_BUTTON_HJC,TIME_BUTTON_HJC,CLK_HJC,CLR_HJC,S9,S2,S3,S4);U5: COUNTER_HJC PORT MAP(S60,S61,S62,S63,S2,S5,CLR_HJC,S80,S81,S82,S83);U6: ALARMREG_HJC PORT MAP(S60,S61,S62,S63,S9,CLK_HJC,CLR_HJC,S70,S71,S72,S73); U7: DISPLAYDRIVER_HJC PORT MAP(S70,S71,S72,S73,S80,S81,S82,S83,S60,S61,S62,S63,S3,S4,S10,DISPLAY_0_HJC,DISPLAY_1_HJC,DISPLAY_2_HJC,DISPLAY_3_HJC); U8: YU_HJC PORT MAP(S10,CLK_HJC,SOUND_ALARM1_HJC);U9: FQ_HJC PORT MAP(CLK_HJC ,CLR_HJC,S5);U10: FQ1_HJC PORT MAP(CLK_HJC ,CLR_HJC,CLK1_HJC);END ARCHITECTURE HJC;。

基于VHDL的数字电子钟系统设计

基于VHDL的数字电子钟系统设计

基于VHDL的数字电子钟系统设计数字电子钟是一种用数字电路实现的时钟系统,在现代社会逐渐普及。

在这篇文档中,我们将会讨论使用VHDL(可编程硬件描述语言) 设计数字电子钟系统的过程及其原理。

第一步是需求分析。

我们需要决定所设计的数字电子钟系统需要具备哪些功能,例如显示小时、分钟、秒数、日期、星期、闹钟等功能。

同时,还需考虑设计的电子钟具备哪些功能是其他电子钟所没有的,以增强该款电子钟的市场竞争力。

第二步是架构设计。

经过需求分析后,我们需要设计电子钟系统所需的硬件结构。

常见的电子钟由振荡器、时钟、存储器、显示器和控制接口组成。

其中,振荡器用来处理系统时基;时钟用来计时,提供系统时间;存储器负责存储显示数据和助记代码;显示器用来显示时间和日期;而控制接口则提供交互方式,如按键、通讯口等。

第三步是模块设计。

使用VHDL 可以将架构设计分解成更小的模块,进行编写和测试。

这些模块可以包括时钟模块、计数器模块、闹钟模块、数据显示模块等。

其中,时钟模块需要使用振荡器生成时钟信号,计数器模块必须进行计时,生成秒数和毫秒数的输出信号;然后,使用数码管显示模块将这些输出信号转换成可读的时间、日期和闹钟信息;再添加按键输入模块,以便用户操作和控制该电子钟系统。

第四步是系统测试。

在VHDL 设计结束后,需要对数字电子钟系统进行实际测试。

首先,系统测试需要用到仿真软件对整个系统进行验证。

同时,需要将程序下载到FPGA 芯片上,并通过硬件测试验证设计的电子钟系统是否符合需求和规范。

综上所述,设计数字电子钟系统需要遵循一定的流程,包括需求分析、架构设计和模块设计,在这个过程中也需要注重各个模块之间的兼容性和整体性。

这篇文档给大家介绍了使用VHDL 搭建数字电子钟系统的方法,希望广大读者可以从中获得借鉴。

VHDL设计的12进制可调时钟带闹铃功能

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的电子闹钟设计

基于vhdl的电子闹钟设计

基于vhdl的电子闹钟设计基于VHDL的电子闹钟设计电子闹钟是我们日常生活中常用的物品之一,在我们每天的生活中起着非常重要的作用。

现在,大量人们自己亲手打造自己的电子闹钟,这已经成为一种流行的风潮。

其中一种制作闹钟的方法就是使用VHDL语言进行设计,在这里我们将介绍基于VHDL的电子闹钟的设计。

VHDL的定义VHDL是“可综合的硬件描述语言”的缩写,其对于电子器件的设计和工程制造具有极大的重要性。

VHDL可以直接描述数字电路,然后通过其编译器和模拟器生成对应的硬件电路。

它是在20世纪80年代产生的,在当时风靡一时,并且现在仍然是电路仿真和设计过程中的重要工具。

闹钟设计一块基于FPGA开发板上的闹钟的设计步骤从以下几个方面进行:模块划分根据闹钟的功能划分模块,这些模块可以包括:时钟模块(时钟、分钟、秒钟、时令),轮询模块(轮询时钟模块,测量按键状态),SDRAM芯片(用来存储当前时间和闹钟时间),闹铃模块(识别达到设定时间的闹钟)。

时钟模块时钟模块是一个非常重要的模块。

时钟的频率由外部电源提供,频率通常为50Hz,可以通过PLL进行锁相放大处理来获取1秒的时钟信号。

时钟信号用于计算当前时间和闹钟时间。

模块中还必须包括一个开关,在程序中用来控制时钟的启停,以及计时和控制亮度的显示屏。

轮询模块轮询模块用来轮询时钟模块和按键状态。

通过轮询时钟模块,我们可以获取当前时间,并存储在SDRAM芯片中。

同时,我们也可以通过轮询按键状态来检测用户是否更改了设置,如设定时间、闹钟时间和亮度等。

SDRAMSDRAM芯片的作用是用来存储当前时间和闹钟时间。

需要的RAM空间相当小,只需要一些字节就足够了。

因此,常用的8位RAM芯片足以实现此目的。

闹铃模块闹铃模块用于识别设定时间是否和当前时间相同,并在正确的时间触发闹钟响铃。

当闹钟时间到来时,闹铃模块会向用户发出闹钟信号,通过控制LED灯来让用户知道是闹钟响了。

要注意的是,该模块必须在程序运行时轮询保持警醒状态。

基于VHDL的数字闹钟设计

基于VHDL的数字闹钟设计

摘要摘要随着EDA技术的发展和应用领域的扩大与深入,EDA技术在电子信息、通信、自动控制及计算机应用领域的重要性日益突出。

EDA技术就是依赖功能强大的计算机,在EDA工具软件平台上,对以硬件描述语言VHDL为系统逻辑描述手段完成的设计文件,自动地完成逻辑优化和仿真测试,直至实现既定的电子线路系统功能。

本文介绍了基于VHDL硬件描述语言设计的多功能数字闹钟的思路和技巧。

在Quartus 11开发环境中编译和仿真了所设计的程序,并逐一调试验证程序的运行状况。

仿真和验证的结果表明,该设计方法切实可行,该数字闹钟可以实现调时定时闹钟播放音乐功能具有一定的实际应用性。

关键词:闹钟 FPGA VHDL目录目录摘要............................................................................................................................. I 目录.......................................................................................................................... III 第一章选题背景.. (1)1.1选题研究内容 (1)1.2课题研究功能 (1)1.3课题相关技术应用 (1)第二章FPGA 简介 (3)2.1FPGA概述 (3)2.1.1 FPGA基本结构 (3)2.2FPGA编程原理 (3)2.3FPGA设计流程 (4)第三章数字闹钟整体方案设计 (7)3.1数字闹钟整体设计 (7)3.1.1数字闹钟各部分作用 (7)3.2数字钟的工作原理 (7)第四章模块电路设计 (9)4.1模块电路图设计 (9)4.2各模块电路设计 (9)第五章实验结果 (16)5.1实验概述 (16)5.2实验仿真结果 (16)第六章总结与展望 (18)研究结论 (18)研究展望 (18)致谢 (20)参考文献 (22)附录1 部分模块代码 (24)附录2 动态扫描模块程序 (33)目录第一章选题背景第一章选题背景1.1选题研究内容设计一个24小时的闹钟,该闹钟由显示屏、数字键、TIME键、ALARM键、扬声器组成。

基于VHDL的多功能数字钟设计

基于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的电子时钟设计

基于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;---------------------------------------------------计数进程,其进程逻辑上受分频输出与进位控制,当分频输出变化(即每秒),秒个位自加,当满足进位条件时,调用进位规则,进行时间的跳转。

(电子行业企业管理)基于VHDL的数字电子钟系统设计

(电子行业企业管理)基于VHDL的数字电子钟系统设计

(电子行业企业管理)基于VHDL的数字电子钟系统设计集成电路软件设计基于VHDL的数字电子钟系统设计学院信息工程学院班级电科1112姓名闭应明学号2011850057 成绩指导老师卫雅芬2013 年12 月10 日目录一、摘要 (1)二、关键词 (1)三、引言 (1)四、设计要求 (1)五、技术指标 (1)六、设计思想 (1)七、设计原理 (2)八、设计方案 (2)九、设计各个模块的功能 (3)十、各个模块的波形仿真结果 (1)十一、各个电路模块的DV综合的网标和电路模型 (12)十二、设计结果分析 (19)十三、论文结论 (20)十四、参考文献 (20)十五、附录 (21)十六、致谢 (50)一、摘要:本设计采用层次化设计方法,自顶向下进行设计。

设计中根据系统的功能要求合理划分出层次,进行分级设计和仿真验证,将较为复杂的数字系统逻辑简化为基本的模型从而降低实现的难度。

突出了其作为硬件描述语言的良好的可读性、可移植性和易理解等优点,并通过ModelSim SE 6.1完成综合、仿真。

二、关键词:Modelsim VHDL 硬件描述语言设计数字钟三、引言:硬件描述语言HDL(Hardware Description Language)是一种用形式化方法来描述数字电路和系统的语言。

目前.电子系统向集成化、大规模和高速度等方向发展,以硬件描述语言和逻辑综合为基础的自顶向下的电路设计方法在业界得到迅猛发展,VHDL在这种形势下显示出了巨大的优势,展望将来VHDL在硬件设计领域的地位将与c语言和c++在软件设计领域的地位一样,在大规模数字系统的设计中,它将逐步取代传统的逻辑状态表和逻辑电路图等硬件描述方法,而成为主要的硬件描述工具。

本文提出了以VHDL语言为手段,设计了多功能数字钟。

其代码具有良好的可读性和易理解性,源程序经Altera公司的ModelSimSE 6.1软件完成综合、仿真,四、设计要求:1、采用自顶向下的设计思想;2、使用本学期学习的设计语言VHDL和集成电路设计软件实现;3、最终以论文形式提交。

基于VHDL的多功能数字钟设计报告

基于VHDL的多功能数字钟设计报告

基于VHDL的多功能数字钟设计报告021215班卫时章02121451一、设计要求1、具有以二十四小时制计时、显示、整点报时、时间设置和闹钟的功能。

2、设计精度要求为1秒。

二、设计环境:Quartus II三、系统功能描述1、系统输入:时钟信号clk采用50MHz;系统状态及较时、定时转换的控制信号为k、set,校时复位信号为reset,均由按键信号产生。

2、系统输出:LED显示输出;蜂鸣器声音信号输出。

3、多功能数字电子钟系统功能的具体描述如下:(一)计时:正常工作状态下,每日按24h计时制计时并显示,蜂鸣器无声,逢整点报时。

(二)校时:在计时显示状态下,按下“k”键,进入“小时”待校准状态,若此时按下“set”键,小时开始校准;之后按下“k”键则进入“分”待校准状态;继续按下“k”键则进入“秒”待复零状态;再次按下“k”键数码管显示闹钟时间,并进入闹钟“小时”待校准状态;再次按下“k”键则进入闹钟“分”待校准状态;若再按下“k”键恢复到正常计时显示状态。

若校时过程中按下“reset”键,则系统恢复到正常计数状态。

(1)“小时”校准状态:在“小时”校准状态下,显示“小时”的数码管以2Hz闪烁,并按下“set”键时以2Hz的频率递增计数。

(2)“分”校准状态:在“分”校准状态下,显示“分”的数码管以2Hz闪烁,并按下“set”键时以2Hz 的频率递增计数。

(3)“秒”校准状态:在“秒复零”状态下,显示“秒”的数码管以2Hz闪烁,并以1Hz的频率递增计数。

(4)闹钟“小时”校准状态:在闹钟“小时”校准状态下,显示“小时”的数码管以2Hz闪烁,并按下“set”键时以2Hz的频率递增计数。

(5)闹钟“分”校准状态:在闹钟“分”校准状态下,显示“分”的数码管以2Hz闪烁,并按下“set”键时以2Hz的频率递增计数。

(三)整点报时:蜂鸣器在“59”分钟的第“51”、“53”、“55”、“57”秒发频率为500Hz的低音,在“59”分钟的第“59”秒发频率为1000Hz的高音,结束时为整点。

基于vhdl语言的数字钟层次化设计与实现

基于vhdl语言的数字钟层次化设计与实现

基于vhdl语言的数字钟层次化设计与实现数字钟的层次化设计与实现可以使用VHDL语言进行。

以下是一个基于VHDL语言的数字钟的层次化设计与实现的示例:1. 首先,设计时钟模块,用于生成一个时钟信号。

时钟信号将作为整个数字钟系统的时钟源。

```vhdlentity Clock isport (clk_in: in std_logic;clk_out: out std_logic);end entity Clock;architecture Behavioral of Clock isbeginprocess(clk_in) beginif rising_edge(clk_in) thenclk_out <= not clk_out;end if;end process;end architecture Behavioral;```2. 接下来,设计显示驱动模块,用于控制数字钟的显示。

```vhdlentity DisplayDriver isport (clk: in std_logic;reset: in std_logic;display_enable: in std_logic;display_out: out std_logic_vector(6 downto 0) );end entity DisplayDriver;architecture Behavioral of DisplayDriver issignal counter: integer range 0 to 9 := 0; beginprocess(clk, reset) beginif reset = '1' thencounter <= 0;elsif rising_edge(clk) thenif display_enable = '1' thencounter <= (counter + 1) mod 10;end if;end if;end process;process(counter) begincase counter iswhen 0 =>display_out <= "0000001";when 1 =>display_out <= "1001111";when 2 =>display_out <= "0010010";when 3 =>display_out <= "0000110";when 4 =>display_out <= "1001100";when 5 =>display_out <= "0100100";when 6 =>display_out <= "0100000";when 7 =>display_out <= "0001111";when 8 =>display_out <= "0000000";when 9 =>display_out <= "0000100";when others =>display_out <= "------";end case;end process;end architecture Behavioral;```3. 最后,设计顶层模块,用于将时钟信号和显示信号连接起来,并将系统输出连接到硬件设备。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于VHDL的闹钟控制系统
作者:崔秋丽
来源:《中国新技术新产品》2012年第20期
摘要:VHDL语言具有与具体硬件无关和设计平台无关的特性。

本文的闹钟设计与制作是基于VHDL语言,并对系统硬件设计和软件实现进行了详细的描述。

关键词:VHDL语言,数字,闹钟
中图分类号:F324.9 文献标识码:A
1概述
闹钟不仅具有数字钟的功能,还具有定时响铃的功能,是人们不可缺少的日常生活用品之一。

闹钟是一个具有"时"、"分"、"秒"显示的计时装置,其周期为24小时,显示满刻度为23时59分59秒,当计时至满刻度时,系统自动清零,开始新的一天的计时。

除此之外,该系统的时间可以进行调整,当闹钟计数至我们预先设定的时间时,闹钟的铃声响起,以提示人们时间到了。

2系统模块化设计
系统总体可分为五大部分:计数模块、分频模块、闹钟控制模块、数码转换模块以及扫描输出模块,如图1所示。

其中计数模块包括"秒"位计数器(SECOND)、"分"位计数器(MINUTE)、"时"位计数器(HOUR);分频模块包括分频器(F),闹钟控制模块包括闹钟控制器(LINGSHENG);数码转换模块包括时位输出数码转换器(BCD_SHI)、分位输出数码转换器(BCD_FEN)、秒位数码转换器(BCD_MIAO)、七段显示码输出器(SE71)。

闹钟控制系统框图如图1所示。

3源程序代码仿真
(一)、"秒"计数器(SECOUND)
该程序主要是对闹钟跳过的秒数进行计算,clk,ens为输入信号端口,cos,times为输出信号端口。

ens具有清零功能,clk是脉冲信号,每增加一秒times数值就加一,当times为59时cos为1。

"秒"计数器(SECOUND)对应仿真波形图如图2所示。

当clk处于上升沿时,输出端口times会加1。

(二)、"分"计数器(MINUTE)
该模块的功能是实现分的计数,每当秒计数模块的cos为1时,输入端口ena就输入1,输出端口timem就加1,当timem为59时,com为1。

"分"计数器对应仿真波形图如图3所示。

输入端口ena输入1,输出端口timem就加1,当timem为59时,com为1。

(三)"时"计数器(HOUR)
该模块的功能是实现时计数,输入端口com为1时,输出端口timeh就加1,当timeh为23时将恢复0并重新开始计时。

"时"计数器对应仿真波形图如图4所示。

clk_1hz输出用于正常的计数,clk_2输出用于七段显示数码管的动态扫描输出。

(四)分频器(F)
根据外部的输入时钟,将外部时钟分成两路信号,一路clk_1hz输出用于正常的计数,一路clk_2输出用于七段显示数码管的动态扫描输出。

对应仿真波形图如图5所示。

输入端口com为1时,输出端口timeh就加1,当timeh为23时将恢复0并重新开始计时。

(五)闹钟控制器(LINGSHENG)
该模块的功能是当输入端off为1时开启闹铃功能,当时钟的实际时间与设定的时间相等时闹钟铃声响起;当输入端off为0时关闭闹铃功能。

闹钟控制器对应仿真波形图如图6所示。

当输入端off为1时开启闹铃功能,当时钟的实际时间与设定的时间相等时闹钟铃声响起;当输入端off为0时关闭闹铃功能。

(六)时位输出数码转换器(BCD_SHI)
该模块的功能是将输入端口intergh的二十四进制时位计数制在输出端口换为二进制形式。

时位输出数码转换器,仿真波形图如图7所示。

输入端口intergh的二十四进制时位计数制在输出端口换为二进制形式,当intergh为12时转换后的输出为00010010。

(七)分位输出数码转换器(BCD_FEN)
该模块的功能是将输入端口intergm的六十进制分位计数制在输出端口换为二进制形式。

分位输出数码转换器(BCD_FEN)仿真波形如图8所示。

输入端口intergm的六十进制时位计数在输出端口换为二进制形式,当intergm输入为9时转换后的输出为00001001。

(八)秒位数码转换器(BCD_MIAO)程序
该模块的功能是将输入端口intergs的六十进制秒位计数制在输出端口换为二进制形式。

秒位数码转换器(BCD_MIAO)程序如下,仿真波形见图9所示。

输入端口intergs的六十进制时位计数在输出端口换为二进制形式,当intergs输入为15时转换后的输出为00010101。

(九)、七段显示码输出器(SEG71)程序
该模块的功能是将时、分、秒的具体时间通过七段数码显示器显示出来,方便人们的日常使用。

仿真波形如图10所示。

当输入为0000时对应的输出为0111111,将时、分、秒的具体时间通过七段数码显示器显示。

该模块的功能是检查时、分、秒的输出显示功能是否正常。

(十)、顶层文件图形
顶层文件图形如图11所示。

该顶层文件的功能是将各个模块连接在一起,用以实现闹钟的整体功能即闹钟是一个具有"时"、"分"、"秒"显示的计时装置,其周期为24小时,显示满刻度为23时59分59秒,当计时至满刻度时,系统自动清0,开始新的一天的计时。

除此之外,该系统的时间可以进行调整,当闹钟计数至我们预先设定的时间时,闹钟的铃声响起,以提示人们时间到了。

结语
此次设计主要是以闹钟控制系统为目标,利用VHDL语言以及MAX+PLUSⅡ软件,实现其计数、分频、闹钟控制、数码转换以及扫描输出等功能。

参考文献
[1]孙津平.数字电子技术[M].西安:西安电子科技大学出版社.2005
[2]王慧玲.电路基础[M].北京:北京高等教育出版社.2004
[3]王振红.VHDL数字电路设计与应用实践教程[M].北京:北京机械工业出版社.2003
[4]焦素敏.EDA应用技术[M].北京:北京清华大学出版社.2006。

相关文档
最新文档