关灯
请选择 进入手机版 | 继续访问电脑版
米联客uisrc 首页 2019版本 Zynq-Soc 5|GTX/GTP通信 查看内容
2

S05-CH06 可编程差分晶振 Si570 使用

摘要: 使用 FPGA 的高速串行收发器(GTP、GTX 等)设计不同传输速率的高速接口时,往往需要收发器所在 BANK 的差分参考时钟引脚提供不同频率的参考时钟输入。例如,1G-BASEX:125M,Display Port :135M,SATA :120M, 3G-S ...

软件版本:VIVADO2017.4

操作系统:WIN10 64bit

硬件平台:适用米联客 ZYNQ系列开发板

米联客(MSXBO)论坛:www.osrc.cn答疑解惑专栏开通,欢迎大家给我提问!!

6.1概述

     使用 FPGA 的高速串行收发器(GTP、GTX 等)设计不同传输速率的高速接口时,往往需要收发器所在 BANK 的差分参考时钟引脚提供不同频率的参考时钟输入。例如,1G-BASEX:125M,Display Port :135M,SATA :120M, 3G-SDI:148.5M,10G-BASER:156.25M。收发器的参考时钟一般都直接由差分晶振所提供。

      为了提高 MIZ7035 开发板 GTX 使用的灵活性,在底板中搭载了 1 款频率可编程的差分晶振 Si570,将其输出作为GTX Bank 的参考时钟。

      MIZ7035 所使用的 Si570 的输出频率可在 10~810M 之间进行任意调节。通过 I2C 接口对其内部寄存器进行设置,用户便可以获得所需要频率的时钟。可以更好的满足不同应用场合、不同类型和传输速率的高速接口对于参考时钟频率的要求。

      本教程介绍了 Si570 的工作原理以及使用方法,通过 PS 的 I2C 接口实现对Si570 时钟输出频率的动态配置,同时,通过 PL 粗略测算所设置频率的值是否正确。本教程参考了 Xilinx KC705 开发板的参考设计rdf0194-kc705-si570-prog-c-2014-3 以及 xtp204-kc705-si570-prog-c-2014-3。

 

6.2 Si570 介绍

6.2.1基本结构

 

      Si570 的内部结构如下图所示。

      其输出就是由晶振内部振荡器产生的固定频率为 fXTAL 的时钟经过 1 次倍频和 2 次分频而获得。输出时钟频率

fout 的计算公式为:

      输出时钟频率fout 由 fDCO 和输出分频系数所决定。

fDCO=fXTAL×RFREQ

      其中,晶振内部振荡器产生的时钟频率 fXTAL≈114.285000000MHz。需要说明的是,fXTAL 不是一个完全准确的值,由于生产工艺的限制,对于每一个晶振,fXTAL 都会存在细微的差别。RFREQ 是 38bit 的倍频系数,其高 10bit 为整数,低 28bit 为小数。由于fDCO 的可设置范围为 4.85G~5.67GHz,因而倍频系数RFREQ 也有一个固定的范围。另外,HSDIV 为 3bit 的分频系数,N1 为 7bit 的分频系数,两者均为整数。

      简而言之,对于用户来说,在 Si570 上获取所需要频率的时钟就是通过I2C 接口对上述公式中的RFREQ、HSDIV

和 N1 共 3 项参数进行设置。

       每个 Si570 都有一个默认的上电频率和 I2C 地址,两者都是可选的,具体组合和型号对应关系可以咨询生产商。在出厂时,这两个默认值都写入其内部的 Flash 里,用户后续都无法更改。晶振虽然可以在上电状态下通过 I2C 设置改变输出频率,但是重新上电后又会从 Flash 里加载出厂设置输出默认的上电频率。

6.2.2 寄存器

       Si570 内部的寄存器如下图所示。其中我们只需要关注。寄存器 7~12,以及 135、137。

6.2.2.1  寄存器 78

寄存器 7 和寄存器 8 的 bit[7:6]用于设置分频系数HSDIV 和N1。具体含义如下图所示。

6.2.2.2 寄存器 8~12

 

寄存器 8~12 用于设置 38bit 的倍频系数RFREQ。

 

6.2.2.3 寄存器 135

寄存器 135 的定义如下图所示。该寄存器主要用于晶振的控制,在重新配置晶振的频率的过程中一般只需要用到 bit6。

6.2.2.4 寄存器 137

       寄存器 137 定义如下图所示。该寄存器用于锁住 DCO 的频率。在对晶振频率进行重新设置时必须用到这个寄存器。

6.3使用方法

6.3.1参数计算原理

       晶振上电后以默认频率输出时钟。此时若需要改变输出频率,首先,需要计算需要设置的倍频系数 RFREQ、以及分频系数 HSDIV 和 N1。对于参数计算需要分 2 种情况进行讨论。以 DCO 的中心频率±3500ppm(±0.35%) 范围作为划分。如下图所示。

       第一种情况,当晶振输出频率更改所造成的 fDCO 变化在 fDCO 中心频率的±3500ppm(±0.35%) 范围内。则只需要对倍频系数 RFREQ 进行重新设置就可以直接改变输出频率。晶振工作不会造成中断,输出频率进行动态改变。新的倍频系数 RFREQ 计算方法如下:

      例如,输出频率从 148.35MHz 变为 148.5MHz。新倍频系数RFREQ 计算过程如下:

      第二种情况,当晶振输出频率更改所造成的 fDCO 变化超过 fDCO 中心频率的±3500ppm(±0.35%) 范围。则倍频系数 RFREQ 和分频系数 HSDIV、N1 都需要进行更改。此时,更改将使晶振输出产生短暂的中断,然后才会输出新频率的时钟。

      要计算新的 RFREQ、HSDIV、N1 值,必须先计算出晶振内部的固定频率fXTAL。这里再次强调,由于每个晶振的 fXTAL 都会存在细微差异,因此每一个晶振的参数设置都是唯一的,不能适用于其他任何 1 个相同型号的 Si570。要计算 fXTAL,必须先通过I2C 读出晶振在当前频率下寄存器 7~12 中对应的 RFREQ、HSDIV、N1 值。然后通过如下公式计算出 fXTAL 的值。

       例如,当前频率为 156.25MHz,读出各寄存器值如下:

6.3.2参数计算步骤

 

综上所述,参数的计算步骤可以总结为 5 个步骤,如下图所示。(由 156.25M 变为 200M)。

 

   由于HSDIV、N1 值的选择以及 RFREQ 的计算比较繁琐。可以借助Silicon 官方的设置工具来进行计算。(下载页面:https://www.silabs.com/products/development-tools/software/oscillator-software-tools

     下载地址:https://www.silabs.com/documents/login/software/ProgOscillatorSwInstall.zip

)。

 

     安装完成后,打开Programmable Oscillator Calculator,如下图,选择 Si570,然后点击 OK。

选择Option,Advanced。如下图所示。

 

可以看到 fXTAL 的默认值为 114.285M。如下图所示。

输入根据当前频率下的RFREQ、HSDIV、N1 值计算出的 fDCO 的值,

软件会自动近似成最相近的值。然后点击 OK。如下图所示。

输入当前频率值 156.25MHz,点击Apply Definition,输入要设置的频率 200MHz,点击 Create Example。如下图所示。

软件将会自动生成所需要设置的值,并在 summary 里显示计算过程。如下图所示。

 

6.3.3寄存器配置 

 

       当计算出所需的倍频系数RFREQ,以及分频系数 HSDIV、N1 后,需要将这些值通过 I2C 写入寄存器中。寄存器的配置分为 3 个步骤。如下图所示。

6.3.4 I2C 配置原理

6.3.4.1读寄存器 

     Si570 I2C 寄存器配置过程如下图所示。可以对单个寄存器值进行配置,也可以对地址连续的寄存器进行连续配置。连

续配置只需要发送起始寄存器的地址即可,这种方式配置较为方便。

 

6.3.4.2写寄存器 

 

Si570 I2C 寄存器值读取过程如下图所示。同理,可以对单个寄存器值进行读取,也可以对地址连续的寄存器进行连续读取。连续

读取只需要发送起始寄存器的地址即可。

6.3.4.3 I2C 地址 

不同型号的 Si570 具有不同的 I2C 地址,MIZ7035 开发板中所使用的型号为 570BAB000544DG,其 I2C 地址为 0x5D。

6.4程序设计

6.4.1PL 端设计

6.4.2 PS 配置

     将PS 的 I2C0 通过EMIO 方式引出,如下图所示。

     通过PS 引出 1 个 200M 的时钟,作为PL 部分对Si570 时钟频率测算的参考时钟。如下图所示。

6.4.2.1 Si570 频率测算 

     为了验证 PS 端配置 Si570 输出时钟频率的正确性,在不使用示波器进行测量的前提条件下。可以在 PL 端对Si570 输入时钟频率值进行统计测算,能够得出较为接近频率真实值的估计值。这部分设计采用了 Xilinx KC705 开发板的参考设计 rdf0194。

 

6.4.2.2测算原理 

 

      频率测算由 ibert_freq_counter.v 和 ibert_freq_mult.v 两个模块完成。

      首先,介绍一下频率测算的原理。测算过程首先要以一个已知频率的时钟信号作为参考,例如,rdf0194 参考设计中使用了 1 个 200MHz 的时钟。然后,同时以参考时钟和 Si570 输入的待测时钟为基准,各自使用 1 个寄存器同时进行计数。当参考时钟累加到我们所设置的阈值时,保存此时待测时钟的计数值,然后根据比例法便可以计算出此时的待测时钟的频率。

       为了使最终的统计结果能够直观的反映出频率值,且能保留 2 位小数。例如,200M 的时钟的十进制统计值为20000,156.25M 时钟的十进制统计值为 15625。需要将上述的寄存器计数值乘以 1 个系数就可得到我们所需要的直观的统计值。

       例程中,ibert_freq_counter 模块负责对参考时钟和待测时钟进行寄存器计数,参考时钟的计数阈值为 16’h4000。当以PS 产生的200M同时作为参考时钟和待测时钟时,由于在计数时使用了4 分频,实际的计数阈值为4096-1=4095。此时,根据这个结果便可以计算出该系数,计算过程如下:

                                                                         20000/4095≈4.8840=48840/10000。

       所以寄存器计数值所需要乘的系数近似为 48840/10000。在 ibert_freq_mult 模块中,将 ibert_freq_counter 模块的计数值通过系数换算成最终的结果。

        乘以系数后,为了补偿舍去小数部分,将相乘结果再加 1 便可以得到最终结果。需要注意的是,该结果只是近

似统计,由于异步采样和小数计算误差,统计结果可能会存在个位数的误差(即小数点第 2 位)。但这对于我们直观判断设置值是否正确并不存在较大影响。

6.4.2.3 VIO

      为了便于实时观察 Si570 输入待测时钟的频率测算值,在 PL 端使用 VIO IP 核通过 vivado 软件来观察。VIO 的设

      置如下图所示。

6.5 PS 端程序设计

PS 端的主要工作是通过I2C 接口对Si570 的输出时钟频率进行配置。PS 端的设计同样参考了 Xilinx KC705 开发板的参考设计 rdf0194。

PS 端的工程主要包含以下几个源文件,如下图所示。

 

6.5.1 Main 函数

main 函数主要完成如下功能:

  • 初始化 ARM 中断控制器及系统中断
  • 初始化并配置 I2C 接口及其中断
  • 通过 I2C 接口复位 Si570
  • 通过 I2C 接口读取 Si570 的寄存器值,通过串口输出。并从串口接收用户输入的新寄存器配置值,将其写入 Si570。

main 函数的运行流程如下图所示:

6.5.2 I2C 接口

     PS 端使用了I2C0 接口,I2C0 工作于 Master 模式。在程序中使用了 I2C 接口的中断,I2C 接口在数据接收或发送完成后均会产生中断。PS 端 I2C 接口的驱动程序在i2c_intr.c 和 i2c_intr.h 文件中进行定义。

     I2C 接口的驱动函数主要包括:

  • I2C_init,用于配置和初始化PS的I2C0接口。
  • I2C_write,通过I2C接口以Master形式向外部发送数据。
  • I2C_read,通过I2C接口以Master形式从外部读取数据。
  • I2C_Setup_Intr_System,配置和初始化I2C接口的中断。
  •  Iic_Handler,I2C接口的中断服务函数。

6.5.3配置PCA9548 I2C 通路切换

利用PCA9548芯片可以很方便实现I2C复用通路之间的切换。比如SI570是在通道7只要一条指令就可以完成通路的切换。

PCA9548_sel(PCA9548_ADDRESS,0x81);

        具体的函数请看PCA9548.h 和PCA9548.c

6.5.4配置Si570

       Si570 的驱动程序在si570.c 和 si570.h 文件中进行定义。

​​​​​​​6.5.3.1 复位 

      通过 reset_si570 函数可以使Si570 晶振复位,并输出默认的上电频率 156.25MHz。

​​​​​​​​​​​​​​6.5.3.2 读寄存器 

      在上文中已经强调过,每 1 个 Si570 晶振的内部 fXTAL 都会存在细微的差别,要对 Si570 进行配置,必须先根据Si570 出厂的默认配置来计算出其内部的 fXTAL 频率值。因此,在配置 Si570 之前首先要通过 I2C 接口,依次从 Si570 中读出寄存器 7、8、9、10、11、12 的出厂默认值,根据这些值计算出fXTAL 的精确值。

      读取这些寄存器的过程是通过 read_si570 函数完成。

​​​​​​​​​​​​​​6.5.3.3 写寄存器 

      得出开发板中 Si570 晶振的 fXTAL 值之后,便可以使用 节中提到的方法使用官方软件 Programmable Oscillator Calculator 计算出新频率下寄存器 7、8、9、10、11、12 所需要设置的值。然后按照 节所介绍 3 个步骤将这 6 个寄存器的值写入 Si570 中,并使之设置生效。

       配置这些寄存器的过程是通过 write_si570 函数完成。

6.6 程序测试

6.6.1获取Si570 默认寄存器配置

       首先,通过 SDK 的system debugger,将PL 的bit 文件和PS 的elf 文件同时下载到开发板中。其中,system debugger

的选项应如下图所示。

 

       打开串口调试助手,设置波特率为 115200,连接 MIZ7035 开发板所对应的COM 口,然后使PS 运行程序。此

时串口调试助手出现的界面如下图所示,显示出当前 Si570 内部出厂默认的寄存器配置。

6.6.2计算晶振的fXTAL

       从上图中便可以得到测试所使用的 MIZ7035 开发板中的 Si570 的默认寄存器配置。需要注意的是,这些值只适用于测试所用的 Si570 晶振。换一个相同型号的 Si570,这些默认配置值必然会存在差别。当用户对自己的 MIZ7035 开发板进行 Si570 测试时,需要注意这一点,不同的值时完全正常的现象,并不代表错误。

       根据下图,可以获得所测试的 Si570 相应的参数值。

       HS_DIV = 0b000,表示 4;N1=0b0000111,代表 23=8;RFREQ=0x2BC08FFFD ,高 10bit 为整数,低 28bit 为小数,将其除以 228 可得出其实际值为 43.7521972544491291046142578125。已知 Si570 的默认上电输出频率为156.25M,然后根据下面的公式计算出 fXTAL ≈ 114.2799748072436210734652474654。

6.6.3输出频率参数计算

      在Programmable Oscillator Calculator 软件中输入上面计算出的 fXTAL 值。软件会作自动近似,如下图所示。

      接下来便可以在软件中开始计算 Si570 在不同输出频率时的参数值。下面列举几个实例。

 

6.6.3.1 100MHz

6.6.3.2 125MHz

6.6.3.3 150MHz

6.6.3.4 175.25MHz

6.6.3.5 190.33MHz

6.6.4更改并监测输出频率

6.6.4.1默认上电频率 

      在经过 节中的步骤后,接着打开 vivado 的 hardware manager。点击 Open Target,然后选择Auto Connect。如下图所示。

此时,hardware manager 将自动检测到所下载 bit 文件中所嵌入的 VIO IP 核,并弹出 vio 界面,如下图所示。

 

点击“+”按钮,将VIO 的两个输入信号选中并添加到列表中。如下图所示

 

将 2 个频率统计值的显示方式改为十进制,如下图所示。

 

      此时,频率的统计值便可以直观的显示出来,如下图所示。200M 的参考时钟显示为 20000,Si570 的默认上电。156.25M 的时钟显示为 15624,这里存在-1 的误差。

6.4.4.2更改输出频率  

     在串口调试助手出现如下Si570 默认寄存器值的界面后。

 

     通过调试助手输入 1 个任意除了大小写 W 之外的字母,便开始进入寄存器配置步骤。例如,通过串口调试助手以ASCII 码形式输入“A”,如下图所示。

 

 

依次以 ASCII 码形式输入频率为 100MHz 时的参数,如下图所示。

 

      然后,发送大写或小写的 w,代表要将这些值写入 Si570 对应的寄存器中,如下图所示。出现下图的提示,代表此时已经成功完成寄存器配置,Si570 的输出频率发生了改变。

        在 VIO 中可以观察到,此时Si570 输出频率测算结果 9998,代表 99.98MHz。如下图所示。

        下一步,如果想终止程序,则可通过串口调试助手大小写字母 Q,若要继续对 Si570 进行编程,则发送其他任意字母即可。通过串口调试助手发送“A”,继续对Si570 进行配置。如下图所示。

   再次输入“A”,将 125MHz 对应的寄存器数值输入,然后输入“W”将其写入 Si570 中,如下图所示。

 

在 VIO 中可以观察到,此时Si570 输出频率测算结果 12499,代表 124.99MHz。如下图所示。

同理,再将 150MHz 频率对应的寄存器数值通过串口调试助手写入 Si570 中。如下图所示。

 

在 VIO 中可以观察到,此时Si570 输出频率测算结果 14999,代表 149.99MHz。如下图所示。

同理,再将 175.25MHz 频率对应的寄存器数值通过串口调试助手写入 Si570 中。

 

在 VIO 中可以观察到,此时Si570 输出频率测算结果 17524,代表 175.24MHz。如下图所示。

同理,再将 190.33MHz 频率对应的寄存器数值通过串口调试助手写入 Si570 中。

在 VIO 中可以观察到,此时Si570 输出频率测算结果 19033,代表 190.33MHz。如下图所示。

到此,我们所计算的 5 种频率参数全部配置完成,在串口调试助手发送“Q”退出程序,如下图所示。

6.6.4.3说明  

VIO 中观察到的Si570 输出频率测算值并不是完全准确的,而且可能会出现小幅度的跳变。该结果只是近似统计, 由于异步采样和小数计算误差,统计结果会存在一定的误差。仅作为用户直观的参考数据。精确测量Si570 的时钟频率是否准确,还是需要依靠示波器来完成。 


路过

雷人

握手

鲜花

鸡蛋

说点什么...

已有2条评论

最新评论...

归零者2020-6-29 19:58引用

给力

ycz2020-4-3 14:28引用

不错

查看全部评论(2)

本文作者
2019-9-29 11:27
  • 6
    粉丝
  • 935
    阅读
  • 2
    回复

关注米联客

扫描关注,了解最新资讯

联系人:汤经理
电话:0519-80699907
EMAIL:270682667@qq.com
地址:常州溧阳市天目云谷3号楼北楼201B
热门评论
排行榜

关注我们:微信公众号

官方微信

官方微信

客服热线:

0519-80699907

公司地址:常州溧阳市天目云谷3号楼北楼2楼

运营中心:常州溧阳市天目云谷3号楼北楼2楼

邮编:213300 Email:270682667#qq.com

Copyright   ©2019-2026  米联客uisrc内容版权归©UISRC.COM技术支持:UISRC.COM  备案号:苏ICP备19046771号