vhdl课程设计电子钟+闹铃).docx

上传人:scccc 文档编号:14044645 上传时间:2022-01-31 格式:DOCX 页数:24 大小:48.37KB
返回 下载 相关 举报
vhdl课程设计电子钟+闹铃).docx_第1页
第1页 / 共24页
vhdl课程设计电子钟+闹铃).docx_第2页
第2页 / 共24页
vhdl课程设计电子钟+闹铃).docx_第3页
第3页 / 共24页
vhdl课程设计电子钟+闹铃).docx_第4页
第4页 / 共24页
vhdl课程设计电子钟+闹铃).docx_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《vhdl课程设计电子钟+闹铃).docx》由会员分享,可在线阅读,更多相关《vhdl课程设计电子钟+闹铃).docx(24页珍藏版)》请在三一文库上搜索。

1、数字钟的设计一、系统功能概述(一) 、系统实现的功能:1、具有“时” 、 “分” 、 “秒”的十进制数字显示(小时从00 23 ) 。2、具有手动校时、校分、校秒的功能。3、有定时和闹钟功能,能够在设定的时间发出闹铃声。4、能进行整点报时。从59 分 50 秒起,每隔 2 秒发一次低音“嘟”的信号,连续 5 次,最后一次为高音“嘀”的信号。(二) 、各项设计指标:1、显示部分采用的6个LED显示器,从高位至低位分别显示时、分、秒。2、有一个设置调闹钟定时时间、正常时间的按钮,选择调的对象。3、有三个按钮分别调时、分、秒的时间。4、有一个按钮用作开启/ 关闭闹铃。5、另外需要两个时钟信号来给系统

2、提供脉冲信号,使时钟和闹钟正常工作,分别为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_sl

3、t 选择 设置对象:定时或正常时间; key_alarm 能够开启和关闭闹铃; sec_set 、 min_set 、 hour_set 用于设置时间或定时,与key_slt 相关联。各按键输出为脉冲信号。、CNT60_A_SE蟆块:这个模块式将clk_1hz 这个时钟信号进行60进制计数, 并产生一个分钟的触发信号。该模块能将当前计数值实时按BC网的格式输出。将该输出接到两位LED数码后能时时显示秒的状态。通过alarm_clk可以选择设置对象为时间 还是定时值。在设置时间模式上, key 上的一个输入脉冲可以将clk 的输入信号加一。 在设置定时模式上, key 上的脉冲只修改定时值, 不

4、影响时间脉冲 clk 的状态。同时该模块具有两个输出口 out_do 、 out_di 来触发整点报时的 “嘟” 、 “嘀” 声音。(3)、CNT60_A_MINII块:这个模块式将CNT60_A_SE的输出信号进行60进制计数,并产生一个时位 的触发信号。该模块能将当前计数值实时按BC网的格式输出。将该输出接到两位LED数码后能时时显示分的状态。通过alarm_clk可以选择设置对象为时间还是定时值。在设置时间模式上, key 上的一个输入脉冲可以将clk 的输入信号加一。在设置定时模式上, key 上的脉冲只修改定时值,不影响时间脉冲 clk 的状态。同时该模块具有三个输出口 out_do

5、 、 out_di 、 out_alarm 来触发整点报时、 “嘀” 、闹铃声音。(4)、CNT24_A_HOUR块:这个模块式将CNT60_A_MIN勺输出彳B号做24进制计数。该模块能将当前计数值实时按BC酗的格式输出。将该输出接到两位LED数码后能时时显示时的状态。 通过 alarm_clk 可以选择设置对象为时间还是定时值。 在设置时间模式上, key 上的一个输入脉冲可以将clk 的输入信号加一。在设置定时模式上,key 上的脉冲只修改定时值,不影响时间脉冲 clk 的状态。同时该模块具有一个输出口out_alarm 来触发整点报时的闹铃声音。、pwm_oUT块:该模块为PWM生模块

6、,通过EN可开启和关闭PWM俞出。模块根据 CLK信号二分频产生的高低音,并组合,能输出三种声音状态“嘟” 、 “嘀” 、闹铃。而该三种声音要被秒、分、时的输出触发才能输出PWM。(二)系统各个模块的VHDLS序:(1)、CNT60_A_SE蟆块:程序源代码如下: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_lo

7、gic;- 输入按键脉冲,调整闹铃定时或时间- 设置模式选择:闹铃调节模式、显示输出秒的低位显示输出秒的高位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

8、;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) - 当 该端口输入一个脉冲时,修改设置模式:

9、时间调整或闹铃模式切换beginif alarm_clkevent 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

10、 -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 tclkevent and

11、 tclk=1 thenif enb=1 then-enable works at high voltageif qout2_l=1001 and qout2_h=0101 thenqout2_l=0000;-a full modeis completed and a carryoutis 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

12、;process(aclk,clr,enb)-修改闹铃的定时值beginif clr=1 then-clearing works at the state of high voltagealarm_l=0000;alarm_h=0000;elsif aclkevent and aclk=1 thenif enb=1 then-enable works at high voltageif alarm_l=1001 and alarm_h=0101 thenalarm_l=0000;-a full modeis completed and a carryoutis generatedalarm_h

13、=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)-产生进位 , 显示时间或闹铃定时值beginelsif qout2_l=0110 thenco=1;elseco=0;end if;if ac_slt=0 then - 显示时间qout_sl=qout2_l;qout_

14、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;out_do=1;elsif qout2_l=1000 thenout_do=1;elseout_do=0;end if

15、;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_MlNt块: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:使能端

16、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

17、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

18、(alarm_clk) - 当 该端口输入一个脉冲时,修改设置模式:时间调整或闹铃模式切换beginif alarmclkevent and alarmclk=1 thenif acslt=0 then-如果为定时模式,将改为闹铃模式ac_slt=1;elseac_slt=0;end if;end if;end process;process(key,clk,ac_slt) -根据设置模式,处理key 上的脉冲信号beginif acslt=0 then -时间调整模式则 tclk=0 ,通过挖洞方式添则 tclk=1, 产生一个高电aclk=0;if clk=1 and key=1 then

19、-clk=1加一个脉冲tclk=0;elsif clk=0 and key=1 then-clk=0,平,添加一脉冲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_

20、h=0000;elsif tclkevent and tclk=1 thenif enb=1 then-enable works at high voltageif qout2_l=1001 and qout2_h=0101 thenqout2_l=0000;-a full modeis completed and a carryoutis 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

21、;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 aclkevent and aclk=1 thenif enb=1 then-enable works at high voltageif alarm_l=1001 and alarm_h=0101 thenalarm_l=0000;-afull modeis completed and a

22、carryoutis generatedalarm_h=0000;elsif alarml=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;else

23、co=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) - 根

24、据分的状态输出“嘟” 、 “嘀”触发信号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 is port(clk,clr,

25、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-闹铃

26、触发信号输出);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) - 当 该端口输入一

27、个脉冲时,修改设置模式:时间调整或闹铃模式切beginif alarmclkevent and alarmclk=1 thenif acslt=0 then-如果为定时模式,将改为闹铃模式ac_slt=1;elseac_slt=0;end if;end if;end process;process(key,clk,ac_slt) -根据设置模式,处理key 上的脉冲信号beginif acslt=0 then -时间调整模式则 tclk=0 ,通过挖洞方式添则 tclk=1, 产生一个高电aclk=0;if clk=1 and key=1 then-clk=1加一个脉冲tclk=0;elsif

28、 clk=0 and key=1 then-clk=0,平,添加一脉冲tclk=1;elsetclk=clk;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 tclkevent and tcl

29、k=1 thenif enb=1 then-enable works at high voltageif qout2_l=1001 thenqout2_l=0000;-afull modeis completed and a carryoutis 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;proc

30、ess(aclk,clr,enb) - 修改闹铃的定时值beginif clr=1 then-clearing works at the state of high voltagealarm_l=0000;alarm_h=0000;elsif aclkevent and aclk=1 thenif enb=1 then-enable works at high voltageif alarm_l=1001 thenalarm_l=0000;-a full modeis completed and a carryoutis generatedalarm_h=qout2_h+1;elsif ala

31、rm_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 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=

32、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)

33、、CNT60_A_SE蟆块:注:在50、 52、 54、 56 、 58 处有嘟触发输出, 00 处有嘀触发输出等。(3)、CNT60_A_MlNf块:注:本图展示了按键调节时间值和定时值的仿真波形(部分仿真图) 。注:该模块的仿真波形图,具有嘟、嘀声音触发输出,定时与时间相等时有闹铃触发输出等。(4)、CNT24_A_HOUR块注:该模块的仿真图,包含按键调整时间、定时值,闹钟触发输出等。(5)、PWM_OUT块(分三段剪切下来的,展示了三种声音的效果)(1)、“嘟”、“嘀”输出波形(只有在 en有脉冲,打开PWM病,才有效)注:在打开输出后,当两路嘟、嘀触发输入同时有效时分别输出嘟、嘀声音

34、。当两路闹铃触发同时有效时开始闹铃声音的输出。注:闹铃输出的变化情况(“嘀”、“嘟”交替发声) 注:闹铃输出的变化情况。3、下载时选择的开发系统模式以及管脚定义表1 GW48-C防发系统工作模式:3接口名称(输入/输出)结构图上的信号名引脚号说明clk_1hz输入CLOCK02时钟的计数脉冲clk_1khz输入CLOCK583二种声音的脉冲信号源pwm_out输入SPEAKER3连接蜂鸣器,发出声音key_slt输入PIO716切换定时调整模式和时间调整模式key_alarm输入PIO611开启或关断声音的产生hour_set输入PIO38修改时或时间的小时数值min_set输入PIO27修改

35、时或时间的分钟数值sec_set输入PIO16修改定时或时间的秒的数值hour_h3.0输出PIO39-PIO3665-61小时的高位输出hour_l3.0输出PIO35-PIO3260-58,54小时的低位输出min_h3.0输出PIO31-PIO2853-50分钟的高位输出min_l3.0输出PIO27-PIO2449-47,39分钟的低位输出sec_h3.0输出PIO23-PIO2038-35秒的高位输出sec_l3.0输出PIO19-PIO1630-27秒的低位输出三、课程设计过程中遇到的问题以及解决方法主要是在“调整时间”和“调整定时”的上面遇到非常大的困难。与开始想象的不一样,一个

36、进程中不能加入时钟信号,没能够将按键脉冲直接与时钟脉冲进行累加。同时,在对VHDL的语法的熟悉上也花费了大量的时间。最后的解决方法是,通过另一个进程,先将这两个信号进行处理后,分别产生aclk 和 tclk 分别为定时调整部分、 和时间调整部分提供时钟信号。 调整按键的脉冲信号和正常的时钟信号不是按照简单的或运算来处理的。1) 、如果要调整时间:1、 当时钟信号是高电平,按键信号也是高电平时,则给tclk 赋值 0。2、 当时钟信号是高电平,按键信号是低电平时,则给tclk赋值1 。3、 当时钟信号是低电平,按键信号是高电平时,则给tclk赋值1 。4、 当时钟信号是低电平,按键信号是低电平是

37、,则给tclk赋值0 。这样无论按键脉冲是在高电平还是低电平,或者是在高低电平两种状态下出现,其最终结果都是会多产生一个脉冲信号,导致计数值变化,达到修改时间的目的。期间, aclk 始终不变。2) 、如果要调整定时:1、时钟输入信号赋值给tclk2、按键输入信号赋值给aclk这样,当按键脉冲结束时,定时调整信号会出现一个脉冲。而时钟信号不受影响。另外, 在闹铃产生上也遇到了一些小问题, 最后, 通过在产生周期较长的信号,切换输出值的内容“嘟”还有“嘀” ,最后的效果就是“嘟” 、 “嘀”声音交替发出。在仿真时,大多数模块会出现毛刺,会导致最后的总仿真结果不是很乐观,会把脉冲的几个干扰加上去。这方面,我试图调了很久也没解决。不过由于在实际 下载后还是相对比较正常的,仿真中的毛刺最后没有消除掉。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1