数字时钟.docx
《数字时钟.docx》由会员分享,可在线阅读,更多相关《数字时钟.docx(36页珍藏版)》请在冰豆网上搜索。
![数字时钟.docx](https://file1.bdocx.com/fileroot1/2022-11/16/c343b5ed-6c5d-4c15-b086-dcf88a20a58c/c343b5ed-6c5d-4c15-b086-dcf88a20a58c1.gif)
数字时钟
实验报告
实验名称:
[数字时钟实验]
姓名:
学号:
指导教师:
实验时间:
[2013年6月15日]
信息与通信工程学院
DS1302数字时钟实验
1.实验任务
DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
本实验运用DS1302实现对时间的计时,对日期的计数.利用数码管显示年、月、日、周、日、时、分、秒.能够复位,设置时间,日期.可以换键显示年月日和时分秒.
学会运用FPGA实验箱用verilog语言进行一定的程序编程设计,满足一定的实验要求,掌握fpga的I/O口及并口的使用,能够处理一些简单的实验问题,学会简单的实验设计。
2.实验原理
振荡器产生稳定的高频脉冲信号,作为数字钟的时间基准,然后经过分频器输出标准秒脉冲。
秒计数器满60后向分计数器进位,分计数器满60后向小时计数器进位,小时计数器按照“24翻1”规律计数,月都是12,所以不用特殊设置,日按平年计算,在润年的时候2月减一天即可。
年由于只显示后两位数字就可以,所以用两位显示可以满足。
计数满后各计数器清零,重新计数。
计数器的输出分别经译码器送数码管显示。
计时出现误差时,可以用校时电路校时、校分。
控制信号由1×5矩形键盘输入。
时基电路可以由石英晶体振荡电路构成,假设晶振频率1MHz,经过6次十分频就可以得到秒脉冲信号。
译码显示电路由八段译码器完成。
3.设计流程
4.实验程序
程序初始化
moduleshuzishizhong(Clk0,SEG,DIG,rst,rst_n,sclk,data_io,button);
inputbutton;//用于选择在数码管上显示时间or日历的按键,按下为高电平
inputrst;//外部复位键
inputClk0;//外部输入时钟50Mhz
output[7:
0]SEG,DIG;
outputrst_n;//ds1302的端口RTCnRST
outputsclk;//ds1302的输入时钟RTCCLK
inoutdata_io;//ds1302的io端口RTCIO
reg[12:
0]CNT_R0;//用于将50Mhz时钟分频为10Khz的寄存器
regClk_10KHz;//10Khz时钟
reg[21:
0]count;//用于按键消抖的计数器
regflag=0;//判断显示时间or日历的标识位,0显示时间,1显示日历
reg[2:
0]SCAN_R;
reg[3:
0]SEG_M[7:
0];
reg[7:
0]SEG_DR;
reg[7:
0]SEG,DIG;
wire[23:
0]dat_o_TM;//来着ds1302_drive的存放时间的寄存器
wire[31:
0]dat_o_C;//来着ds1302_drive的存放日历的寄存器
ds1302_drive(.clock(Clk0),.rst(rst),.rst_n(rst_n),.sclk(sclk),.data_io(data_io),.dat_o_TM(dat_o_TM),.dat_o_C(dat_o_C));
驱动程序初始化
moduleds1302_drive(clock,rst,rst_n,sclk,data_io,dat_o_TM,dat_o_C);
inputrst;//外部复位按键重新设置数据
inputclock;
//ds1302端口信号
outputrst_n,sclk;//ds1302的工作时钟
inoutdata_io;
//dat_o_TM信号接六个数码管,分别显示小时,分钟和秒
//dat_o_C信号送到12864显示年,月,日和星期
output[23:
0]dat_o_TM;//读出的时间送出显示
output[31:
0]dat_o_C;//读出的日历送出显示
regrst_n;
regdata;//data_io的缓存,
regclk_us;//状态机的时钟8us/period
regclk_2us;//ds1302的工作时钟
//data_io是双向口,开关link_write管理数据的出入
//link_write为高时,允许输出,为低电平是高阻
reglink_write;
regflag123;//重新设置日历标志位
reg[4:
0]step1;//WR_SET任务的状态
reg[4:
0]step2;//RD_T任务的状态
reg[23:
0]data_out_reg_time;//存放读出的时间
reg[31:
0]data_out_reg_calender;//存放读出的日历
regF;//读任务的标志
regFF;//写任务的标志
reg[7:
0]reg_CMD=0;//command
reg[7:
0]reg_SEC=0;//秒
reg[7:
0]reg_MIN=8'h30;//分钟
reg[7:
0]reg_H=8'h09;//小时
reg[7:
0]reg_DAY=8'h03;//天
reg[7:
0]reg_MONTH=8'h06;//月
reg[7:
0]reg_X=8'h01;//星期
reg[7:
0]reg_YEAR=8'h13;//年
reg[7:
0]register1;//写操作的指令存器
reg[7:
0]register3;//读操作读进数据的寄存器
reg[7:
0]register4;//读操作的指令寄存器
reg[3:
0]state;//状态机
//===============================================
//初始设置的状态参数
//写状态
parameter
IDLE=4'b0000,
WR_S=4'b0001,
WR_Min=4'b0010,
WR_H=4'b0011,
WR_X=4'b0100,
WR_D=4'b0101,
WR_M=4'b0110,
WR_Y=4'b0111;
//===============================================
//===============================================
parameter//状态读
RD_S=4'b1000,
RD_Min=4'b1001,
RD_H=4'b1010,
RD_X=4'b1011,
RD_D=4'b1100,
RD_M=4'b1101,
RD_Y=4'b1110,
CLOSE_W=4'b1111;
//===============================================
//WR_SET任务的参数
parameter
step1_f0=5'b00000,
step1_f1=5'b00001,
step1_f2=5'b00010,
step1_f3=5'b00011,
step1_f4=5'b00100,
step1_f5=5'b00101,
step1_f6=5'b00110,
step1_f7=5'b00111,
step1_f8=5'b01000,
step1_f9=5'b01001,
step1_fa=5'b01010,
step1_fb=5'b01011,
step1_fc=5'b01100,
step1_fd=5'b01101,
step1_fe=5'b01110,
step1_ff=5'b01111,
step1_f10=5'b10000;
//===============================================
//RD_T任务的参数
parameter
step2_f0=5'b00000,
step2_f1=5'b00001,
step2_f2=5'b00010,
step2_f3=5'b00011,
step2_f4=5'b00100,
step2_f5=5'b00101,
step2_f6=5'b00110,
step2_f7=5'b00111,
step2_f8=5'b01000,
step2_f9=5'b01001,
step2_fa=5'b01010,
step2_fb=5'b01011,
step2_fc=5'b01100,
step2_fd=5'b01101,
step2_fe=5'b01110,
step2_ff=5'b01111,
step2_f10=5'b10000;
//++++++++++++++++++++++++++++++++++++++++++++++
//本模块的时钟20nsX200X2=8us/period,
reg[8:
0]counter;
5.管脚分配
6.实验结果
如图所示实验版通过对左边3和4按键的使用可以实现年月日与时分秒的切换,图左上角的数码管用于显示时钟,对实验程序中如下部分的修改可以改变可以使数码管上的时钟改变用于设定时间。
reg[7:
0]reg_SEC=55;//秒
reg[7:
0]reg_MIN=8'h59;//分钟
reg[7:
0]reg_H=8'h23;//小时
reg[7:
0]reg_DAY=8'h31;//天
reg[7:
0]reg_MONTH=8'h12;//月
reg[7:
0]reg_X=8'h04;//星期
reg[7:
0]reg_YEAR=8'h13;//年
6.实验心得
通过实验,更加了解思维严密性的重要,对于实验要有实事求是的态度.了解VerilogHDL的实际应用中的重要性。
了解分频电路,消抖电路的理论基础。
对于实验,要有严谨的态度,扎实的理论。
附录
/*
数码管输出显示部分,将从ds1302读出的时间、日历显示到数码管上,通过按下button键选择在数码管上显示时间还算日期
*/
moduleshuzishizhong(Clk0,SEG,DIG,rst,rst_n,sclk,data_io,button);
inputbutton;//用于选择在数码管上显示时间or日历的按键,按下为高电平
inputrst;//外部复位键
inputClk0;//外部输入时钟50Mhz
output[7:
0]SEG,DIG;
outputrst_n;//ds1302的端口RTCnRST
outputsclk;//ds1302的输入时钟RTCCLK
inoutdata_io;//ds1302的io端口RTCIO
reg[12:
0]CNT_R0;//用于将50Mhz时钟分频为10Khz的寄存器
regClk_10KHz;//10Khz时钟
reg[21: