多功能电子钟设计报告.docx
《多功能电子钟设计报告.docx》由会员分享,可在线阅读,更多相关《多功能电子钟设计报告.docx(48页珍藏版)》请在冰豆网上搜索。
多功能电子钟设计报告
电子技术综合训练
设计报告
题目:
多功能电子钟设计
姓名:
蔡冰倩
学号:
10230625
班级:
控制工程基地一班
同组成员:
吴博
指导教师:
杨新华
日期:
2012年1月1号
摘要
通过CPLD/FPGA可编程逻辑器件实现多功能电子钟。
电子钟的主要功能有计时功能、校正功能、整点报时功能及定时闹叫功能。
针对功能要求利用硬件描述语言设计程序,通过Quartus软件进行仿真分析,将程序下载到电路中,观察数码管可知实现其逻辑功能。
利用可编程逻辑器件可简化电路,实现功能的多样性。
关键字:
多功能电子钟硬件描述语言可编程逻辑器件
1设计任务和要求………………………………………………………………4
1.1设计任务……………………………………………………………4
1.2设计要求……………………………………………………………4
2系统设计………………………………………………………………………5
2.1系统要求……………………………………………………………5
2.2方案设计……………………………………………………………6
2.3系统工作原理………………………………………………………6
3电子钟功能模块及仿真..........................................7
3.1分频模块及其仿真……………………………………………………7
3.2计时模块及其仿真……………………………………………………9
3.3定时模块及其仿真……………………………………………………11
3.4按键消抖模块及其仿真………………………………………………14
3.5译码显示模块及其仿真………………………………………………15
3.6例化模块………………………………………………………………18
4元件的选择……………………………………………………………………44
5电路安装、调试与测试……………………………………………………….45
5.1电路安装…………………………………………………………….45
5.2电路调试…………………………………………………………….46
5.3系统功能及性能测试……………………………………………….46
5.3.1测试方法设计………………………………………………….46
5.3.2测试结果及分析……………………………………………….47
6结论…………………………………………………………………………….48
7参考文献……………………………………………………………………….48
8总结、体会和建议…………………………………………………………….49
附录:
电路原理图……………………………………………………………..50
元器件清单……………………………………………………………….53
1设计任务及要求
1.1设计任务
设计任务是进行设计的基础,根据对设计任务的分析和理解进行设计电路及相应元器件的选择,从而进行电路仿真和调试。
所以对设计任务的理解和分析是进行设计的关键。
本设计的设计任务为:
利用CPLD/FPGA设计一个多功能电子钟。
数字电子钟是一种用数字显示秒、分、时的计时装置,由于十足集成电路技术的发展,使数字钟走时准确、多功能化且性能稳定等优点。
利用CPLD/FPGA设计一个可实现计时、校时、整点报时、定时闹叫多功能的电子钟,需要分两步走。
首先,通过VerilogHDL硬件描述语言进行代码的编写,利用Quartus进行编译和仿真。
其次,根据设计任务和要求选择器件进行电路的焊接。
1.2设计要求
设计要求是完成设计指标的导航,只有很好的分析和了解设计的要求,才可以完成相应的设计。
设计要求:
利用实验室EDA实验箱上的CPLD/FPGA、LED显示器、扬声器、拨码开关等资源,设计一个多功能电子钟,要求具有以下功能:
1、数字形式显示月、日、时、分、秒,在分和秒之间显示“:
”,并按1次/秒的速度闪烁;
2、日以24小时为一个记时周期;
3、有校正功能,能够在任何时刻对电子钟进行方便的校正;
4、有定时闹叫功能,能够按照任意预先设置的时间闹叫,驱动小型扬声器工作,并要求在闹叫状态能够手动消除闹叫;
5、整点时刻通过扬声器给出提示;
6、采用CPLD/FPGA可编程逻辑器件实现;
针对设计要求可做简单分析:
所设计的多功能电子钟需要实现计时、整点报时、定时闹叫和校正功能。
计时需要有相应的计时器实现,整点报时需要相应的报时电路和小功率扬声器,定时闹叫需要通过编写的VerilogHDL程序实现定时和在时间到时驱动小功率扬声器报时,校正电路需要有拨码开关和其他电路实现。
对设计要求的理解:
2系统设计
2.1系统要求
通过FPGA/CPLD实现多功能电子钟的设计。
电子钟要实现计时、校时、定时闹叫等功能。
通过对设计要求的每条的详细分析可得出如下结果:
1、要实现显示月、日、时、分、秒,需要十个LED数码管;要在分和秒之间显示“:
”,可以利用两个发光二极管,也可以选择含有“:
”的LED数码管;要按1次/秒的速度闪烁,则需要1Hz的输入脉冲控制,所以需要通过晶振产生方波,经过分频产生1Hz的方波。
2、要实现24小时为一个计时周期,则需要一个24进制计时器控制其计数。
3、要实现校正功能,则需要一个校正电路(含校正开关)和相应的校正程序。
4、要实现定时闹叫功能,则需要一个时钟脉冲来控制,使其在设定的时刻报时。
外接一个小型扬声器,在设定时刻闹叫,并通过开关消除闹叫,同时也需要相应的程序控制。
5、通过分频电路实现整点报时所需时钟信号,需设计相应的程序段使其在59分,59秒时报时。
6、根性要求设计VerilogHDL程序,并在Quartus软件上进行编译和仿真,从而根据资源的需求选择CPLD/FPGA可编程逻辑器件。
要实现系统要求,需要VerilogHDL程序和Quartus软件的支持。
下面对其进行简单介绍:
(1)利用VerilogHDL硬件描述语言实现功能程序。
VerilogHDL是广泛应用的硬件描述语言,可以用在硬件设计流程的建模、综合和模拟等多个阶段。
通过应用VerilogHDL对多功能电子钟的设计,可实现系统的设计要求。
VerilogHDL硬件描述语是一种实用性很强的编程语言,可以实现软件程序和硬件程序的结合,即将所编写的程序在仿真通过后利用下载器下载到电路板上,通过程序控制器件的工作。
模块是Verilog的基本描述单位,用于描述某个设计的功能或结构及其与其他模块通信的外部端口。
一个设计的结构可使用开关级原语、门级原语和用户定义的原语方式描述;设计的数据流行为使用连续赋值语句进行描述;时序行为使用过程结构描述。
一个模块可以在另一个模块中使用。
(2)Quartus是Alterat提供的FPGA/CPLD开发集成环境,支持VerilogHDL的设计流程。
其包括模块化的编辑器,也可以利用第三方的综合工具,具有仿真功能。
Quartus的设计流程为:
设计输入,综合或编译,适配器件,仿真,下载。
通过Quartus可实现对程序的仿真和下载,从而实现系统的要求。
2.2方案设计
根据系统要求,将设计程序分为计时模块、整点报时模块、定时闹叫模块、校正模块四大模块,通过模块的例化实现所有功能。
所对应的硬件连接可分为集成芯片、复位电路、校正电路、晶振电路、响铃电路、译码显示电路几个模块。
对可编程逻辑器件的选择是实现硬件电路的基础。
根据要求本设计可选择芯片EPM7023或者芯片EP2C5T144C8。
但通过查阅资料可知EPM7023只有44个引脚,可能会导致资源不足,即引脚不够用,驱动能力不足,所以选择altera公司的cycloneⅡ系列的EP2C5T144C8芯片。
下面对芯片做简要介绍:
⑴拥有丰富的UserIO(用户IO引脚),即144个IO接口可供使用。
开发板通过2.54mm标准排针,引出了所有的用户IO引脚。
芯片引脚分为四组(Bank),每组(每个Bank)的IO引脚供电是独立的,因此可以采用不同的电平标准。
⑵内部需要三个电压:
5V、3.3V、1.2V,其中3.3V给IO接口供电,1.2V给内核供电。
⑶含有2个PLL。
PLL的作用是产生各种频率的时钟,在FPGA中拥有重要的地位。
2.3系统工作原理
通过晶振产生一个时钟脉冲,成为主时钟。
在通过分频电路输出所需要的时钟脉冲,即1Hz的计时脉冲。
计时时,当秒计数器计到59时,向分计时器进1;当分钟计数器计到59,秒计数器计到59时,向小时计时器进1;当小时计时器计到23,分钟计数器计到59,秒计数器计到59时,向日期计时器进1;当日期计时器计到29,小时计时器计到23,分钟计数器计到59,秒计数器计到59时,向月份计数器进1。
将所计时间通过LED数码管显示出来。
定时闹叫时,设置闹铃的分钟和小时,设置的时候由转换按键控制调整分钟及调整小时之间的切换,每按一次调整键,所调整的计数器加1,分钟计数器计满60就清0,小时计时器计满24就清0。
当到所定时间时,驱动小功率扬声器工作,发出响铃声。
整点报时的工作原理为当秒计数器为0,分计时器为0时,驱动小功率扬声器发出报时声。
校时为修正日期、月份、小时和分钟的时间以及秒钟的精确调整清零。
由转换按键控制调整分钟和调整小时之间的切换,每按一下调整键所调整的计数器加1,分钟计数器满60清零,小时计数器满24清零;秒种的精确调整清零具体为在正常计时的情况下,长时间按住转换按键,即可使秒钟清零,进行精确调时。
秒表工作原理为进行手动计时,按一下计数按键为计时,再按一次计数按键为停止计时,保存计数数值,依此类推;按一次清零键为计数清零,停止计数。
3.电子钟功能模块及仿真
3.1分频模块
分频模块的程序:
`timescale1ns/100ps
modulecount32(
asyn_clr_n,//input,异步清零信号
syn_clr,//input,同步清零信号
clk,//input,全局时钟信号
en,//input,计数使能信号,计数器的门控开关,计数器关闭后,保持数值不变。
counter//output,计数器计数值
);
/********************************************
参数声明
********************************************/
parameterU_DLY=1;//Unitdelay
inputasyn_clr_n;//0-clearcounter;
inputsyn_clr;//1-clearcounter;
inputclk;
inputen;//1-enable;0-disable.
output[31:
0]counter;
reg[15:
0]cnt_high;//计数器高16位
reg[15:
0]cnt_low;//计数器低16位
regcnt_low_max;//cnt_low达到最大值的标志
assigncounter={cnt_high,cnt_low};//32位计数器由2个16位计数器拼接而成。
//分段计数:
低16位计数器
always@(posedgeclkornegedgeasyn_clr_n)
if(asyn_clr_n==1'b0)//异步清零
cnt_low<=16'h0000;//删除时序逻辑中异步复位的单位延时
elseif(syn_clr==1'b1)//同步清零
cnt_low<=#U_DLY16'h0000;
elseif(en==1'b1)//计数器使能
cnt_low<=#U_DLYcnt_low+16'h0001;
else;//保持
//低16位计数器的进位标志
always@(posedgeclkornegedgeasyn_clr_n)
if(asyn_clr_n==1'b0)//异步清零,清除进位
cnt_low_max<=1'b0;//删除时序逻辑中异步复位的单位延时。
elseif(syn_clr==1'b1)//同步清零,清除进位
cnt_low_max<=#U_DLY1'b0;
elseif(en==1'b1&&cnt_low==16'hfffe)//计数器使能,且低16位计满则产生进位。
//因为从进位产生到cnt_high进程读到此进位需要一个时钟周期,所以计数器只计到16'hfffe
cnt_low_max<=#U_DLY1'b1;
else//否则无进位产生
cnt_low_max<=#U_DLY1'b0;
//分段计数:
高16位计数器
always@(posedgeclkornegedgeasyn_clr_n)
if(asyn_clr_n==1'b0)//异步清零
cnt_high<=16'h0000;//删除时序逻辑中异步复位的单位延时
elseif(syn_clr==1'b1)//同步清零
cnt_high<=#U_DLY16'h0000;
elseif(en==1'b1&&cnt_low_max==1'b1)//计数器使能,且低16位计数器已计满
cnt_high<=#U_DLYcnt_high+16'h0001;
else;//保持
endmodule
仿真波形图:
3.2计时模块
计数模块仿真程序:
`timescale1ns/100ps
modulecounter(
/*******************************************/
//输入PORT说明
/*******************************************/
inputwireclk,//输入时钟
inputwirerst_n,//输入复位
inputwirecounter_clk_pul,//计数时钟脉冲
inputwireset_add,//设定进位
inputwirecin,//设定进位
/*******************************************/
//输出PORT说明
/*******************************************/
outputwirecout,//满进位
outputwire[3:
0]gewei,//输出个位
outputwire[3:
0]shiwei//输出十位
);
parameter[6:
0]MAX_NUM=6'd59;
reg[6:
0]current_num;
always@(posedgeclkornegedgerst_n)begin
if(rst_n==1'b0)begin
current_num[6:
0]<=7'h00;
end
elseif(set_add==1'b1&&cin==1'b1&&counter_clk_pul==1'b1)begin
current_num[6:
0]<=current_num[6:
0]+7'h03;
end
elseif(set_add==1'b1&&cin==1'b1)begin
current_num[6:
0]<=current_num[6:
0]+7'h02;
end
elseif((set_add==1'b1||cin==1'b1)&&counter_clk_pul==1'b1)begin
current_num[6:
0]<=current_num[6:
0]+7'h02;
end
elseif((set_add==1'b1||cin==1'b1))begin
current_num[6:
0]<=current_num[6:
0]+7'h01;
end
elseif(counter_clk_pul==1'b1)begin
current_num[6:
0]<=current_num[6:
0]+7'h01;
end
elseif(current_num>MAX_NUM)begin
current_num[6:
0]<=current_num[6:
0]-MAX_NUM-1;
end
else;
end
assigncout=(current_num>MAX_NUM);//只取一个时钟脉冲长度
assigngewei[3:
0]=current_num[6:
0]%10;
assignshiwei[3:
0]=(current_num[6:
0]/10)%10;
endmodule
仿真波形图:
3.3按键消抖模块
按键消抖模块程序:
`timescale1ns/100ps//表示时延单位为1ns,时延精度为100ps
moduledelay_filter_glitch_high(
inputwirerst_n,//input,异步清零信号
inputwireclk,//input,全局时钟信号
inputwireen_cnt,//input,计数使能信号,可决定计数频率
inputwiresignal_in_n,//input,输入信号
outputregsignal_out_n//output,处理后的信号
);
/*******************************************///参数声明
/********************************************/
parameterU_DLY=1;//Unitdelay
parameterCNT_WIDTH=5'b11111;//计数位宽
parameterCNT_TH=5'b11111;//计数门限,可决定延时时长
/********************************************/
//内部信号申明
/********************************************/
reg[CNT_WIDTH-1:
0]cnt;//计数器
regsignal_in_n_1dly;
regsignal_in_n_2dly;
regsignal_in_n_3dly;
wiresignal_in_edge;//指示输入信号的上升/下降沿
/********************************************
行为描述
********************************************/
//异步信号的同步处理
always@(posedgeclkornegedgerst_n)
begin
if(rst_n==1'b0)begin
signal_in_n_1dly<=#U_DLY1'b1;
signal_in_n_2dly<=#U_DLY1'b1;
signal_in_n_3dly<=#U_DLY1'b1;
end
elsebegin
signal_in_n_1dly<=#U_DLYsignal_in_n;
signal_in_n_2dly<=#U_DLYsignal_in_n_1dly;
signal_in_n_3dly<=#U_DLYsignal_in_n_2dly;
end
end
assignsignal_in_edge=signal_in_n_3dly^signal_in_n_2dly;//产生信号上升/下降沿指示信号
always@(posedgeclkornegedgerst_n)
begin
if(rst_n==1'b0)
cnt<=#U_DLY1'd0;
elseif(signal_in_edge==1'b1)//检测输入信号有跳变后,计数器就清零
cnt<=#U_DLY1'd0;
elseif(en_cnt==1'b1&&cnt!
=CNT_TH)//计数器没计满后加1计数
cnt<=#U_DLYcnt+1'd1;
else;//否则,保持原来的数值
end
always@(posedgeclkornegedgerst_n)
begin
if(rst_n==1'b0)
signal_out_n<=#U_DLY1'b1;
elseif(cnt==CNT_TH)
signal_out_n<=#U_DLYsignal_in_n_3dly;
else;
end
endmodule
仿真波形图
3.4定时模块
校时模块为在任意时刻可以对月、日、时、分、秒进行校正。
校时模块程序:
`timescale1ns/100ps
modulecounter_ds(
/*******************************************/
//输入PORT说明
/*******************************************/
inputwireclk,//输入时钟
inputwirerst_n,//输入复位
inputwireset_add,//设定进位
outputwire[3:
0]gewei,//输出个位
outputwire[3:
0]shiwei//输出十位
);
parameter[6:
0]MAX_NUM=6'd59;
reg[6:
0]current_num;
always@(posedgeclkornegedgerst_n)begin
if(rst_n==1'b0)begin
current_num[6:
0]<=7'b0;
end
elseif(set_add==1'b1)begin
current_num[6:
0]<=current_num[6:
0]+1'b1