名称:RTC实时时钟(PCF8563芯片)测试试验设计Verilog代码VIVADO? ARTIX-7开发板
软件:VIVADO
语言:Verilog
代码功能:
RTC实时时钟(PCF8563芯片)测试试验
读取RTC芯片(PCF8563)中的时、分、秒数据,通过led灯显示秒表计数
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
本代码已在ARTIX-7开发板验证,ARTIX-7开发板如下,其他开发板可以修改管脚适配:
设计文档:
RTC试验例程
1实验简介
PCF8563是一款多功能时钟/日历芯片。因其功耗低、控制简单、封装小而广泛应用于电表、水表、传真机、便携式仪器等产品中。本例程中我们将使用FPGA开发板上的PCF8563器件实现RTC实验,并通过LED灯显示RTC的秒输出信号。
2实验原理
2.1、PCF8563原理
PCF8563是PHILIPS公司推出的一款工业级多功能时钟/日历芯片,具有报警功能、定时器功能、时钟输出功能以及中断输出功能,能完成各种复杂的定时服务。其内部功能模块的框图如下图所示:
PCF8563有16个可寻址的8位寄存器,但不是所有位都有用到。前两个寄存器(内存地址00H、01H)用作控制寄存器和状态寄存器(CONTROL_STATUS);内存地址02H~08H用作TIME计时器(秒~年计时器);地址09H~0CH用于报警(ALARM)寄存器(定义报警条件);地址0DH控制CLKOUT管脚的输出频率;地址0EH和0FH分别用于定时器控制寄存器和定时器寄存器。
秒、分钟、小时、日、月、年、分钟报警、小时报警、日报警寄存器中的数据编码格式为BCD,只有星期和星期报警寄存器中的数据不以BCD格式编码。BCD码(Binary-Coded Decimal)是一种二进制的数字编码形式,用四个二进制位来表示一位十进制数(0~9),能够使二进制和十进制之间的转换得以快捷的进行。
PCF8563通过I2C接口与FPGA进行通信。使用该器件时,先通过I2C接口向该器件相应的寄存器写入初始的时间数据(秒~年),然后通过I2C接口读取相应的寄存器的时间数据。有关I2C总线协议详细的介绍请大家参考“EEPROM读写实验”。
下面我们对本次实验用到的寄存器做简要的描述和说明,其他寄存器的描述和说明,请大家参考PCF8563的数据手册。
秒寄存器的的地址为02h,说明如下表所示:
当电源电压低于PCF8563器件的最低供电电压时,VL为“1”,表明内部完整的时钟周期信号不能被保证,可能导致时钟/日历数据不准确。
BCD编码的秒数值如下表所示:
秒寄存器的地址为03h,说明如下表所示:
小时寄存器的地址为04h,说明如下表所示:
天寄存器的地址为05h,说明如下表所示:
当年计数器的值是闰年时,PCF8563自动给二月增加一个值,使其成为29天。月/世纪寄存器的地址为07h,说明如下表所示:
月份 |
Bit4 |
Bit3 |
Bit2 |
Bit1 |
Bit0 |
一月 |
0 |
0 |
0 |
0 |
1 |
二月 |
0 |
0 |
0 |
1 |
0 |
三月 |
0 |
0 |
0 |
1 |
1 |
四月 |
0 |
0 |
1 |
0 |
0 |
五月 |
0 |
0 |
1 |
0 |
1 |
六月 |
0 |
0 |
1 |
1 |
0 |
七月 |
0 |
0 |
1 |
1 |
1 |
八月 |
0 |
1 |
0 |
0 |
0 |
九月 |
0 |
1 |
0 |
0 |
1 |
十月 |
0 |
1 |
0 |
1 |
0 |
十一月 |
0 |
1 |
0 |
1 |
1 |
十二月 |
0 |
1 |
1 |
0 |
0 |
年寄存器的地址为08h,说明如下表所示:
2.2、原理图
PCF8563作为I2C接口的从器件挂接在开发板上的IIC总线上。 OSCI、OSCO与外部32.768KHz的晶振相连,为芯片提供驱动时钟;RTC_SCL和RTC_SDA分别是I2C总线的串行时钟接口和串行数据接口。
FPGA管脚分配如下表所示:
信号名 |
方向 |
管脚 |
BANK |
端口说明 |
RTC_SCL |
output |
T11 |
BANK14 |
IIC时钟信号线 |
RTC_SDA |
inout |
U11 |
BANK14 |
IIC双向数据线 |
3程序设计
本实验的主程序是pcf8563.v,在这个模块主要是按照pcf8563芯片的协议完成IIC接口,进而读取储芯片内部的时间信息。
4实验现象
下载本工程的bit文件,可以看到led灯按照RTC的秒计数递增。
部分代码展示:
`define?SLAVE_ADD_WRITE?8'ha2? `define?SLAVE_ADD_READ?8'ha3? ? module?pcf8563(mclk,reset,scl,sda,s_reg,led,seg,com);? input?mclk;? input?reset;? inout?scl,sda;? output[7:0]?s_reg,led,seg,com;? ? reg?clk;? reg?[7:0]led,seg,com;? reg?scl_hi_z;? reg?sda_hi_z;? reg?scl_reg;? reg?sda_reg;? reg[3:0]?p_state;? reg[7:0]?write_reg;? reg[7:0]?read_reg;? reg[3:0]?seg_reg;? reg[10:0]?i;? reg[7:0]?s_reg;? reg[7:0]?m_reg;? reg[7:0]?h_reg;? reg[7:0]?d_reg;? ? ? reg[3:0]?cnt;? reg[2:0]?cnt1;? integer?cnt2;? reg[15:0]?cnt3;? reg[2:0]?cnt4;? ? parameter?prepare=0;? parameter?idle=1;? parameter?start=2;? parameter?stop=3;? parameter?write_data=4;? parameter?wait_ack=5;? parameter?error=6;? parameter?read_data=7;? parameter?ack=8;? parameter?nack=9;
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=1337