资讯详情

【正点原子FPGA连载】 第二十四章 RTC实时时钟LCD显示实验-摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0

1)实验平台:正点原子领导者ZYNQ开发板 2)平台采购地址:https://item.taobao.com/item.htm?&id=606160108761 3)全套实验源码 手册 视频下载地址:http://www.openedv.com/thread-301505-1-1.html 4)正点原子FPGA感兴趣的同学可以加群讨论:99424016 5)关注正点原子微信官方账号,获取最新信息更新 在这里插入图片描述

第二十四章 RTC实时时钟LCD显示实验

PCF8563是多功能时钟/日历芯片。广泛应用于电表、水表、传真机、便携式仪器等产品电表、水表、传真机、便携式仪器等产品。本章将使用领导者Zynq开发板上的PCF实时时钟显示8563器件。 本章包括以下几个部分: 1.1 PCF8563简介 1.2 实验任务 1.3 硬件设计 1.4 程序设计 1.5 下载验证 ? 1.1 PCF8563简介 PCF8563是PHILIPS公司推出的工业多功能时钟/日历芯片具有报警功能、定时器功能、时钟输出功能和中断输出功能,可完成各种复杂的定时服务。其内部功能模块的框图如下图所示:

图 7.5.13.1 PCF8563功能框图 PCF8563有16个8位寄存器可以找到地址,但并不是所有的寄存器都有用。前两个寄存器(内存地址00H、01H)用于控制寄存器和状态寄存器(CONTROL_STATUS);内存地址02H08H用作TIME计时器(秒年计时器);09地址H~0CH用于报警(ALARM)寄存器(定义报警条件)DH控制CLKOUT管脚输出频率;0地址EH和0FH用于定时器控制寄存器和定时器寄存器。 秒、分钟、小时、日、月、年、分钟报警、小时报警、日报警寄存器中的数据编码格式为BCD,报警寄存器中的数据仅为周和周BCD格式编码。BCD码(Binary-Coded Decimal)它是一种二进制数字编码形式,用四个二进制位表示一个十进制数(0~9)可以快速进行二进制和十进制之间的转换。 PCF8563通过I2C接口与Zynq通信。使用此设备时,Zynq先通过I2C接口将初始时间数据写入设备对应的寄存器(秒~年),然后通过I2C接口读取相应的寄存器时间数据。I2C详细介绍总线协议,请参考EEPROM读写实验。 以下是对本实验中使用的寄存器的简要描述和说明请参考其他寄存器的描述和说明PCF数据手册8563。 二秒寄存器的地址是02h,说明如下表所示: 表 24.1.1 寄存器描述(地址02)h) Bit 符号 描述 7 VL VL=0确保准确的时钟/日历数据 VL=1不保证准确的时钟/日历数据 6~0 秒 用BCD格式表示秒数值 当电源电压低于时PCF当8563装置的最低电压时,VL为1,表明内部完整的时钟周期信号无法保证,可能导致时钟/日历数据不准确。 BCD编码的秒数值如下表所示: 表 24.1.2 秒数值的BCD编码

寄存器地址为03h,说明如下表所示: 表 24.1.3 分钟寄存器描述(地址03)h) Bit 符号 描述 7 - 无效 6~0 分钟 用BCD格式表示分钟值 小时寄存器的地址是04h,说明如下表所示: 表 24.1.4 小时寄存器描述(04地址)h) Bit 符号 描述 7~6 - 无效 5~0 小时 用BCD格式表示的小时值 天寄存器的地址为05h,说明如下表所示: 表 24.1.5 天寄存器描述(地址05)h) Bit 符号 描述 7~6 - 无效 5~0 天 用BCD格式表示天数值 计数器的值是闰年,PCF8563在2月自动增加一个值,使其成为29天。 月/世纪寄存器的地址是07h,说明如下表所示: 表 24.1.6 月/世纪寄存器(07地址)h) Bit 符号 描述 7 C 当C为0时,它显示了当前世纪,当它显示为1时,它显示了下一个世纪 6~5 - 未用 4~0 月 用BCD月值表示格式 表 24.1.7 月份表 月份 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 十月 1 0 0 0 0 十一月 1 0 0 0 1 十二月 1 0 0 1 0 年寄存器地址为08h,说明如下表所示: 表 24.1.8 寄存器(地址08h) Bit 符号 描述 7~0 年 用BCD格式表示的当前年值为00~99 1.2 实验任务 本节的实验任务是通过试点Zynq开发板上的PCF8563实时钟芯片,RGB LCD显示时间显示在液晶屏上。 1.3 硬件设计 在领航员开发板上PCF8563接口部分的原理图如下图所示。

图 7.5.13.1 PCF8563接口原理图 PCF8563作为I2C接口从器件和EEPROM等模块统一挂在领航员开发板上IIC总线上。 OSCI、OSCO与外部32.768KHz晶振相连,为芯片提供驱动时钟;SCL和SDA分别是I2C串行时钟接口和串行数据接口。 由于本实验管脚较多,这里只给出XDC约束语句,XDC约束语句如下

set_property -dict { 
        PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk] set_property -dict { 
        PACKAGE_PIN N16 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]    set_property -dict { 
        PACKAGE_PIN E18 IOSTANDARD LVCMOS33} [get_ports iic_scl] set_property -dict { 
        PACKAGE_PIN F17 IOSTANDARD LVCMOS33} [get_ports iic_sda]  set_property -dict { 
        PACKAGE_PIN W18 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[0]}]
set_property -dict { 
        PACKAGE_PIN W19 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[1]}]
set_property -dict { 
        PACKAGE_PIN R16 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[2]}]
set_property -dict { 
        PACKAGE_PIN R17 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[3]}]
set_property -dict { 
        PACKAGE_PIN W20 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[4]}]
set_property -dict { 
        PACKAGE_PIN V20 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[5]}]
set_property -dict { 
        PACKAGE_PIN P18 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[6]}]
set_property -dict { 
        PACKAGE_PIN N17 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[7]}]
set_property -dict { 
        PACKAGE_PIN V17 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[8]}]
set_property -dict { 
        PACKAGE_PIN V18 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[9]}]
set_property -dict { 
        PACKAGE_PIN T17 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[10]}]
set_property -dict { 
        PACKAGE_PIN R18 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[11]}]
set_property -dict { 
        PACKAGE_PIN Y18 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[12]}]
set_property -dict { 
        PACKAGE_PIN Y19 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[13]}]
set_property -dict { 
        PACKAGE_PIN P15 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[14]}]
set_property -dict { 
        PACKAGE_PIN P16 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[15]}]
set_property -dict { 
        PACKAGE_PIN V16 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[16]}]
set_property -dict { 
        PACKAGE_PIN W16 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[17]}]
set_property -dict { 
        PACKAGE_PIN T14 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[18]}]
set_property -dict { 
        PACKAGE_PIN T15 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[19]}]
set_property -dict { 
        PACKAGE_PIN Y17 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[20]}]
set_property -dict { 
        PACKAGE_PIN Y16 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[21]}]
set_property -dict { 
        PACKAGE_PIN T16 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[22]}]
set_property -dict { 
        PACKAGE_PIN U17 IOSTANDARD LVCMOS33} [get_ports { 
        lcd_rgb[23]}]

set_property -dict { 
        PACKAGE_PIN N18 IOSTANDARD LVCMOS33} [get_ports lcd_hs]
set_property -dict { 
        PACKAGE_PIN T20 IOSTANDARD LVCMOS33} [get_ports lcd_vs]
set_property -dict { 
        PACKAGE_PIN U20 IOSTANDARD LVCMOS33} [get_ports lcd_de]
set_property -dict { 
        PACKAGE_PIN M20 IOSTANDARD LVCMOS33} [get_ports lcd_bl]
set_property -dict { 
        PACKAGE_PIN P19 IOSTANDARD LVCMOS33} [get_ports lcd_clk]
set_property -dict { 
        PACKAGE_PIN L17 IOSTANDARD LVCMOS33} [get_ports lcd_rst] 

1.4 程序设计 根据实验任务,我们可以大致规划出系统的控制流程:ZYNQ首先通过I2C总线向PCF8563写入初始时间值,然后不断地读取时间数据,并将读到的时间数据显示到LCD上。由此画出系统的功能框图如下所示:

图 7.5.13.1 PCF8563T实时时钟LCD显示系统框图 由系统框图可知,顶层模块(rtc_lcd)例化了以下三个模块,分别是IIC驱动模块(iic_dri)、PCF8563控制模块(pcf8563_ctrl)和LCD字符显示模块(lcd_disp_char)。其中LCD字符显示模块例化了读取ID模块(rd_id)、时钟分频模块(clk_div)、LCD显示模块(lcd_display)以及LCD驱动模块(lcd_driver)。 各模块端口及信号连接如图 7.5.13.2所示:

图 7.5.13.2 顶层模块原理图 PCF8563实时时钟控制模块(pcf8563_ctrl)通过与IIC驱动模块(iic_dri)进行通信来实现对PCF8563实时时钟数据的读取;PCF8563实时时钟控制模块(pcf8563_ctrl)再将从IIC读取的时间数据送给LCD字符显示模块(lcd_disp_char),以进行显示。 顶层模块的代码如下:

1   module rtc_lcd(
2       input                sys_clk,     //系统时钟
3       input                sys_rst_n,   //系统复位
4   
5       //RGB LCD接口
6       output               lcd_de,      //LCD 数据使能信号
7       output               lcd_hs,      //LCD 行同步信号
8       output               lcd_vs,      //LCD 场同步信号
9       output               lcd_bl,      //LCD 背光控制信号
10      output               lcd_clk,     //LCD 像素时钟
11      inout        [23:0]  lcd_rgb,     //LCD RGB888颜色数据
12      
13      //RTC实时时钟
14      output               iic_scl,     //RTC的时钟线scl
15      inout                iic_sda      //RTC的数据线sda 
16      );                                                      
17  
18  //parameter define
19  parameter    SLAVE_ADDR = 7'b101_0001   ; //器件地址(SLAVE_ADDR)
20  parameter    BIT_CTRL   = 1'b0          ; //字地址位控制参数(16b/8b)
21  parameter    CLK_FREQ   = 26'd50_000_000; //i2c_dri模块的驱动时钟频率(CLK_FREQ)
22  parameter    I2C_FREQ   = 18'd250_000   ; //I2C的SCL时钟频率
23  parameter    TIME_INIT  = 48'h19_01_01_09_30_00;//初始时间
24  
25  //wire define
26  wire          dri_clk   ;   //I2C操作时钟
27  wire          i2c_exec  ;   //I2C触发控制
28  wire  [15:0]  i2c_addr  ;   //I2C操作地址
29  wire  [ 7:0]  i2c_data_w;   //I2C写入的数据
30  wire          i2c_done  ;   //I2C操作结束标志
31  wire          i2c_ack   ;   //I2C应答标志 0:应答 1:未应答
32  wire          i2c_rh_wl ;   //I2C读写控制
33  wire  [ 7:0]  i2c_data_r;   //I2C读出的数据
34  
35  wire    [7:0]  sec      ;   //秒
36  wire    [7:0]  min      ;   //分
37  wire    [7:0]  hour     ;   //时
38  wire    [7:0]  day      ;   //日
39  wire    [7:0]  mon      ;   //月
40  wire    [7:0]  year     ;   //年
41  
42  //*****************************************************
43  //** main code
44  //*****************************************************
45  
46  //i2c驱动模块
47  i2c_dri #(
48      .SLAVE_ADDR  (SLAVE_ADDR),  //EEPROM从机地址
49      .CLK_FREQ    (CLK_FREQ  ),  //模块输入的时钟频率
50      .I2C_FREQ    (I2C_FREQ  )   //IIC_SCL的时钟频率
51  ) u_i2c_dri(
52      .clk         (sys_clk   ),  
53      .rst_n       (sys_rst_n ),  
54      //i2c interface
55      .i2c_exec    (i2c_exec  ), 
56      .bit_ctrl    (BIT_CTRL  ), 
57      .i2c_rh_wl   (i2c_rh_wl ), 
58      .i2c_addr    (i2c_addr  ), 
59      .i2c_data_w  (i2c_data_w), 
60      .i2c_data_r  (i2c_data_r), 
61      .i2c_done    (i2c_done  ), 
62      .i2c_ack     (i2c_ack   ), 
63      .scl         (iic_scl   ), 
64      .sda         (iic_sda   ), 
65      //user interface
66      .dri_clk     (dri_clk   )  
67  );
68  
69  //PCF8563控制模块
70  pcf8563_ctrl #(
71      .TIME_INIT (TIME_INIT)
72     )u_pcf8563_ctrl(
73      .clk         (dri_clk   ),
74      .rst_n       (sys_rst_n ),
75      //IIC
76      .i2c_rh_wl   (i2c_rh_wl ),
77      .i2c_exec    (i2c_exec  ),
78      .i2c_addr    (i2c_addr  ),
79      .i2c_data_w  (i2c_data_w),
80      .i2c_data_r  (i2c_data_r),
81      .i2c_done    (i2c_done  ),
82      //时间和日期
83      .sec         (sec       ),
84      .min         (min       ),
85      .hour        (hour      ),
86      .day         (day       ),
87      .mon         (mon       ),
88      .year        (year      )
89      );
90  
91  //LCD字符显示模块
92  lcd_disp_char u_lcd_disp_char(
93      .sys_clk     (sys_clk   ),
94      .sys_rst_n   (sys_rst_n ),
95      //时间和日期
96      .sec         (sec       ),
97      .min         (min       ),
98      .hour        (hour      ),
99      .day         (day       ),
100     .mon         (mon       ),
101     .year        (year      ),
102     //RGB LCD接口
103     .lcd_de      (lcd_de    ),
104     .lcd_hs      (lcd_hs    ),
105     .lcd_vs      (lcd_vs    ),
106     .lcd_bl      (lcd_bl    ),
107     .lcd_clk     (lcd_clk   ),
108     .lcd_rgb     (lcd_rgb   )
109     );
110 
111 endmodule

代码中第18至23行定义了一些参数,其中TIME_INIT表示RTC实时时钟的初始日期和时间,可以通过修改此参数值使PCF8563从不同的时间开始计时,例如从2019年1月1号09:30:00开始计时,需要将该参数值设置为48’h190101093000。 顶层模块中主要完成对其余模块的例化。其中I2C驱动模块(iic_dri)的代码与“EEPROM读写实验”章节中的IIC驱动模块完全相同,只是在例化时对字地址位控制(BIT_CTRL)和IIC器件地址(SLAVE_ADDR)两个参数作了修改,有关IIC驱动模块的详细介绍请大家参考“EEPROM读写实验”。 PCF8563实时时钟控制模块的代码如下所示:

1   module pcf8563_ctrl #(
2       // 初始时间设置,从高到低为年到秒,各占8bit
3       parameter  TIME_INIT = 48'h19_10_26_09_30_00)(
4       input                 clk       , //时钟信号
5       input                 rst_n     , //复位信号
6   
7       //i2c interface
8       output   reg          i2c_rh_wl , //I2C读写控制信号
9       output   reg          i2c_exec  , //I2C触发执行信号
10      output   reg  [15:0]  i2c_addr  , //I2C器件内地址
11      output   reg  [7:0]   i2c_data_w, //I2C要写的数据
12      input         [7:0]   i2c_data_r, //I2C读出的数据
13      input                 i2c_done  , //I2C一次操作完成
14  
15      //PCF8563T的秒、分、时、日、月、年数据
16      output   reg   [7:0]  sec,        //秒
17      output   reg   [7:0]  min,        //分
18      output   reg   [7:0]  hour,       //时
19      output   reg   [7:0]  day,        //日
20      output   reg   [7:0]  mon,        //月
21      output   reg   [7:0]  year        //年
22  );
23  
24  //reg define
25  reg   [3:0]     flow_cnt  ;            // 状态流控制
26  reg   [12:0]    wait_cnt  ;            // 计数等待
27  
28  //*****************************************************
29  //** main code
30  //*****************************************************
31  
32  //先向PCF8563中写入初始化日期和时间,再从中读出日期和时间
33  always @(posedge clk or negedge rst_n) begin
34      if(!rst_n) begin
35          sec        <= 8'h0;
36          min        <= 8'h0;
37          hour       <= 8'h0;
38          day        <= 8'h0;
39          mon        <= 8'h0;
40          year       <= 8'h0;
41          i2c_exec   <= 1'b0;
42          i2c_rh_wl  <= 1'b0;
43          i2c_addr   <= 8'd0;
44          i2c_data_w <= 8'd0;
45          flow_cnt   <= 4'd0;
46          wait_cnt   <= 13'd0;
47      end
48      else begin
49          i2c_exec <= 1'b0;
50          case(flow_cnt)
51              //上电初始化
52              4'd0: begin
53                  if(wait_cnt == 13'd8000) begin
54                      wait_cnt<= 12'd0;
55                      flow_cnt<= flow_cnt + 1'b1;
56                  end
57                  else
58                      wait_cnt<= wait_cnt + 1'b1;
59              end
60              //写读秒
61              4'd1: begin
62                  i2c_exec  <= 1'b1;
63                  i2c_addr  <= 8'h02;
64                  flow_cnt  <= flow_cnt + 1'b1;
65                  i2c_data_w<= TIME_INIT[7:0];
66              end
67              4'd2: begin
68                  if(i2c_done == 1'b1) begin
69                      sec     <= i2c_data_r[6:0];
70                      flow_cnt<= flow_cnt + 1'b1;
71                  end
72              end
73              //写读分
74              4'd3: begin
75                  i2c_exec  <= 1'b1;
76                  i2c_addr  <= 8'h03;
77                  flow_cnt  <= flow_cnt + 1'b1;
78                  i2c_data_w<= TIME_INIT[15:8];
79              end
80              4'd4: begin
81                  if(i2c_done == 1'b1) begin
82                      min     <= i2c_data_r[6:0];
83                      flow_cnt<= flow_cnt + 1'b1;
84                  end
85              end
86              //写读时
87              4'd5: begin
88                  i2c_exec  <= 1'b1;
89                  i2c_addr  <= 8'h04;
90                  flow_cnt  <= flow_cnt + 1'b1;
91                  i2c_data_w<= TIME_INIT[23:16];
92              end
93              4'd6: begin
94                  if(i2c_done == 1'b1) begin
95                      hour    <= i2c_data_r[5:0];
96                      flow_cnt<= flow_cnt + 1'b1;
97                  end
98              end
99              //写读天
100             4'd7: begin
101                 i2c_exec  <= 1'b1;
102                 i2c_addr  <= 8'h05;
103                 flow_cnt  <= flow_cnt + 1'b1;
104                 i2c_data_w<= TIME_INIT[31:24];
105             end
106             4'd8: begin
107                 if(i2c_done == 1'b1) begin
108                     day     <= i2c_data_r[5:0];
109                     flow_cnt<= flow_cnt + 1'b1;
110                 end
111             end
112             //写读月
113             4'd9: begin
114                 i2c_exec  <= 1'b1;
115                 i2c_addr  <= 8'h07;
116                 flow_cnt  <= flow_cnt + 1'b1;
117                 i2c_data_w<= TIME_INIT
        标签: fh58m系列fpc连接器连接器y16hy16连接器y16p

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台