1、vhdl数字时钟设计数字时钟设计一、题目分析1、功能介绍1) 具有时、分、秒计数显示功能,以 24小时循环计时2) 时钟计数显示时有LED灯的花样显示。3) 具有调节小时、分钟及清零的功能。4) 具有整点报时功能。2、总体方框图3、性能指标及功能设计1)时钟计数:完成时、分、秒的正确计时并且显示所计的数字;对秒、分60进制计数,即从0到59循环计数,时钟一一24进制计数,即从0到23循环计数,并且在数码管上显示数值。2)时间设置:手动调节分钟、小时,可以对所设计的时钟任意调时间,这样 使数字钟真正具有使用功能。我们可以通过实验板上的键 7 和键 4 进行任意 的调整,因为我们用的时钟信号均是1
2、HZ的,所以每LED灯变化一次就来一 个脉冲,即计数一次。3) 清零功能: reset 为复位键,低电平时实现清零功能,高电平时正常计数。 可以根据我们自己任意时间的复位。4) 蜂鸣器在整点时有报时信号产生,蜂鸣器报警。产生“滴答 .滴答”的报警声 音。5) LED灯在时钟显示时有花样显示信号产生。即根据进位情况, LED不停的 闪烁,从而产生“花样”信号。二、选择方案1、方案选择方案一:根据总体方框图及各部分分配的功能可知, 本系统可以由秒计数器、 分钟计数器、小时计数器、 整点报时、分的调整以及小时的调整和一个顶层文件 构成。采用自顶向下的设计方法,子模块利用 VHDL语言设计,顶层文件用
3、原理 图的设计方法。显示:小时采用 24 进制,而分钟均是采用 6 进制和 10 进制的 组合。方案二:根据总体方框图及各部分分配的功能可知, 本系统可以由秒计数器、 分钟计数器、小时计数器、 整点报时、分的调整以及小时的调整和一个顶层文件 构成。采用自顶向下的设计方法,子模块利用 VHDL语言设计,顶层文件用原理 图的设计方法。显示:小时采用 24 进制,而分钟和秒均 60 进制终上所述,考虑到试验时的简单性,故我选择了方案二三、细化框图根据自顶向下的方法以及各功能模块的的功能实现上述设计方案应系统细化框图:四、编写程序、仿真和分析1、秒计数器1)VHDL语言描述程序见附录2)秒计数器的仿真
4、波形图Master 1 me b it: 17.H25 ns Fohter3O5Z us Ifltet: JUbus: startEnl AHan锂17 6229.71 us 30.35 us 30 951 1 HLLS 3 . 63 UE32.21 us132elkB IjuwLrLrLruuLnjLnrjwuuuwwLmnrLrLrjuiresetB带MinS 1冒临inB I iiigaiiIjH噜3H CTFl 1 I II 1 1 1 1 II 1M h li 1 W h 丨 i3)波形分析利用60进制计数器完成00到59的循环计数功能,当秒计数至59时,再来 一个时钟脉冲则产生进位
5、输出,即 enmin=1 ; reset作为复位信号低电平有效, 即高电平时正常循环计数,低电平清零。因为这种 60进制的VHDL语言是很好写的,它并不复杂,再说我们必须要学会这些基本的硬件语言的描写。2、分钟计数器1) VHDL语言描述程序见附录2) 分钟计数器的仿真波形图3)波形分析小时计数模块利用24进制计数器,通过分钟的进位信号的输入可实现从 00到23的循环计数。3、小时计数器1) VHDL语言描述程序见附录2) 小时计数器的仿真波形图3)波形分析小时计数模块利用24进制计数器,通过分钟的进位信号的输入可实现从 00 到23的循环计数4、整点报时报警模块1)VHDL语言描述程序见附录
6、2)整点报时模块仿真波形图1) 波形分析由图知对于整点报时模块,当分钟计数至59时来一个时钟脉冲则产生一个进位信号,分钟计数到00,此时产生报警信号持续一分钟。当有时钟脉冲时 lamp 显示灯就闪烁轮续点亮。五、全系统联调1、数字时钟系统原理图2、数字时钟系统波形图仿真六、附录(源程序)1、小时计数器 VHDL语言源程序(底层文件)LIBRARY IEEE;use IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY hour ISPORT(clk,reset:IN STD_LOGIC;daout:out STD_LOGI
7、C_VECTOR(5 DOWNTO 0); END ENTITY hour;ARCHITECTURE fun OF hour ISSIGNAL count:STD_LOGIC_VECTOR(5 DOWNTO 0);BEGINdaout=count;PROCESS(clk,reset)count=000000;END IF; END IF( count ( 3 DOWNTO 0 ) =“1001 ”) END IF; END IF(reset= 0)END PROCESS;END fun;2、分钟计数器 VHDL 语言源程序(底层文件)LIBRARY IEEE;USE IEEE.STD_LOGI
8、C_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY minute ISPORT(clk,clk1,reset,sethour:IN STD_LOGIC; enhour:OUT STD_LOGIC;daout:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);END ENTITY minute ;ARCHITECTURE fun OF minute ISSIGNAL count :STD_LOGIC_VECTOR (6 DOWNTO 0);SIGNAL enhour_1, enhour_2: STD_LOGIC; enmin_1 为
9、 59 分时的进位信号BEGIN enmin_2 由 clk 调制后的手动调时脉冲信号串 daout=count;enhour_2= (sethour and clk1); sethour 为手动调时控制信号,高电平有效 enhour= (enhour_1 or enhour_2);PROCESS(clk,reset,sethour)BEGIN IF(reset=0) THEN 若 reset 为 0,则异步清零count=0000000;ELSIF(clkevent and clk=1)THEN 否则,若 clk 上升沿到IF(count (3 DOWNTO 0) =1001)THEN 若个
10、位计时恰好到“ 1001 ”即9IF(count 16#60#) THEN 又若 count 小于 16#60# ,即 60IF(count=1011001) THEN 又若已到 59D enhour_1=1; 则置进位为 1 count=0000000; count 复 0ELSEcount=count+7; 若count未到59D,则加7,即作加6校正”END IF; 使前面的 16#60# 的个位转变为 8421BCD 的容量ELSEcount=0000000; count 复 0(有此句,则对无效状态电路可自启动)END IF; END IF( count16#60# )ELSIF (
11、count 16#60#) THENcount=count+1; 若 count16#60# 则 count 加 1 enhour_1=0 after 100 ns; 没有发生进位ELSEcount=0000000; 否则,若 count 不小于 16#60# count 复 0END IF; END IF(count (3 DOWNTO 0 )= “1001” )END IF; END IF( reset= 0)END process;END fun;3、秒钟计数器 VHDL 语言源程序(底层文件)LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IE
12、EE.STD_LOGIC_UNSIGNED.ALL;ENTITY second ISPORT( clk,reset,setmin:STD_LOGIC;enmin:OUT STD_LOGIC; daout:OUT STD_LOGIC_VECTOR(6 DOWNTO 0);END ENTITY second;ARCHITECTURE fun OF second ISSIGNAL count:STD_LOGIC_VECTOR(6 DOWNTO 0);SIGNAL enmin_1,enmin_2:STD_LOGIC; enmin_1 为 59 秒时的进位信号BEGIN enmin_2 由 clk 调制
13、后的手动调分脉冲信号串daout=count;enmin_2=(setmin and clk); setmin 为手动调分控制信号,高电平有效 enmin=(enmin_1 or enmin_2); enmin 为向分进位信号PROCESS(clk,reset,setmin)BEGINIF(reset=0)THEN count=0000000; 若 reset 为 0,则异步清零ELSIF(clk event and clk=1)then 否则,若 clk 上升沿到IF(count(3 downto 0)=1001)then 若个位计时恰好到“ 1001”即9IF(count16#60#)th
14、en 又若 count 小于 16#60#, 即 60HIF(count=1011001)then 又若已到 59Denmin_1=1;count=0000000; 则置进位为 1 及 count 复 0ELSE 未到 59Dcount=count+7; 则加 7 ,而+7=+1+6 ,即作“加6 校正”END IF;ELSE 若 count 不小于 16#60# (即 count 等于或大于 16#60# )count 复 0END IF( count16#60# ) 若个位计数未到“ 1001 ”则转此句再判 若 count16#60# 则 count 加 1没有发生进位4、整点报时报警模
15、块 VHDL 语言源程序(底层文件) LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY alert ISPORT(clk:IN STD_LOGIC; dain:IN STD_LOGIC_VECTOR(6 DOWNTO 0);speak:OUT STD_LOGIC; lamp:OUT STD_LOGIC_VECTOR(2 DOWNTO 0);END alert;ARCHITECTURE fun OF alert ISSIGNAL count:STD_LOGIC_VECTOR(1 DOWN
16、TO 0);SIGNAL count1:STD_LOGIC_VECTOR(1 DOWNTO 0); BEGINspeaker:PROCESS(clk)BEGIN speak=10)THEN count1=00; count1 为三进制加法计数器ELSE count1=count1+1;END IF ;END IF ;END IF ;END PROCESS speaker;lamper:PROCESS(clk)BEGINIF(rising_edge(clk)THENIF(count=10)THENIF(count=00)THENlamp=001; 循环点亮三只灯ELSIF(count=01)THEN lamp=010;ELSIF(count=10)THEN lamp=100; END IF;count=count+1;ELSEcount=00;END IF;END IF;END PROCESS lamper;END fun;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1