数字钟实验报告.docx
- 文档编号:6543421
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:25
- 大小:132.65KB
数字钟实验报告.docx
《数字钟实验报告.docx》由会员分享,可在线阅读,更多相关《数字钟实验报告.docx(25页珍藏版)》请在冰豆网上搜索。
数字钟实验报告
目录
一、实验目的…………………………………………………………(3)
二、实验要求…………………………………………………………(3)
三、实验平台…………………………………………………………(3)
四、实验总体思路……………………………………………………(3)
五、功能要求…………………………………………………………(4)
六、设计过程…………………………………………………………(4)
七、硬件电路…………………………………………………………(5)
八、电路各程序功能分析……………………………………………(6)
九、实验总图…………………………………………………………(18)
十、波形仿真…………………………………………………………(18)
十一、实验总结…………………………………………………………(21)
数字钟设计
一、实验目的:
1.熟悉和掌握基本电子计数器及数码显示的工作原理。
2.能独立的完成基本电子计数器的设计,并由此设计出带一定功能的电子钟。
3.掌握数字电路系统的设计方法、装调技术及数字钟的功能扩展电路的设计。
二、实验要求:
设计一个能进行时、分、秒计时的十二小时制或二十四小时制的数字钟,并具有定时与闹钟功能,能在设定的时间发出闹铃音,能非常方便地对小时、分钟和秒进行手动调节以校准时间,每逢整点,产生报时音报时。
三、实验平台:
1.一台PC机;
2.MAX+PLUSII10.1。
四、实验总体思路:
这是一个电子钟,其功能如下:
可以实现正常的时钟功能,可以调整时间,整点会报时(用显示灯表示),同时还可以设置闹钟,可以显示所设的闹钟值,闹钟有分响铃(用批示灯表示)。
在需要校正时间时,不需要暂停时间,可以像在手机上操作一样,用TURN键,分别显示对小时调整,对分钟的调整。
为了更好的操作,加一个CHANGE键,为1时,则是每次加1。
对闹钟进行设置时,不影响正常的计时模块,所以不分影响准确的时间。
对每一部分的操作则是通过总的控制模块来实现的。
下图数字钟电路系统的组成框图:
五、功能要求:
A、B:
模式选择,AB=00为模式0,计时状态;
AB=01为模式1,手动校时状态;
AB=10为模式2,闹钟设置状态。
Turn:
turn=0时,在手动校对时,选择调整分钟部分;
turn=1时,在手动校对时,选择调整小时部分。
Change:
在手动校时或闹钟设置模式下,每按一次,计数器加1。
Reset:
reset=0时,整个系统复位;
reset=1时,系统计时或其它特殊功能操作。
Reset1:
reset1=0时,关闭闹铃信号;
reset1=1时,可对闹铃进行设置。
状态显示信号(发光管):
LD_alert:
指示是否设置了闹铃功能;
LD_h:
指示当前调整的是小时信号;
LD_m:
指示当前调整的是分钟信号。
六、设计过程:
根据以上的大致思路,可以得到进一步的数字钟电路系统框图:
本电路主要分为三大模块:
1.控制模块
主要功能为产生各种控制信号,在本电路中采用A1,B1来进行模式控制。
具体如下:
当A1B1=00时,该电路为计时状态。
且会正点报时和当时间和设定的时间一致时响铃20秒。
当A1B1=01时电路为调时状态,且当A1B1=01时,秒停止走时,当结束调时状态时,秒从0开始重新计时,当turn=0时对分钟进行调整,当turn=1时对时信号进行调整,同时分别用LD-H和LD_M分别指示调整的是时信号和分信号。
当A1B1=10时进行闹铃的设置,且当A1B1=01时,秒停止走,但只有当reset1为1时开启闹铃,当reset1为0时关闭闹铃信号,同时当闹铃设置后用Ld_alert来显示是否对闹铃进行了设置。
Clk为时钟输入信号,本实验采用64hz作为时钟输入,clk_lk为显示模块的时钟。
Out为闹铃,当正点时out为1,当设置的时间的时钟走时一致时响铃20秒。
2.计数模块
本模块采用60进制的计数器进行秒计数和分计数,用24进制计数器进行时计数,计数采用的16位计数模式,且能够在秒计到60时分钟加1,当分钟计数为60时向小时加1,当时计到23时,时钟在加1则时从0开始,从而实现正常的手表功能。
在这里采用BCD码进行计数,因为BCD码计数易于在数码管上显示,而且在秒和分采用60进制,而时采用24进制。
3.显示模块
该模块采用高速时钟频率进行各个数码管的使能,同时显示计时,调时,和定时的显示。
本模块的设计思想大体如下:
在现有的实验条件下,所有的数码管采用总线向数码管传送数据,所以本模块采用一个3位二进制计数器,来产生8个状态,其中只有六个状态为有用的状态,然后用三八译码器来对计数器进行译码,并且使高为有效的状态,然后将译码的结果接到数码管的使能端,同时在使能端有效时,将相应的数据传入数码管的数据端。
七、硬件电路:
信号定义:
用6个数码管显示:
用M6M5进行24进制小时的显示;用M4M3进行60进制分的显示;用M2M1进行60进制秒的显示。
OUT:
输出到扬声器的信号,用于产生闹铃音和报时音;闹铃音为持续20秒的“嘀嘀嘀”音,接扬声器。
A、B、C、D、E、F、G对应于每个数码管的使能端。
k1,k2,k3,k4,k5,k6分别接电平开关。
Clk接64hz。
Ld_alert,Ld_h,Ld_m分别指示正在进行的状态,Ld_alert指示是否设置了闹钟,Ld_h,Ld_m分别指示正在调整的是时信号,还是分信号。
状态真值表:
RESET
RESET1
CHANGE
TURN
A1
B1
状态
操作
0
X
X
X
X
X
系统复位
1
0
X
X
0
0
计时
1
0
X
1
0
1
校时
LD_h
1
0
X
0
0
1
校分
LD_m
1
1
X
0
1
0
闹钟设置分
LD_alertLD_m
1
1
X
1
1
0
闹钟设置时
LD_alertLD_h
八、电路各程序功能分析:
1、首先介绍VerilogHDL基本语法:
VerilogHDL程序是由模块构成的。
模块是可以进行层次嵌套的。
正因为如此,才可以将大型的数字电路设计分割成不同的小模块来实现特定的功能,最后通过顶层模块调用子模块来实现整体功能。
每个模块要进行端口定义,并说明输入输出口,然后对模块的功能进行行为逻辑描述。
VerilogHDL程序的书写格式自由,一行可以写几个语句,一个语句也可以分写多行。
除了endmodule语句外,每个语句和数据定义的最后必须有分号
可以用/*.....*/和//...对VerilogHDL程序的任何部分作注释。
一个好的,有使用价值的源程序都应当加上必要的注释,以增强程序的可读性和可维护性。
测试模块常见的形式:
modulet;
reg…;//被测模块输入/输出变量类型定义
wire…;//被测模块输入/输出变量类型定义
initialbegin…;…;…;end……//产生测试信号
always#delaybegin…;end……//产生测试信号
Testedmdm(.in1(ina),.in2(inb),.out1(outa),.out2(outb));
//被测模块的实例引用
initialbegin….;….;….end//记录输出和响应
endmodule
①always功能简介:
由输入信号中任意一个电平发生变化所引起的过程块:
由输入信号中的某一个电平发生变化启动的过程块,可以通过综合产生组合逻辑。
该过程块称为组合块。
如下例所示:
always@(aorb)//实现与门
y=a&b;
由单个跳变沿引起的过程块:
由控制信号的跳变沿(下降沿或上升沿)启动的过程块通过综合可以生成同步逻辑。
该过程块称为同步块。
如下例所示:
always@(posedgeclk)//实现D触发器
q<=d;
在同步块中可以添加异步复位,举例说明如下:
always@(posedgeclkornegedgerst_)
if(!
rst_)
q<=0;
else
q<=d;
②case功能简介:
当Verilog模块中case–endcase块被综合时,有多种门级实现方法可
供选择:
综合指令case可以用来干预综合过程。
让由case指定的编
译方式被综合器优先考虑,即采用case=后列出的方法转换为门级
电路。
case综合指令的含义如下所示:
▪//ambitsynthesiscase=parallel
对解码逻辑进行并行编译,没有优先级。
▪//ambitsynthesiscase=mux
如果库中含有多路器,则使用多路器编译解码逻辑。
▪//ambitsynthesiscase=full
不用考虑没有包含在case条件语句中的情形(即这些情形不会发生),这样设定,可以综合出的优化的门级逻辑,并可避免发生状态机死锁。
③阻塞与非阻塞赋值方式:
赋值的类型的选择取决于建模的逻辑类型
在时序块的RTL代码中使用非阻塞赋值。
非阻塞赋值在块结束后才完成赋值操作,此赋值方式可以避免在仿真出现冒险和竞争现象。
在组合的RTL代码中使用阻塞赋值。
使用阻塞方式对一个变量进行赋值时,此变量的值在在赋值语句执行完后就立即改变。
使用非阻塞赋值方式进行赋值时,各个赋值语句同步执行;因此,通常在一个时钟沿对临时变量进行赋值,而在另一个时钟沿对其进行采样。
下面的模块综合为触发器,
其中采用了阻塞赋值方式:
modulebloc(clk,a,b);
inputclk,a;
outputb;regb;
regy;
always@(posedgeclk)
begin
y=a;
b=y;
end
endmodule
下面的模块综合为两个触发器
,其中采用了非阻塞赋值方式:
modulenonbloc(clk,a,b);
inputclk,a;
outputb;regb;
regy;
always@(posedgeclk)
begin
y<=a;
b<=y;
end
endmodule
④在多重if嵌套语句中,else与前面最近的if相对应(即与前面最近的if组成一对if-else语句。
为确保程序的可读性和语句的对应性,请使用begin…end块语句。
⑤用assign描述逻辑功能:
只用于描述组合逻辑电路,而不用于描述时序逻辑功能电路。
⑥数据类型主要有三种:
线网型:
线网型变量一般使用关键字wire进行定义,在定义变量时,如果没有定义位宽,则默认其位宽为1.
例:
wirea,b;//定义了两个位宽为1的wire型变量a和b
wire[7:
0]c;//定义了一个位宽为8的wire型变量c
寄存器型:
寄存器型变量一般使用关键字reg进行定义,和wire型变量一样可以在定义时加入位宽。
VerilogHDL默认的变量类型是wire型,所以如果某个变量的类型需要为寄存器型,则必须在程序中加以定义。
另个值得注意的是,任何always块内被赋值的变量都必须为寄存器型。
参数型:
参数型变量使用关键字parameter定义,虽然称之为变量,但在同一个模块中每个参数型变量的值必须为一个常量。
2、分析:
moduleclock(A1,B1,clk,clk_lk,turn,change,a,b,c,d,e,f,g,
Ms1,Ms2,Ms3,Ms4,Ms5,Ms6,Ld_h,Ld_m,Ld_alert,out,
reset,reset1);/*信号的定义
当A1,B1为输入控制信号对模式进行选择;其中当A1B1==00时为计时状态
当A1B1=01时为调时状态,且turn=0时调整的为分钟信号,turn=1时调整的为时的信号
当A1B1=10时为定时信号,turn==0时对分钟进行定时,turn==1时对时进行调整
Ms1~Ms6为数码管的使能端
Ld_h,Ld_m,Ld_alert,out分别为调时分信号,和响铃信号(整点报时和定时响铃)和显示是否进行了闹铃设置
reset为清零复位信号,reset1为开启关闭闹铃a,b,c,d,e,f,g为数码管输入信号*/
inputA1,B1,clk,clk_lk,turn,change,reset,reset1;/*输入信号*/
outputa,b,c,d,e,f,g,Ms1,Ms2,Ms3,Ms4,Ms5,Ms6,Ld_h,Ld_m,Ld_alert,out;/*输出信号*/
wireA1,B1,clk,clk_lk,turn,change,reset,reset1,out;
rega,b,c,d,e,f,g,Ms1,Ms2,Ms3,Ms4,Ms5,Ms6,Ld_h,Ld_alert,Ld_m;
regthour,tmin,dhour,dmin;/*调时和定时信号*/
reg[7:
0]hour3,min3,sec3,hour1,min1,sec1,hour2,min2,sec2;/*hour1,min1,sec1为计时和调时状态下时分秒的显示,hour2,min2,sec2为定
时状态下时分秒的显示our3,min3,sec3为时分秒的显示*/
wirect1,ct2,ct3,ct4;/*ct1为分钟调整信号,ct2为时的调整信号,ct3为定分信号,ct4为定时信号*/
regout1,ct5,out2;
reg[2:
0]counter;/*counter为显示模块的状态的计数器*/
reg[0:
6]ou;/*7段译码管的输出端*/
reg[3:
0]cccc;/*7段译码管的输入端*/
wireu,v;
regq1,q2,q3,q4,flag;/*信号消抖*/
reg[7:
0]s;/*时钟分频信号*/
reg[4:
0]m;
/***********************************************************************************/
always@(posedgeclk)/*将64HZ信号变为1HZ信号*/
begin
s<=s+1;
if(s==8'b11111111)
q4<=1;
end
always@(posedgeclk)
if(q4==1)
q2<=q1;
always@(posedgeclk)
if(q4==1)
q1<=change;/*两位D触发器*/
always@(posedgeclk_lk)
begin
if(q4==1)
begin
q3<=~q2;
ct5<=q1&q3;/*ct5为脉冲的消抖的有效信号*/
end
end
/***********************************************************************************/
上述代码为脉冲的消抖:
本实验的调整时间信号和闹钟设定信号采用脉冲触发方式进行调整,即当控制信号上升沿到来时进行调整,这就需要滤掉无用的状态,本实验采用两个D触发器来实现,其原理为当第2个触发器为0第一个触发器为1时调整信号有效,这样就保证了每次按下change信号只调整一个单位。
消抖电路原理图:
/***********************************************************************************/
/*调整,定时状态时分秒的信号控制*/
assignct1=tmin&&change&&ct5;
assignct2=thour&&change&&ct5;
assignct3=dmin&change&ct5;
assignct4=dhour&change&ct5;
/*ct1为分钟调整信号,ct2为时的调整信号,ct3为定分信号,ct4为定时信号*/
/***************************************************************************/
/*******************************************************************************/
/*模式选择过程块*/
/*reset为清零复位信号
当A1,B1为输入控制信号对模式进行选择;其中当A1B1==00时为计时状态
当A1B1=01时为调时状态,且turn=0时调整的为分钟信号,turn=1时调整的为时的信号
当A1B1=10时为定时信号,turn==0时对分钟进行定时,turn==1时对时进行调整
*/
always@(posedgeclk_lk)
if(reset==0)beginthour<=0;tmin<=0;dhour<=0;dmin<=0;Ld_h<=0;Ld_m<=0;end
else
begin
case({A1,B1})
2'b00:
begin{Ld_h,Ld_m}<=0;/*当A1B1==00时,不对时和分进行调整*/thour<=0;tmin<=0;dhour<=0;dmin<=0;Ld_h<=0;Ld_m<=0;end
2'b01:
if(turn==0)
beginLd_h<=0;Ld_m<=1;tmin<=1;dhour<=0;dmin<=0;thour<=0;end
else
beginLd_h<=1;Ld_m<=0;thour<=1;dhour<=0;dmin<=0;tmin<=0;end
2'b10:
if(turn==0)
beginLd_h<=0;Ld_m<=1;dmin<=change;thour<=0;tmin<=0;dhour<=0;end
else
beginLd_h<=1;Ld_m<=0;dhour<=change;thour<=0;tmin<=0;dmin<=0;end
default:
beginthour<=0;tmin<=0;dhour<=0;dmin<=0;Ld_h<=0;Ld_m<=0;end
endcase
end
/**************************************************************************************/
/*******************************************************************************************/
/*分频过程块,flag为1,表示经历了1秒*/
always@(posedgeclk)
begin
m<=m+1;
if(m==6'b11111)
flag<=1;
elseflag<=0;
end
/***********************************************************************************************/
/**********************************************************************************************/
/*秒计时过程块*/
always@(posedgeclk)
if(reset==0)
beginsec1<=0;end/*reset为清零复位信号*/
elseif((A1==0&&B1==1)||(A1==1&&B1==0))
sec1<=8'h00;/*调时和定时状态下秒暂停清零不动*/
elseif(flag==1)
begin
if(sec1==8'h59)
beginsec1[7:
0]<=0;end/*当秒为59s时,sec1[7:
0]为零*/
elseif(sec1[3:
0]==9)
beginsec1[7:
4]<=sec1[7:
4]+1;sec1[3:
0]<=0;end/*当秒的个位为9s,且秒不为59s时,sec1[3:
0]为零并向秒的十位进位*/
elseif(sec1[3:
0]<9)
beginsec1[3:
0]<=sec1[3:
0]+1;end/*当秒的个位小于9s,且秒不为59s时,sec1[3:
0]加1*/
end
/*****************************************************************************************************/
/***************************************************************************************************/
/*分计时和分调整过程块*/
always@(posedgeclk)
if(reset==0)
beginmin1<=8'h00;end/*reset为清零复位信号*/
/*下边为计时状态下分的计算*/
elseif(sec1==8'h59&&flag==1)
begin
if(min1[3:
0]==9)
begin
if(min1[7:
4]==5)beginmin1<=8'h00;end/*当分为59分时,min1[7:
0]为零*/
elsebeginmin1[3:
0]<=0;min1[7:
4]<=min1[7:
4]+1;end
end/*当分小于59分时,min1[7:
4]继续加1*/
elsebeginmin1[3:
0]<=min1[3:
0]+1;end
end
/*下边为调整状态下分的计算*/
elseif(ct1==1)/*ct1为分钟调整信号*/
begin
if(min1[3:
0]==9)
begin
if(min1[7:
4]==5)beginmin1<=8'h00;end
elsebeginmin1[3:
0]<=0;min1[7:
4]<=min1[7:
4]+1;end
end
elsebeginmin1[3:
0]<=min1[3:
0]+1;end/*当分的个位小于9分,且分不为59分时,min1[3:
0]加1*/
end
/*************************************************************************************************************/
/*************************************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 实验 报告