您好,欢迎来到东饰资讯网。
搜索
您的当前位置:首页多功能数字钟实习报告——西南交通大学

多功能数字钟实习报告——西南交通大学

来源:东饰资讯网


西南交通大学

课程设计报告 多功能数字钟

设计任务及要求

课程设计——多功能数字钟

1.设计任务:设计一个多功能数字钟,实现以下功能

基本要求:

(1).时间的显示与设置 (2).闹钟,闹钟提示音为音乐 (3).日期的显示与设置 (4).秒表

2.设计说明

(1) SW1功能键用来选择不同的功能模式: • 1号功能:时间正常显示 • 2号功能:时间的调整与设置 • 3号功能:闹钟的设置与查看 • 4号功能:日期的正常显示 • 5号功能:日期的调整与设置 • 6号功能:秒表功能

(2) SW2主要用于闹钟设置、时间的调整与设置、日期的调整与设置中的位置选择按钮,与功能键SW1配合使用,具体功能如下:

• 2号功能模式,即时间的调整与设置时,用作时、分、秒的移位,按一下,将会实现“时-分-秒”的依次移位,便于调整键SW3在特定位置进行调整。

• 3号功能模式,即闹钟的设置与查看时,用作时、分、秒的移位,按一下,将会实现“时-分-秒”的依次移位,便于调整键SW3在特定位置进行调整。

• 5号功能模式,即日期的调整与设置时,用作年、月、日的移位,按一下,将会实现“年-月-日”的依次移位,便于调整键SW3在特定位置进行调整。

(3) SW3主要用于闹钟设置、时间调整与设置、日期调整与设置中的调整按钮。与功能键SW1配合使用,具体功能如下:

• 2号功能模式,即时间的调整与设置时,用作时、分、秒数字的调整,按一下,将会使得当前调整键SW2选择的位置数字增加1。

• 3号功能模式,即闹钟的设置与查看时,用作时、分、秒数字的调整,按一下,将会使得当前调整键SW2选择的位置数字增加1。

• 5号功能模式,即日期的调整与设置时,用作年、月、日数字的调整,按一下,将会使得当前调整键SW2选择的位置数字增加1。

(4) 3.提示

• 显示部分可采用动态数码管显示

• 为避免损坏器件,可编程器件的输入和数码管的输入前需要接入几百欧的电阻限流。

• 按键消抖:

通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动,为了不产生这种现象而作的措施就是按键消抖。

按键的消抖,可用硬件或软件两种方法。本次设计建议采用软件的方法进行按键消抖,即检测出键闭合后执行一个延时程序,5ms~10ms的延时,让前沿抖动消失后再一次检测键的状态,如果仍保持闭合状态电平,则确认为真正有键按下。当检测到按键释放后,也要给5ms~10ms的延时,待后沿抖动消失后才能转入该键的处理程序。

• 时基的输入信号可采用EPM570T100C芯片自带的5.56MHz的信号。

4.时基部分可采用开发板上自带的50MHz信号进行分频。

目录

第1章 绪 论 ......................................................... 2 1.1 背景和意义 ........................................................ 2

第2章 设计 ........................................................... 2 2.1 设计方案和可行性分析 .............................................. 2 2.1.1设计方案 ........................................................ 2 2.1.2可行性分析 ...................................................... 3 2. 2.系统框图及部分功能描述 .......................................... 4 2.2.1系统框图 ........................................................ 4 2.2.2 部分功能介绍 .................................................... 4 2.3 程序设计及代码 .................................................... 5 2.3.1程序设计及代码 .................................................. 5 2.4 测试步骤及过程 .................................................. 26 2.4.1测试步骤 ....................................................... 26 2.4.2测试过程 ....................................................... 26 2.4.3遇到的问题及解决 ............................................... 26 2.5 设计成果图 ....................................................... 26

第3章 总结 .......................................................... 29 3.1设计成果总结 ..................................................... 29 3.2收获及感想 ....................................................... 29

参考文献 ............................................................. 29

- 1 -

第1章 绪 论

背景和意义

数字钟是现代计时器,也可以用作时间控制的时钟源。数字钟由于其具有走时准,显示直观,款式新颖,附加功能多等特点而受到人们的欢迎。设计一个具有整点报时,可对时的数字钟。由于数字集成电路的发展和石英晶体震荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。如定时自动报警、按时自动打铃、定时广播、自动启闭路灯、甚至各种定时电器的自动启用等,所有这些,都是一钟表数字化为基础的。因此研究数字钟及扩大其应用,有着非常现实的意义。

第2章 设计

2.1设计方案和可行性分析 2.1.1 设计方案

整个电路由计数模块、分频模块、校时、校分校秒模块,清零模块、保持模块,整点报时模块,闹钟设定模块、报警模块,以及年月周模块构成。(如下图所示)

基本功能:数字计时器基本功能是计时,因此首先需要获得具有精确震荡时间的脉冲信号,以此作为计时电路的时序基础,实验中可以使用的振荡频率源为50MHZM通过分频获得所需脉冲频率(1Hz,2Hz,4Hz,500Hz,1KHz,6MHz)。经过Verilog编程可以轻松获得较为精确的分频信号。 通过编程用模24计数器实现。

校时,校分及校秒模块则通过语言选择实现。 清零及保持功能在计数模块中用判断语句可轻松实现。

计数模块总共输出为6路信号:秒位的个、十位、分位的个、十位及时位的个、十位。

整点报时模块: 利用计数模块的输出作为报时模块的输入,当检测到59’53`”,59’55”,59’57”时令报时模块输出为1Kz,驱动蜂鸣器产生不同的响声。 闹钟设定模块: 这里设计一个闹钟模块,输入为计数模块的输出及一系列调节信号,输出接到译码模块上。

在计数模块中,秒位和分位分别通过编程用模60计数器实现,时位

- 2 -

在闹钟模块内部,核心模块时一个选择模块,选择输出的信号是闹钟显示还是正常计数显示。为了是使闹钟模块与技术模块是相互的,因此单独设计模24(闹钟小时)和模60(闹钟分钟)作为选择模块的输入。设计程序语言的思想是,当检测到与设定闹钟相同的时、分位时就输出一个信号1,并保存当前技术位(加1)当检测到当前信号与保存位相同时输出信号恢复为0。(这个信号将作为闹铃结束的判断信号)

蜂鸣器鸣响模块:本程序选用了音乐闹铃,通过编程实现输出为符合的音律的不同频率。程序实现的思想并不复杂。蜂鸣器何时鸣叫取决于闹钟模块的输出。 译码显示模块:本模块没有采用Verilog语言实现,通过搭建原理图实现。显示功能是通过数选器、译码器、码转换器和7段显示管实现的。因为实验中只用一个译码显示单元,6个7段(用于显示时分秒),所以通过1个24选4MUX和一个3-8译码器配合,显示译码器采用7447,根据计数器的信号进行数码管的动态显示。 年月日模块:通过编程可以轻松实现,原理与上述计数模块,调节模块很是类似。

图(一)实验模块原理图

校秒模块 校分模块 校时模块 分频模块 动态扫描 译码显示模 计 数 模 块 整点报时模块 闹钟设定模块 蜂鸣器鸣响模秒表模块(包含保持和清年月日模块(包含设定可行性分析

Verilog HDL是一种硬件描述语言(HDL:Hardware Discription Language),

- 3 -

是一种以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。

2.2系统框图及部分功能描述 2.2.1系统框图

系统框图如下图(二)所示:

SW1SW2SW3功能键按键消抖调整键1调整键2可编程逻辑器件LED显示 图(二)系统框图

2.2.2部分功能描述

(1)sw1,sw2,sw3为三个控制按键功能分别为时钟功能切换,时钟设置和调整时对调整位置进行选择,对时钟进行设置。 (2)按键消抖模块的功能:

由于当我们通过按键调整时钟是会存在抖动,而抖动会产生干扰脉冲对时钟调整造成很大干扰,是无法准确的进行调整,故此模块的功能是将抖动产生的干扰信号去掉,消除抖动对时钟调整的干扰。 (3)可编程逻辑器件模块结构图和功能: 结构图如下图(三)所示:

如图显示该模块为一个综合模块其包含了多个分模块,分别为:分频模块、时分秒计时模块、时分秒调整与设置模块、闹钟设置和查看模块、日期计时模块、时间调整与设置模块、按键控制模块还有译码动态扫描模块。该模块是电路的核心也是整个数字钟的核心。数字中的各种功能就是在该可编程逻辑器件里实现,各分模块在

- 4 -

时基分频模块1Hz时间的正常计时动态显示频率主控制模块1号功能使能SW12号功能使能3号功能使能4号功能使能5号功能使能SW2SW3日期的正常计时闹钟的设置与查看闹钟译码显示模块(动态显示)跟据功能键不同,进行显示位选信号时间的调整与设置段选信号日期的调整与设置 图(三) 可编程逻辑器件模块结构图 可编程逻辑器件内紧密联系、相互协调从而实现数字钟的各种功能。

(4)LED显示模块:该模块的主要功能就是对可编程逻辑器件输出的译码和动态扫描结果进行显示。包括时间显示、日期显示、闹钟显示和秒表显示几个部分。

2.3程序及代码

2.3.1

分频模块:

主要是将50mhz的频率分为我们所需的1khz的频率。 module fengpingsm(clk_50m,clk_1000); input clk_50m; output clk_1000; reg[24:0] count; reg clk_1k;

always @ (posedge clk_50m) if(count == 25'd25000)

begin clk_1000<=~clk_1000;count<=0;

end

else count<=count+1; endmodule

分频模块的电路图为图(四)分频电路所示:

- 5 -

图(四)分频电路

2.3.2消抖部分:

clk为1khz的频率,他的周期是1ms。 key_in为输入信号 sw为输出信号

当key_count计数为在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;

reg[4:0]key_count; always @ (posedge clk) begin

if(key_in==1) begin

key_count<=key_count+1'b1; sw<=1'b0;

if(key_count>='d20) begin

key_count<='d21; sw<=1'b1; end end else begin sw<=1'b0; key_count<=1'b0; end

- 6 -

end endmodule

我们在消抖的时间设置的是20ms. 消抖电路如下图(五)消抖电路所示:

图(五)消抖电路

2.3.3闹钟音乐模块

/音乐产生模块

module song(clk_50mhz,clk_4hz,speaker,alert); //模块名为song(端口列表) input clk_50mhz,clk_4hz,alert; //定义两个输入端口 output speaker; //定义一个输出端口 reg[3:0] high,med,low; //定义了3个4位寄存器 reg[13:0] divider,origin; //定义了2个14位寄存器 reg[4:0] counter;

reg speaker; wire carry;

assign carry=(divider==16383); //连续赋值语句 always @(posedge clk_50mhz) begin

if(carry) begin divider<=origin; end else divider<=divider+1; end

always @(posedge carry) if(alert)

begin speaker<=~speaker;end //二分频产生方波信号 else speaker<=0; always @(posedge clk_4hz) begin

case({high,med,low}) //分频比预置 'b000000000011:origin<=7281; //低音3 'b000000000101:origin<=8730; //低音5

- 7 -

'b000000000110:origin<=9565; //低音6 'b000000000111:origin<=10310; //低音7 'b000000010000:origin<=107; //中音1 'b000000100000:origin<=11272; //中音2 'b000000110000:origin<=11831; //中音3 'b000001010000:origin<=12556; //中音5 'b000001100000:origin<=12974; //中音6 'b000100000000:origin<=13516; // 'b000000000000:origin<=16383; //endcase end

always @(posedge clk_4hz) begin

if(counter==20) counter<=0; // else counter<=counter+1;

case(counter) // 0: {high,med,low}<='b000000000011; // 1: {high,med,low}<='b000000000011; // 2: {high,med,low}<='b000000000011; 3: {high,med,low}<='b000000000011;

4: {high,med,low}<='b000000000101; // 5: {high,med,low}<='b000000000101; // 6: {high,med,low}<='b000000000101;

7: {high,med,low}<='b000000000110; // 8: {high,med,low}<='b000000010000; // 9: {high,med,low}<='b000000010000; // 10: {high,med,low}<='b000000010000;

11: {high,med,low}<='b000000100000; // 12: {high,med,low}<='b000000000110; // 13: {high,med,low}<='b000000010000; // 14: {high,med,low}<='b000000000101; // 15: {high,med,low}<='b000000000101;

16: {high,med,low}<='b000001010000; // 17: {high,med,low}<='b000001010000; //

- 8 -

高音1 休止符 计时,以实现循环演奏 记谱 低音\"3\"

持续4个时钟节拍 低音\"5\" 发3个时钟节拍 低音\"6\" 中音\"1\" 发3个时钟节拍 中音\"2\" 低音\"6\" 中音\"1\" 低音\"5\" 中音\"5\" 发3个时钟节拍

18: {high,med,low}<='b000001010000;

19: {high,med,low}<='b000100000000; //高音\"1\" 20: {high,med,low}<='b000001100000; //中音\"6\" endcase end endmodule

音乐电路如下图(六)所示

图(六)音乐产生电路

2.3.4程序主要部分:

Clk:其频率为4Hz;

clk_1k:产生闹铃音、报时音的时钟信号,本例中其频率为1024Hz; mode;功能控制信号; 为0:计时功能; 为1:设置时间功能; 为2: 设置闹钟功能; 为3:正常显示日期功能; 为4:调整日期功能。

Turn;接按键,在手动校时功能时,选择是调整小时,还是分钟; 若长时间按住该键,还可使秒信号清零,用于精确调时; Change:接按键,手动调整时,每按一次,计数器加1;

如果长按,则连续快速加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;

- 9 -

output alert,clk; output[5:0]scan; output[6:0]data;

reg[6:0] count; reg[7:0]

hour,min,sec,hour1,min1,sec1,ahour,amin,year1,month1,day1,sm,ssec,ss; reg[1:0] fm,num1,num2,num3,num4,num5,num6,num7,fm1,fm2,fm4,clock,state; reg[2:0] m;

reg[1:0] loop1,loop2,loop3,loop4,loop5,loop6,loop7,sound; reg[5:0] scan; reg[2:0] cnt,counts; reg[6:0] data; reg[3:0] out; reg[2:0] blink;

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_100hz;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

- - 10

//ear信号用于产生或屏蔽声音

else begin sound<=sound+1; ear<=0; end end

always @(posedge clk_2hz) //由4Hz的输入时钟产生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 if(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;

- - 11

always @(mode or clk_2hz)//产生闪烁 if(m == 4) begin

if(fm4 == 2) begin blink[2] <= clk_2hz; blink[1] <= 1;blink[0] <= 1;end

else if(fm4 == 1) begin blink[2] <= 1; blink[1] <= clk_2hz; blink[0] <= 1;end

else begin blink[2] <= 1; blink[1] <= 1; blink[0] <= clk_2hz;end end

else if(m == 2) begin

if(fm2 == 0)

begin blink[2] <= clk_2hz; blink[1] <= 1;blink[0] <= 1;end else

begin blink[1] <= clk_2hz;blink[2] <= 1;blink[0] <= 1;end end

else if(m == 1) begin if(fm1 == 0)

begin blink[2] <= clk_2hz;blink[1] <= 1;blink[0] <= 1;end else

begin blink[1] <= clk_2hz;blink[2] <= 1;blink[0] <= 1;end end

else blink[2:0] <= 'b111; always begin case(m)

5: clr<=change;

- - 12

//该进程产生

count1,count2,counta,countb,counntd,countm,county四个信号

4: begin

if(fm4 == 2)

begin county<=change;end else if(fm4 == 1)

begin countm<=change;end else

begin countd<=change;end {count2,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,countd,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

- - 13

always @(negedge clk) //产生num2信号 if(countb) begin if(loop2==3) num2<=1; else

begin loop2<=loop2+1; num2<=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; num4<=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

- 14

-

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(county) 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)|(!num2&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) begin ss<=0;ssclk<=1;end else begin

if(ss[3:0]=='h9)

begin ss[3:0]<=0; ss[7:4]<=ss[7:4]+1; end else ss[3:0]<=ss[3:0]+1; ssclk<=0;

- - 15

end end end

always @(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(ssec[3:0]=='h9)

begin ssec[3:0]<=0; ssec[7:4]<=ssec[7:4]+1; end

else ssec[3:0]<=ssec[3:0]+1; smclk<=0; end end end

always @(posedge smclk) //秒表功能,分 begin

if(clr) sm<=0; else if(start)begin

if(sm == 'h59) sm<=0; else begin

if(sm[3:0]=='h9)

begin sm[3:0]<=0; sm[7:4]<=sm[7:4]+1; end else sm[3:0]<=sm[3:0]+1; end end end

always @(posedge clk_1Hz) //秒计时和秒调整进程 if(!(sec1^8'h59)|turn&(!m))

begin sec1<=0; if(!(turn&(!m))) minclk<=1; end

//按住“turn”按键一段时间,秒信号可清零,该功能用于手动精确调时 else begin

- - 16

if(sec1[3:0]==4'b1001)

begin sec1[3:0]<=4'b0000; sec1[7:4]<=sec1[7:4]+1; end else sec1[3:0]<=sec1[3:0]+1; minclk<=0; end

assign min_clk=minclk||count1;

always @(posedge ct1) //分计时和分调整进程 begin

if(min1==8'h59) begin min1<=0; hclk<=1; end else begin

if(min1[3:0]==9)

begin min1[3:0]<=0; min1[7:4]<=min1[7:4]+1; end else min1[3:0]<=min1[3:0]+1; hclk<=0; end end

assign h_clk=hclk||counta;

always @(posedge cta) //小时计时和小时调整进程 if(hour1==8'h23) begin hour1<=0; dclk<=1; end else begin

if(hour1[3:0]==9)

begin hour1[7:4]<=hour1[7:4]+1; hour1[3:0]<=0; end else hour1[3:0]<=hour1[3:0]+1; dclk<=0; end

assign d_clk=dclk||countd;

always @(posedge ctd) //日计时和日调整进程 begin if(day1==0)

- - 17

day1<=1; case(month1) 1: begin

if(day1==8'h31) begin day1<=1;mclk<=1;end else begin

if(day1[3:0]==9) begin day1[3:0]<=0;end

else begin day1[3:0]<=day1[3:0]+1;end mclk<=0; end end 2: if(year1%4) begin

if(day1==8'h28) begin day1<=1;mclk<=1;end else begin

if(day1[3:0]==9) begin day1[3:0]<=0;end

else begin day1[3:0]<=day1[3:0]+1;end mclk<=0; end end else begin

if(day1==8'h29) begin day1<=1;mclk<=1;end else begin

if(day1[3:0]==9) begin day1[3:0]<=0;end

else begin day1[3:0]<=day1[3:0]+1;end mclk<=0; end end

- - 18

day1[7:4]<=day1[7:4]+1;

day1[7:4]<=day1[7:4]+1;

day1[7:4]<=day1[7:4]+1;

3:begin

if(day1==8'h31) begin day1<=1;mclk<=1;end else begin

if(day1[3:0]==9) begin day1[3:0]<=0;end

else begin day1[3:0]<=day1[3:0]+1;end mclk<=0; end end 4:begin

if(day1==8'h30) begin day1<=1;mclk<=1;end else begin

if(day1[3:0]==9) begin day1[3:0]<=0;end

else begin day1[3:0]<=day1[3:0]+1;end mclk<=0; end end 5:begin

if(day1==8'h31) begin day1<=1;mclk<=1;end else begin

if(day1[3:0]==9) begin day1[3:0]<=0;end

else begin day1[3:0]<=day1[3:0]+1;end mclk<=0; end end 6:begin

if(day1==8'h30) begin day1<=1;mclk<=1;end else begin

if(day1[3:0]==9)

- - 19

day1[7:4]<=day1[7:4]+1;

day1[7:4]<=day1[7:4]+1;

day1[7:4]<=day1[7:4]+1;

begin day1[3:0]<=0;end

else begin day1[3:0]<=day1[3:0]+1;end mclk<=0; end end 7:begin

if(day1==8'h31) begin day1<=1;mclk<=1;end else begin

if(day1[3:0]==9) begin day1[3:0]<=0;end

else begin day1[3:0]<=day1[3:0]+1;end mclk<=0; end end 8:begin

if(day1==8'h31) begin day1<=1;mclk<=1;end else begin

if(day1[3:0]==9) begin day1[3:0]<=0;end

else begin day1[3:0]<=day1[3:0]+1;end mclk<=0; end end 9:begin

if(day1==8'h30) begin day1<=1;mclk<=1;end else begin

if(day1[3:0]==9) begin day1[3:0]<=0;end

else begin day1[3:0]<=day1[3:0]+1;end mclk<=0;

- - 20

day1[7:4]<=day1[7:4]+1;

day1[7:4]<=day1[7:4]+1;

day1[7:4]<=day1[7:4]+1;

day1[7:4]<=day1[7:4]+1;

end end 10:begin

if(day1==8'h31) begin day1<=1;mclk<=1;end else begin

if(day1[3:0]==9) begin day1[3:0]<=0;end

else begin day1[3:0]<=day1[3:0]+1;end mclk<=0; end end 11:begin

if(day1==8'h30) begin day1<=1;mclk<=1;end else begin

if(day1[3:0]==9) begin day1[3:0]<=0;end

else begin day1[3:0]<=day1[3:0]+1;end mclk<=0; end end 12:begin

if(day1==8'h31) begin day1<=1;mclk<=1;end else begin

if(day1[3:0]==9) begin day1[3:0]<=0;end

else begin day1[3:0]<=day1[3:0]+1;end mclk<=0; end end default: begin

if(day1==8'h31) begin day1<=1;mclk<=1;end

- - 21

day1[7:4]<=day1[7:4]+1;

day1[7:4]<=day1[7:4]+1;

day1[7:4]<=day1[7:4]+1;

else begin

if(day1[3:0]==9) begin day1[3:0]<=0;end

else begin day1[3:0]<=day1[3:0]+1;end mclk<=0; end end

endcase end

assign m_clk=mclk||countm;

always @(posedge ctm) //月计时和月调整进程 begin

if(month1==8'h12) begin month1<=1; yclk<=1; end else begin

if(month1[3:0]==9)

begin month1[7:4]<=month1[7:4]+1; month1[3:0]<=0; end

else month1[3:0]<=month1[3:0]+1; yclk<=0; end end

assign y_clk=yclk||county;

always @(posedge cty) //年计时和年调整进程 begin

if(year1==8'h99) begin year1<=0; end else if(year1[3:0]==9)

begin year1[7:4]<=year1[7:4]+1; year1[3:0]<=0; end else year1[3:0]<=year1[3:0]+1;

- - 22

day1[7:4]<=day1[7:4]+1;

end

always @(posedge ct2) //闹钟定时功能中的分钟调节进程 if(amin==8'h59) amin<=0; else if(amin[3:0]==9)

begin amin[3:0]<=0; amin[7:4]<=amin[7:4]+1; end else amin[3:0]<=amin[3:0]+1;

always @(posedge ctb) //闹钟定时功能中的小时调节进程 if(ahour==8'h23) ahour<=0; else if(ahour[3:0]==9)

begin ahour[3:0]<=0; ahour[7:4]<=ahour[7:4]+1; end else ahour[3:0]<=ahour[3:0]+1;

always //闹铃功能

if((min1==amin)&&(hour1==ahour)&&(amin|ahour)) begin

//若按住“change”键不放,可屏蔽闹铃音 if(change) alert3<=0;

if((sec1<8'h20) && alert3) alert1<=1; //控制闹铃的时间长短 else alert1<=0; end

else begin alert1<=0;alert3<=1;end

always //时、分、秒的显示控制 case(m) 3'b000:

if(state == 0)

begin hour<=hour1; min<=min1; sec<=sec1; end //计时状态下的时、分、秒显示

else if(state == 1) begin hour<=year1; min<=month1; sec<=day1; end else begin hour<=ahour; min<=amin; sec<=0; end

- - 23

3'b001: begin hour<=hour1; min<=min1; sec<=sec1; end //校时状态下的时、分、秒显示

3'b010: begin hour<=ahour; min<=amin; sec<=0; end //定时状态下的时、分、秒显示

3'b011: begin hour<=year1; min<=month1;sec<=day1; end

3'b100: begin hour<=year1; min<=month1;sec<=day1; end

3'b101: begin hour<=sm;min<=ssec;sec<=ss;end endcase

always @(posedge clk_1k) //数码管动态扫描 begin

if(cnt=='d5) begin cnt<='d0;end else begin cnt<=cnt+1; end end always @(cnt) case(cnt)

3'b000:begin out[3:0]<=sec[3:0]; scan[5:0]<='b000001&{6{blink[0]}};end 3'b001:begin out[3:0]<=sec[7:4]; scan[5:0]<='b000010&{6{blink[0]}};end 3'b010:begin out[3:0]<=min[3:0]; scan[5:0]<='b000100&{6{blink[1]}};end 3'b011:begin out[3:0]<=min[7:4]; scan[5:0]<='b001000&{6{blink[1]}};end 3'b100:begin out[3:0]<=hour[3:0];scan[5:0]<='b010000&{6{blink[2]}};end 3'b101:begin out[3:0]<=hour[7:4];scan[5:0]<='b100000&{6{blink[2]}};end endcase

always @(out) begin

case(out[3:0])

4'b0000:data[6:0]=7'b1111110; 4'b0001:data[6:0]=7'b0110000; 4'b0010:data[6:0]=7'b1101101; 4'b0011:data[6:0]=7'b1111001;

- - 24

4'b0100:data[6:0]=7'b0110011; 4'b0101:data[6:0]=7'b1011011; 4'b0110:data[6:0]=7'b1011111; 4'b0111:data[6:0]=7'b1110000; 4'b1000:data[6:0]=7'b1111111; 4'b1001:data[6:0]=7'b1111011; endcase end

assign alert=((alert1&clock)?1:0)|alert2; //产生闹铃音或整点报时音 always //产生整点报时信号alert2 begin

if((min1==8'h59)&&(sec1>8'h)||(!(min1|sec1))) if(sec1>8'h) alert2<=ear&clk_1k; //产生短音 else alert2<=!ear&clk_1k; //产生长音 else alert2<=0; end endmodule

主体电路如下图(七)所示:

图(七)主体电路

2.4 测试步骤及过程 2.4.1测试步骤

(1)进行波形仿真:在Quartus软件中对各模块模块如:分频模块、计数模块、按键消抖模块、时钟设置模块等用波形仿真进行仿真,通过对输入波形和输出波形的比对和分析,了解各对模块的实现是否正确。

(2)进行开发板测试:这种测试比波形仿真更直观,像时间计时和译码动态扫描显示这样分模块融合成的大模块设计完成后,或所有功能融合成的整体电路设计,都需要使用开发板。

- - 25

2.4.2遇到的问题及解决

(1)波形仿真遇到的问题及解决:刚开始无法得到我们想要的仿真图,一些应该有的规律没有出现,之后发现没有各个模块一步步来,导致出现问题。

(2)硬件电路调试问题及解决:在焊接完电路之后,我们直接把之前调试的代码烧写入开发板中,发现数码管不显示,按键也没反应,后来排查发现之前调试时分配的引脚没有与电路中的引脚对应,然后我们又重新分配引脚,才获得了成功。

2.错误!未定义书签。 设计成果图

(1)quartus电路设计成果如下图(八)功能电路所示:

图(八)功能电路图

(2)PCB板设计的成果如下图(九)PCB原理图和图(十)PCB板所示:

- - 26

图(九)PCB原理图

图(十)PCB板图

- - 27

(3)实际PCB板的正反面图如下图(十一)PCB正面图和图(十二)PCB反面图所示:

图(十一)PCB正面图

- - 28

图(十二)PCB反面图

- - 29

第3章 总结

3.1设计成果总结

我们的设计成果基本上还是实现了所有的设计要求,但是有些细节不让人满意,在画PCB时由于没有考虑到开发板的长度,使得按键开关差点被开发板挡住,还有没能够明白老师的意思,直接把数码管焊接在了电路板上等等。总之,这次课程设计虽然历经波折,但是收获丰富。

3.2收获及感想

(1)收获:

1.加深了自身对电子技术的了解。

2.对Quartus和Altium Designer软件的学习、运用,使得现在可以简单的使用这两种软件。

3.提高自自身的动手能力,能自己制作印刷PCB板,对电路板的焊接更加熟练。 (2)感想:从这次实习中,我们学到了许多,同时也改正了我们存在的不少不足。从中我们学会很多我们之前不会或者不熟悉的技能,并且我们合作完成任务,互有分工,都得到了不少收获,我觉得发现问题并解决问题,自己动手,会给自己带来更多好处以及乐趣。

参考文献

1. 康华光.《数字电子技术基础》(第五版)高等教育出版社。

2. 胡文华,胡仁喜.《Altium Designer 13从入门到精通》机械工业出版社。

- - 30

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuoyibo.cn 版权所有 湘ICP备2023022426号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务