1、设计任务及要求课程设计多功能数字钟1.设计任务:设计一个多功能数字钟,实现以下功能基本要求:(1).时间的显示与设置(2).闹钟,闹钟提示音为音乐(3).日期的显示与设置 (4).秒表2.设计说明(1) SW1功能键用来选择不同的功能模式: 1号功能:时间正常显示 2号功能:时间的调整与设置 3号功能:闹钟的设置与查看 4号功能:日期的正常显示 5号功能:日期的调整与设置 6号功能:秒表功能(2) SW2主要用于闹钟设置、时间的调整与设置、日期的调整与设置中的位置选择按钮,与功能键SW1配合使用,具体功能如下: 2号功能模式,即时间的调整与设置时,用作时、分、秒的移位,按一下,将会实现“时-分
2、-秒”的依次移位,便于调整键SW3在特定位置进行调整。 3号功能模式,即闹钟的设置与查看时,用作时、分、秒的移位,按一下,将会实现“时-分-秒”的依次移位,便于调整键SW3在特定位置进行调整。 5号功能模式,即日期的调整与设置时,用作年、月、日的移位,按一下,将会实现“年-月-日”的依次移位,便于调整键SW3在特定位置进行调整。(3) SW3主要用于闹钟设置、时间调整与设置、日期调整与设置中的调整按钮。与功能键SW1配合使用,具体功能如下: 2号功能模式,即时间的调整与设置时,用作时、分、秒数字的调整,按一下,将会使得当前调整键SW2选择的位置数字增加1。 3号功能模式,即闹钟的设置与查看时,
3、用作时、分、秒数字的调整,按一下,将会使得当前调整键SW2选择的位置数字增加1。 5号功能模式,即日期的调整与设置时,用作年、月、日数字的调整,按一下,将会使得当前调整键SW2选择的位置数字增加1。(4) 3.提示 显示部分可采用动态数码管显示 为避免损坏器件,可编程器件的输入和数码管的输入前需要接入几百欧的电阻限流。 按键消抖: 通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。 按键的消抖,可用硬件或软件两种
4、方法。本次设计建议采用软件的方法进行按键消抖,即检测出键闭合后执行一个延时程序,5ms10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms10ms的延时,待后沿抖动消失后才能转入该键的处理程序。 时基的输入信号可采用EPM570T100C芯片自带的5.56MHz的信号。4时基部分可采用开发板上自带的50MHz信号进行分频。 目录第1章 绪 论21.1 背景和意义2第2章 设计22.1 设计方案和可行性分析22.1.1设计方案22.1.2可行性分析32. 2.系统框图及部分功能描述 42.2.1系统框图42.2.2 部
5、分功能介绍42.3 程序设计及代码5 2.3.1程序设计及代码5 2.4 测试步骤及过程 262.4.1测试步骤262.4.2测试过程262.4.3遇到的问题及解决262.5 设计成果图26第3章 总结293.1设计成果总结293.2收获及感想29参考文献29- 30 -第1章 绪 论背景和意义数字钟是现代计时器,也可以用作时间控制的时钟源。数字钟由于其具有走时准,显示直观,款式新颖,附加功能多等特点而受到人们的欢迎。设计一个具有整点报时,可对时的数字钟。由于数字集成电路的发展和石英晶体震荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地
6、扩展了钟表原先的报时功能。如定时自动报警、按时自动打铃、定时广播、自动启闭路灯、甚至各种定时电器的自动启用等,所有这些,都是一钟表数字化为基础的。因此研究数字钟及扩大其应用,有着非常现实的意义。 第2章 设计2.1设计方案和可行性分析2.1.1 设计方案 整个电路由计数模块、分频模块、校时、校分校秒模块,清零模块、保持模块,整点报时模块,闹钟设定模块、报警模块,以及年月周模块构成。(如下图所示)基本功能:数字计时器基本功能是计时,因此首先需要获得具有精确震荡时间的脉冲信号,以此作为计时电路的时序基础,实验中可以使用的振荡频率源为50MHZM通过分频获得所需脉冲频率(1Hz,2Hz,4Hz,50
7、0Hz,1KHz,6MHz)。经过Verilog编程可以轻松获得较为精确的分频信号。 在计数模块中,秒位和分位分别通过编程用模60计数器实现,时位 通过编程用模24计数器实现。校时,校分及校秒模块则通过语言选择实现。 清零及保持功能在计数模块中用判断语句可轻松实现。计数模块总共输出为6路信号:秒位的个、十位、分位的个、十位及时位的个、十位。 整点报时模块: 利用计数模块的输出作为报时模块的输入,当检测到5953”,5955”,5957”时令报时模块输出为1Kz,驱动蜂鸣器产生不同的响声。 闹钟设定模块: 这里设计一个闹钟模块,输入为计数模块的输出及一系列调节信号,输出接到译码模块上。 在闹钟模
8、块内部,核心模块时一个选择模块,选择输出的信号是闹钟显示还是正常计数显示。为了是使闹钟模块与技术模块是相互独立的,因此单独设计模24(闹钟小时)和模60(闹钟分钟)作为选择模块的输入。设计程序语言的思想是,当检测到与设定闹钟相同的时、分位时就输出一个信号1,并保存当前技术位(加1)当检测到当前信号与保存位相同时输出信号恢复为0。(这个信号将作为闹铃结束的判断信号) 蜂鸣器鸣响模块:本程序选用了音乐闹铃,通过编程实现输出为符合的音律的不同频率。程序实现的思想并不复杂。蜂鸣器何时鸣叫取决于闹钟模块的输出。 译码显示模块:本模块没有采用Verilog语言实现,通过搭建原理图实现。显示功能是通过数选器
9、、译码器、码转换器和7段显示管实现的。因为实验中只用一个译码显示单元,6个7段(用于显示时分秒),所以通过1个24选4MUX和一个3-8译码器配合,显示译码器采用7447,根据计数器的信号进行数码管的动态显示。 年月日模块:通过编程可以轻松实现,原理与上述计数模块,调节模块很是类似。计数模块动态扫描译码显示模块整点报时模块闹钟设定模块蜂鸣器鸣响模块秒表模块(包含保持和清零模块)年月日模块(包含设定模块)分频模块校时模块校分模块校秒模块图(一)实验模块原理图可行性分析 Verilog HDL是一种硬件描述语言(HDL:Hardware Discription Language),是一种以文本形式
10、来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。2.2系统框图及部分功能描述2.2.1系统框图系统框图如下图(二)所示:图(二)系统框图2.2.2部分功能描述(1)sw1,sw2,sw3为三个控制按键功能分别为时钟功能切换,时钟设置和调整时对调整位置进行选择,对时钟进行设置。(2)按键消抖模块的功能:由于当我们通过按键调整时钟是会存在抖动,而抖动会产生干扰脉冲对时钟调整造成很大干扰,是无法准确的进行调整,故此模块的功能是将抖动产生的干扰信号去掉,消除抖动对时钟调整的干扰。(3)可编程逻辑器件模块结构图和功能: 结构图如下图(三)
11、所示:如图显示该模块为一个综合模块其包含了多个分模块,分别为:分频模块、时分秒计时模块、时分秒调整与设置模块、闹钟设置和查看模块、日期计时模块、时间调整与设置模块、按键控制模块还有译码动态扫描模块。该模块是电路的核心也是整个数字钟的核心。数字中的各种功能就是在该可编程逻辑器件里实现,各分模块在 图(三) 可编程逻辑器件模块结构图可编程逻辑器件内紧密联系、相互协调从而实现数字钟的各种功能。(4)LED显示模块:该模块的主要功能就是对可编程逻辑器件输出的译码和动态扫描结果进行显示。包括时间显示、日期显示、闹钟显示和秒表显示几个部分。2.3程序及代码 2.3.1分频模块:主要是将50mhz的频率分为
12、我们所需的1khz的频率。module fengpingsm(clk_50m,clk_1000);input clk_50m;output clk_1000;reg24:0 count;reg clk_1k;always (posedge clk_50m) if(count = 25d25000) begin clk_1000=clk_1000;count=0;end else count=count+1; endmodule分频模块的电路图为图(四)分频电路所示: 图(四)分频电路2.3.2消抖部分:clk为1khz的频率,他的周期是1ms。key_in为输入信号sw为输出信号当key_co
13、unt计数为在key_in输入为1保持20以上的时候,即超过了20ms的时候,key_in的“1”将送出。当key_in为低电平的时候就将key_count变为0,即重新计数module xiaodou(clk,key_in,sw);input key_in,clk;output sw;reg sw;reg4:0key_count;always (posedge clk)begin if(key_in=1) begin key_count=key_count+1b1; sw=d20) begin key_count=d21; sw=1b1; end end else begin sw=1b0;
14、 key_count=1b0; endendendmodule我们在消抖的时间设置的是20ms. 消抖电路如下图(五)消抖电路所示: 图(五)消抖电路2.3.3闹钟音乐模块/音乐产生模块module song(clk_50mhz,clk_4hz,speaker,alert); /模块名为song(端口列表)input clk_50mhz,clk_4hz,alert; /定义两个输入端口output speaker; /定义一个输出端口reg3:0 high,med,low; /定义了3个4位寄存器reg13:0 divider,origin; /定义了2个14位寄存器reg4:0 counte
15、r;reg speaker; wire carry;assign carry=(divider=16383); /连续赋值语句always (posedge clk_50mhz) begin if(carry) begin divider=origin; end else divider=divider+1; endalways (posedge carry) if(alert) begin speaker=speaker;end /二分频产生方波信号 else speaker=0;always (posedge clk_4hz) begin case(high,med,low) /分频比预置
16、 b000000000011:origin=7281; /低音3 b000000000101:origin=8730; /低音5 b000000000110:origin=9565; /低音6 b000000000111:origin=10310; /低音7 b000000010000:origin=10647; /中音1 b000000100000:origin=11272; /中音2 b000000110000:origin=11831; /中音3 b000001010000:origin=12556; /中音5 b000001100000:origin=12974; /中音6 b0001
17、00000000:origin=13516; /高音1 b000000000000:origin=16383; /休止符endcaseendalways (posedge clk_4hz) begin if(counter=20) counter=0; /计时,以实现循环演奏 else counter=counter+1;case(counter) /记谱 0: high,med,low=b000000000011; /低音3 1: high,med,low=b000000000011; /持续4个时钟节拍 2: high,med,low=b000000000011; 3: high,med,
18、low=b000000000011; 4: high,med,low=b000000000101; /低音5 5: high,med,low=b000000000101; /发3个时钟节拍 6: high,med,low=b000000000101; 7: high,med,low=b000000000110; /低音6 8: high,med,low=b000000010000; /中音1 9: high,med,low=b000000010000; /发3个时钟节拍 10: high,med,low=b000000010000; 11: high,med,low=b000000100000
19、; /中音2 12: high,med,low=b000000000110; /低音6 13: high,med,low=b000000010000; /中音1 14: high,med,low=b000000000101; /低音5 15: high,med,low=b000000000101; 16: high,med,low=b000001010000; /中音5 17: high,med,low=b000001010000; /发3个时钟节拍 18: high,med,low=b000001010000; 19: high,med,low=b000100000000; /高音1 20:
20、 high,med,low=b000001100000; /中音6endcaseendendmodule 音乐电路如下图(六)所示图(六)音乐产生电路2.3.4程序主要部分:Clk:其频率为4Hz; clk_1k:产生闹铃音、报时音的时钟信号,本例中其频率为1024Hz; mode;功能控制信号; 为0:计时功能; 为1:设置时间功能; 为2: 设置闹钟功能; 为3:正常显示日期功能; 为4:调整日期功能。Turn;接按键,在手动校时功能时,选择是调整小时,还是分钟; 若长时间按住该键,还可使秒信号清零,用于精确调时; Change:接按键,手动调整时,每按一次,计数器加1; 如果长按,则连续
21、快速加1,用于快速调时和定时; hour,min,sec:此三信号分别输出并显示时、分、秒信号, 皆采用BCD码计数,分别驱动6个数码管显示时间; Alert:输出到扬声器的信号,用于产生闹铃音和报时音; 闹铃音为持续20秒的急促的“嘀嘀嘀”音,若按住“change”键, 则可屏蔽该音;整点报时音为“嘀嘀嘀嘀嘟”四短一长音;(详细注解见代码部分。)module xuanze(clk_1k,mode,change,turn,alert,scan,data,clk ); input clk_1k,mode,change,turn; output alert,clk; output5:0scan;o
22、utput6:0data;reg6:0 count;reg7:0 hour,min,sec,hour1,min1,sec1,ahour,amin,year1,month1,day1,sm,ssec,ss; reg1:0 fm,num1,num2,num3,num4,num5,num6,num7,fm1,fm2,fm4,clock,state;reg2:0 m; reg1:0 loop1,loop2,loop3,loop4,loop5,loop6,loop7,sound; reg5:0 scan;reg2:0 cnt,counts;reg6:0 data;reg3:0 out;reg2:0 bl
23、ink;reg clk,clk_1Hz,clk_2hz,clk_100hz,minclk,hclk,dclk,mclk,yclk,ssclk,smclk; reg alert1,alert2,ear,alert3,start,clr; reg count1,count2,counta,countb,countd,countm,county; wire ct1,ct2,cta,ctb,ctd,ctm,cty,min_clk,h_clk,d_clk,m_clk,y_clk; always (posedge clk_1k) if(counts = d5) begin clk_100hz=clk_10
24、0hz;counts=0;end else counts=counts+1; always (posedge clk_1k) if(count = d125) begin clk=clk;count=0;end else count=count+1; always (posedge clk) begin clk_2hz=clk_2hz; if(sound=3) begin sound=0; ear=1; end /ear信号用于产生或屏蔽声音 else begin sound=sound+1; ear=0; end end always (posedge clk_2hz) /由4Hz的输入时钟
25、产生1Hz的时基信号 clk_1Hz=clk_1Hz; always (posedge mode) /mode信号控制系统在三种功能间转换 begin if(m=5) m=0; else m=m+1; end always (posedge turn) if(m=5) begin start=start;state = 0;end else if(m = 4) begin if(fm4 = 2)fm4=0; else fm4=fm4+1; end else if(m = 3) begin fm4 = 0;end else if(m = 2) begin fm2 = fm2;end else i
26、f(m = 1) begin fm1=fm1;fm2 = 0;end else begin fm1=0; if(state=2) state = 0; else state=state+1; end always (posedge change) if(m = 0) clock=clock; always (mode or clk_2hz)/产生闪烁 if(m = 4) begin if(fm4 = 2) begin blink2 = clk_2hz; blink1 = 1;blink0 = 1;end else if(fm4 = 1) begin blink2 = 1; blink1 = c
27、lk_2hz; blink0 = 1;end else begin blink2 = 1; blink1 = 1; blink0 = clk_2hz;end end else if(m = 2) begin if(fm2 = 0) begin blink2 = clk_2hz; blink1 = 1;blink0 = 1;end else begin blink1 = clk_2hz;blink2 = 1;blink0 = 1;end end else if(m = 1) begin if(fm1 = 0) begin blink2 = clk_2hz;blink1 = 1;blink0 =
28、1;end else begin blink1 = clk_2hz;blink2 = 1;blink0 = 1;end end else blink2:0 = b111; always /该进程产生count1,count2,counta,countb,counntd,countm,county四个信号 begin case(m) 5: clr=change; 4: begin if(fm4 = 2) begin county=change;end else if(fm4 = 1) begin countm=change;end else begin countd=change;end cou
29、nt2,countb,count1,counta=0; end 1: begin if(fm1) begin count1=change; end else begin counta=change; end count2,countb,countd,countm,county=0; end 2: begin if(fm2) begin count2=change; end else begin countb=change; end count1,counta,countd,countm,county=0; end default: count1,count2,counta,countb,cou
30、ntd,countm,county=0; endcase end always (negedge clk) /如果长时间按下“change”键,则生成“num1”信号用于连续快速加1 if(count2) begin if(loop1=3) num1=1; else begin loop1=loop1+1; num1=0; end end else begin loop1=0; num1=0; end always (negedge clk) /产生num2信号 if(countb) begin if(loop2=3) num2=1; else begin loop2=loop2+1; num
31、2=0; end end else begin loop2=0; num2=0; end always (negedge clk) if(count1) begin if(loop3=3) num3=1; else begin loop3=loop3+1; num3=0; end end else begin loop3=0; num3=0; end always (negedge clk) if(counta) begin if(loop4=3) num4=1; else begin loop4=loop4+1; num4=0; end end else begin loop4=0; num
32、4=0; end always (negedge clk) if(countd) begin if(loop5=3) num5=1; else begin loop5=loop5+1; num5=0; end end else begin loop5=0; num5=0; end always (negedge clk) if(countm) begin if(loop6=3) num6=1; else begin loop6=loop6+1; num6=0; end end else begin loop6=0; num6=0; end always (negedge clk) if(cou
33、nty) begin if(loop7=3) num7=1; else begin loop7=loop7+1; num7=0; end end else begin loop7=0; num7=0; end assign ct1=(num3&clk)|(!num3&min_clk); /ct1用于计时、校时中的分钟计数 assign ct2=(num1&clk)|(!num1&count2); /ct2用于定时状态下调整分钟信号 assign cta=(num4&clk)|(!num4&h_clk); /cta用于计时、校时中的小时计数 assign ctb=(num2&clk)|(!num
34、2&countb); /ctb用于定时状态下调整小时信号 assign ctd=(num5&clk)|(!num5&d_clk); /ctd用于定时状态下调整日信号 assign ctm=(num6&clk)|(!num6&m_clk); /ctm用于定时状态下调整月信号 assign cty=(num7&clk)|(!num7&y_clk); /cty用于定时状态下调整年信号 always (posedge clk_100hz) /秒表功能,0.01秒 begin if(clr)begin ss=0; ssclk=1;end else if(start)begin if(ss = h99)
35、begin ss=0;ssclk=1;end else begin if(ss3:0=h9) begin ss3:0=0; ss7:4=ss7:4+1; end else ss3:0=ss3:0+1; ssclk=0; end end endalways (posedge ssclk or posedge clr) /秒表功能,秒 begin if(clr) begin ssec=0;smclk=1;end else if(start)begin if(ssec = h59) begin ssec=0;smclk=1;end else begin if(ssec3:0=h9) begin ss
36、ec3:0=0; ssec7:4=ssec7:4+1; end else ssec3:0=ssec3:0+1; smclk=0; end end endalways (posedge smclk) /秒表功能,分 begin if(clr) sm=0; else if(start)begin if(sm = h59) sm=0; else begin if(sm3:0=h9) begin sm3:0=0; sm7:4=sm7:4+1; end else sm3:0=sm3:0+1; end endendalways (posedge clk_1Hz) /秒计时和秒调整进程 if(!(sec18h59)|turn&(!m) begin sec1=0; if(!(turn&(!m) minclk=1; end /按住“turn”按键一段时间,秒信号可清零,该功能用于手动精确调时