《数字电路课程设计电子数字钟+闹铃.docx》由会员分享,可在线阅读,更多相关《数字电路课程设计电子数字钟+闹铃.docx(21页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、数字电路课程设计电子数字钟+闹铃 数字电路课程设计 院系: 专业: 电子信息工程 姓名: 学号: 完成日期:2009 数字钟的设计 一、系统功能概述 (一)、系统实现的功能: 1、具有“时”、“分”、“秒”的十进制数字显示(小时从00 23)。 2、具有手动校时、校分、校秒的功能。3、有定时和闹钟功能,能够在设定的时间发出闹铃声。4、能进行整点报时。从59分50秒起,每隔2秒发一次低音“嘟”的信号,连续5次,最终一次为高音“嘀”的信号。(二)、各项设计指标: 1、显示部分采纳的6个LED显示器,从高位至低位分别显示时、分、秒。 2、有一个设置调闹钟定时时间、正常时间的按钮,选择调的对象。 3、
2、有三个按钮分别调时、分、秒的时间。 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为闹铃模块供应时钟,处理后能产生“嘟”、“嘀”和改变的闹铃声音;cl
3、k_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的输入信号加一。在设置定时模式上
4、,key上的脉冲只修改定时值,不影响时间脉冲clk的状态。同时该模块具有两个输出口out_do、out_di来触发整点报时的“嘟”、“嘀”声音。(3)、CNT60_A_MIN模块: 这个模块式将CNT60_A_SEC的输出信号进行60进制计数,并产生一个时位的触发信号。该模块能将当前计数值实时按BCD码的格式输出。将该输出接到两位LED数码后能时时显示分的状态。通过alarm_clk可以选择设置对象为时间还是定时值。在设置时间模式上,key上的一个输入脉冲可以将clk的输入信号加一。在设置定时模式上,key上的脉冲只修改定时值,不影响时间脉冲clk的状态。 同时该模块具有三个输出口out_do
5、、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产生模块,通过E
6、N可开启和关闭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 is port( clk,clr,enb: in std_logic;-clk:时钟输入信号,clr:清零端,enb:使能端 key: in std_l
7、ogic; -输入按键脉冲,调整闹铃定时或时间 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 -在整点报时中输出“嘀”触发信号
8、 ); end; architecture a of cnt60_a_sec is signal 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; begin process(alarm_clk) -当该端口输入
9、一个脉冲时,修改设置模式:时间调整或闹铃模式切换 begin if alarm_clkevent and alarm_clk=1 then if ac_slt=0 then-假如为定时模式,将改为闹铃模式 ac_slt<=1; else ac_slt<=0; end if; end if; end process; process(key,clk,ac_slt)-依据设置模式,处理key上的脉冲信号 begin if ac_slt=0 then -时间调整模式 aclk<=0; if clk=1 and key=1 then -clk=1则tclk<=0,通过挖洞方式添
10、加一个脉冲 tclk<=0; elsif clk=0 and key=1 then -clk=0,则tclk<=1,产生一个高电平,添加一脉冲 tclk<=1; else tclk<=clk; end if; elsif ac_slt=1 then -闹铃调整模式 tclk<=clk; aclk<=key; -key上的脉冲干脆修改闹铃定时值 end if; end process; process(tclk,clr,enb) -60进制计数,个位、十位放在两个临时变量中,表示秒的状态 begin if clr=1 then-clearing works a
11、t the state of high voltage qout2_l<=“0000“; qout2_h<=“0000“; elsif tclkevent and tclk=1 then if enb=1 then-enable works at high voltage if qout2_l=“1001“ and qout2_h=“0101“ then qout2_l<=“0000“;-a full mode is completed and a carryout is generated qout2_h<=“0000“; elsif qout2_l=“1001“ t
12、hen qout2_l<=“0000“; qout2_h<=qout2_h+1; else qout2_l<=qout2_l+1;- in process of counting end if; end if; end if; end process; process(aclk,clr,enb)-修改闹铃的定时值 begin if clr=1 then-clearing works at the state of high voltage alarm_l<=“0000“; alarm_h<=“0000“; elsif aclkevent and aclk=1 th
13、en if enb=1 then-enable works at high voltage if alarm_l=“1001“ and alarm_h=“0101“ then alarm_l<=“0000“;-a full mode is completed and a carryout is generated alarm_h<=“0000“; elsif alarm_l=“0101“ then alarm_l<=“0000“; alarm_h<=alarm_h+1; else alarm_l<=alarm_l+1;- in process of countin
14、g end if; end if; end if; end process; process(qout2_l,qout2_h,alarm_l,alarm_h,alarm_clk)- 产生进位,显示时间或闹铃定时值 begin if qout2_l=“0000“ and qout2_h=“0000“ then co<=1; else co<=0; end if; if ac_slt=0 then - 显示时间 qout_sl<=qout2_l; qout_sh<=qout2_h; else - 显示定时值 qout_sh<=alarm_h; qout_sl<=
15、alarm_l; end if; end process; process(qout2_l,qout2_h) - 依据秒的状态输出“嘟”、“嘀”触发信号 begin if qout2_h=“0101“ then if qout2_l=“0000“ then out_do<=1; elsif qout2_l=“0010“ then out_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<=
16、1; else out_do<=0; end if; elsif qout2_h=“0000“ then if qout2_l=“0000“ then out_di<=1; out_do<=0; else out_di<=0; end if; else out_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
17、_a_min is port( 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; -进位输出
18、,触发时计数模块 out_alarm:out std_logic;-闹铃触发信号,时间到后输出高电平触发闹铃 out_do,out_di: out std_logic-在整点报时中输出“嘟”“嘀”触发信号 ); end; architecture a of cnt60_a_min is signal 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_lo
19、gic_vector(3 downto 0); signal clk1,clk2,tclk,aclk,ac_slt: std_logic; begin process(alarm_clk) -当该端口输入一个脉冲时,修改设置模式:时间调整或闹铃模式切换 begin if alarm_clkevent and alarm_clk=1 then if ac_slt=0 then-假如为定时模式,将改为闹铃模式 ac_slt<=1; else ac_slt<=0; end if; end if; end process; process(key,clk,ac_slt) -依据设置模式,处
20、理key上的脉冲信号 begin if 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; else tclk<=clk; end if; elsif ac_slt=1 then -闹铃调整模式 tclk<=clk; aclk<=key; -key上的脉冲干脆修改闹铃定时值 end if;
21、end process; process(tclk,clr,enb) -60进制计数,个位、十位放在两个临时变量中,表示分的状态 begin if clr=1 then-clearing works at the state of high voltage qout2_l<=“0000“; qout2_h<=“0000“; elsif tclkevent and tclk=1 then if enb=1 then-enable works at high voltage if qout2_l=“1001“ and qout2_h=“0101“ then qout2_l<=“0
22、000“;-a full mode is completed and a carryout is generated qout2_h<=“0000“; elsif qout2_l=“1001“ then qout2_l<=“0000“; qout2_h<=qout2_h+1; else qout2_l<=qout2_l+1;- in process of counting end if; end if; end if; end process; process(aclk,clr,enb) -修改闹铃的定时值 begin if clr=1 then-clearing wo
23、rks at the state of high voltage alarm_l<=“0000“; alarm_h<=“0000“; elsif aclkevent and aclk=1 then if enb=1 then-enable works at high voltage if alarm_l=“1001“ and alarm_h=“0101“ then alarm_l<=“0000“;-a full mode is completed and a carryout is generated alarm_h<=“0000“; elsif alarm_l=“01
24、01“ then alarm_l<=“0000“; alarm_h<=alarm_h+1; else alarm_l<=alarm_l+1;- in process of counting end if; end if; end if; end process; process(qout2_l,qout2_h,alarm_l,alarm_h,alarm_clk) - 产生进位,显示时间或闹铃定时值of high voltage begin if qout2_l=“0000“ and qout2_h=“0000“ then co<=1; else co<=0; en
25、d if; if ac_slt=0 then qout_ml<=qout2_l; qout_mh<=qout2_h; else qout_mh<=alarm_h; qout_ml<=alarm_l; end if; end process; process(qout2_l,qout2_h,alarm_l,alarm_h) 推断定时值与时间值相等,输出闹铃触发信号 begin if qout2_l=alarm_l and qout2_h=alarm_h then out_alarm<=1; else out_alarm<=0; end if; end proc
26、ess; process(qout2_l,qout2_h) - 依据分的状态输出“嘟”、“嘀”触发信号 begin if qout2_l=“1001“ and qout2_h=“0101“ then out_do<=1; else out_do<=0; end if; if qout2_l=“0000“ and qout2_h=“0000“ then out_di<=1; else out_di<=0; end if; end process; end; (3)、CNT24_A_HOUR模块: library ieee; use ieee.std_logic_1164.
27、all; use ieee.std_logic_unsigned.all; entity cnt24_a_hour is port( 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_vecto
28、r(3 downto 0); -显示输出时的高位 co: out std_logic; -进位输出 out_alarm:out std_logi-闹铃触发信号输出 ); end; architecture a of cnt24_a_hour is signal 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
29、0); signal clk1,clk2,tclk,aclk,ac_slt: std_logic; begin process(alarm_clk) -当该端口输入一个脉冲时,修改设置模式:时间调整或闹铃模式切换 begin if alarm_clkevent and alarm_clk=1 then if ac_slt=0 then-假如为定时模式,将改为闹铃模式 ac_slt<=1; else ac_slt<=0; end if; end if; end process; process(key,clk,ac_slt) -依据设置模式,处理key上的脉冲信号 begin if
30、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; else tclk<=clk; end if; elsif ac_slt=1 then -闹铃调整模式 tclk<=clk; aclk<=key; -key上的脉冲干脆修改闹铃定时值 end if; end process; process
31、(tclk,clr,enb) -24进制计数,个位、十位放在两个临时变量中,表示时的状态 begin if clr=1 then-clearing works at the state of high voltage qout2_l<=“0000“; qout2_h<=“0000“; elsif tclkevent and tclk=1 then if enb=1 then-enable works at high voltage if qout2_l=“1001“ then qout2_l<=“0000“;-a full mode is completed and a ca
32、rryout is generated qout2_h<=qout2_h+1; elsif qout2_l=“0011“ and qout2_h=“0010“ then qout2_l<=“0000“; qout2_h<=“0000“; else qout2_l<=qout2_l+1;- in process of counting end if; end if; end if; end process; process(aclk,clr,enb) -修改闹铃的定时值 begin if clr=1 then-clearing works at the state of
33、high voltage alarm_l<=“0000“; alarm_h<=“0000“; elsif aclkevent and aclk=1 then if enb=1 then-enable works at high voltage if alarm_l=“1001“ then alarm_l<=“0000“;-a full mode is completed and a carryout is generated alarm_h<=qout2_h+1; elsif alarm_l=“0011“ and alarm_h=“0010“ then alarm_l&
34、lt;=“0000“; alarm_h<=“0000“; else alarm_l<=alarm_l+1;- in process of counting end if; end if; end if; end process; process(qout2_l,qout2_h,alarm_l,alarm_h,alarm_clk) - 产生进位,显示时间或闹铃定时值of high voltage begin if qout2_l=“0000“ and qout2_h=“0000“ then co<=1; else co<=0; end if; if ac_slt=0 th
35、en qout_hl<=qout2_l; qout_hh<=qout2_h; else qout_hh<=alarm_h; qout_hl<=alarm_l; end if; end process; process(qout2_l,qout2_h,alarm_l,alarm_h)-定时值与时间值相等,则输出闹钟触发信号 begin if qout2_l=alarm_l and qout2_h=alarm_h then out_alarm<=1; else out_alarm<=0; end if; end process; end; 2、系统以及各个模块的
36、仿真波形 (1)、系统仿真波形: 注:由于下面的模块仿真存在毛刺,导致系统的仿真图有肯定的问题。(2)、CNT60_A_SEC模块: 注:在50、52、54、56、58处有嘟触发输出,00处有嘀触发输出等。(3)、CNT60_A_MIN模块: 注:本图展示了按键调整时间值和定时值的仿真波形(部分仿真图)。 注:该模块的仿真波形图,具有嘟、嘀声音触发输出,定时与时间相等时有闹铃触发输出等。 (4)、CNT24_A_HOUR模块 注:该模块的仿真图,包含按键调整时间、定时值,闹钟触发输出等。(5)、PWM_OUT模块(分三段剪切下来的,展示了三种声音的效果) (1)、“嘟”、“嘀”输出波形(只有在
37、en有脉冲,打开PWMO后,才有效) 注:在打开输出后,当两路嘟、嘀触发输入同时有效时分别输出嘟、嘀声音。当两路闹铃触发同时有效时起先闹铃声音的输出。 注:闹铃输出的改变状况(“嘀”、“嘟”交替发声)。 注:闹铃输出的改变状况。 3、下载时选择的开发系统模式以及管脚定义 表1 GW48-CK开发系统工作模式:3 接口 名称 类型 (输入/输出) 结构图上 的信号名 引脚号 说明 clk_1hz 输入 CLOCK0 2 时钟的计数脉冲 clk_1khz 输入 CLOCK5 83 三种声音的脉冲信号源 pwm_out 输入 SPEAKER 3 连接蜂鸣器,发出声音 key_slt 输入 PIO7
38、16 切换定时调整模式和时间调整模式 key_alarm 输入 PIO6 11 开启或关断声音的产生 hour_set 输入 PIO3 8 修改定时或时间的小时数值 min_set 输入 PIO2 7 修改定时或时间的分钟数值 sec_set 输入 PIO1 6 修改定时或时间的秒的数值 hour_h3.0 输出 PIO39-PIO36 65-61 小时的高位输出 hour_l3.0 输出 PIO35-PIO32 60-58,54 小时的低位输出 min_h3.0 输出 PIO31-PIO28 53-50 分钟的高位输出 min_l3.0 输出 PIO27-PIO24 49-47,39 分钟的
39、低位输出 sec_h3.0 输出 PIO23-PIO20 38-35 秒的高位输出 sec_l3.0 输出 PIO19-PIO16 30-27 秒的低位输出 三、课程设计过程中遇到的问题以及解决方法 主要是在“调整时间”和“调整定时”的上面遇到特别大的困难。与起先想象的不一样,一个进程中不能加入时钟信号,没能够将按键脉冲干脆与时钟脉冲进行累加。同时,在对VHDL的语法的熟识上也花费了大量的时间。 最终的解决方法是,通过另一个进程,先将这两个信号进行处理后,分别产生aclk和tclk分别为定时调整部分、和时间调整部分供应时钟信号。调整按键的脉冲信号和正常的时钟信号不是根据简洁的或运算来处理的。
40、1)、假如要调整时间: 1、 当时钟信号是高电平,按键信号也是高电平常,则给tclk赋值0。2、 当时钟信号是高电平,按键信号是低电平常,则给tclk赋值1。3、 当时钟信号是低电平,按键信号是高电平常,则给tclk赋值1。4、 当时钟信号是低电平,按键信号是低电平是,则给tclk赋值0。这样无论按键脉冲是在高电平还是低电平,或者是在凹凸电平两种状态下出现,其最终结果都是会多产生一个脉冲信号,导致计数值改变,达到修改时间的目的。期间,aclk始终不变。2)、假如要调整定时: 1、时钟输入信号赋值给tclk 2、按键输入信号赋值给aclk 这样,当按键脉冲结束时,定时调整信号会出现一个脉冲。而时
41、钟信号不受影响。另外,在闹铃产生上也遇到了一些小问题,最终,通过在产生周期较长的信号,切换输出值的内容“嘟”还有“嘀”,最终的效果就是“嘟”、“嘀”声音交替发出。在仿真时,大多数模块会出现毛刺,会导致最终的总仿真结果不是很乐观,会把脉冲的几个干扰加上去。这方面,我试图调了很久也没解决。不过由于在实际下载后还是相对比较正常的,仿真中的毛刺最终没有消退掉。 8路彩灯限制系统 一、系统功能概述 (一)、系统实现的功能: 1、彩灯自左向右依次点亮。 2、彩灯自左向右依次熄灭。3、彩灯自右向左依次点亮。4、彩灯自右向左依次熄灭。5、彩灯全亮。6、彩灯全灭。(二)、各项设计指标: 1、显示部分采纳的8个彩
42、灯。2、须要一个时钟信号来给系统供应脉冲信号,为1Hz的脉冲。二、系统组成以及系统各部分的设计 1、系统的VHDL设计 library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity colorlight66 is port(clk:in std_logic; q: out std_logic_vector(7 downto 0); s: out std_logic_vector(1 downto 0); end; architecture one of colorlight66 is sig
43、nal cnt4:std_logic_vector(1 downto 0); begin process(clk) variable cnt:integer range 0 to 34; begin if rising_edge(clk)then if cnt=34 then cnt:=0;cnt4<=cnt4+1; else cnt:=cnt+1; end if; case cnt is when 0 =>q<=“00000000“ ; when 1 =>q<=“10000000“ ; when 2 =>q<=“11000000“ ; when 3
44、=>q<=“11100000“ ; when 4 =>q<=“11110000“ ; when 5 =>q<=“11111000“ ; when 6 =>q<=“11111100“ ; when 7 =>q<=“11111110“ ; when 8 =>q<=“11111111“ ; when 9 =>q<=“01111111“ ; when 10=>q<=“00111111“ ; when 11=>q<=“00011111“ ; when 12=>q<=“00001111“
45、 ; when 13=>q<=“00000111“ ; when 14=>q<=“00000011“ ; when 15=>q<=“00000001“ ; when 16=>q<=“00000000“ ; when 17=>q<=“00000001“ ; when 18=>q<=“00000011“ ; when 19=>q<=“00000111“ ; when 20=>q<=“00001111“ ; when 21=>q<=“00011111“ ; when 22=>q<=“00111111“ ; when 23=>q<=“01111111“ ; when 24=>q<=“11111111“ ; when 25=>q<=“11111110“ ; when 26=>