1.0 引言
许多工业、测试和测量、通信应用都要求高精度的时钟信号以便同步控制信号和捕捉数据等。在标准以太网中应用的IEEE 1588精密时间协议(PTP)为传播主时钟时序给系统中的许多结点提供了一种方法。当前的实现方法单纯依靠软件,或软件和FPGA或ASIC的混合。尽管用这些实现方法的结点能基于主时钟来产生时钟输出信号,但这样的信号精度不足以满足系统对极低的时钟抖动的要求。此外,系统上的时钟相位对准也有严格要求。DP83640精密PHYTER提供了这两个问题的解决方案。本应用注释适用于产品DP83640。
2.0 背景
DP83640包括一个高度可配置的时钟输出信号,其与内置的IEEE 1588时钟谐振。注意到谐振意味着频率相同而相位则不必相同。这个时钟的标称频率是250 MHz的整除结果,例如250 MHz/N,其中N为从2到255的整数。因此标称频率取980.4 kHz到125 MHz之间的离散值。
DP83640采用软件辅助的速率纠正来限制本地时钟和主参考时钟之间的频率失调。最终输出频率结合的速率纠正参数(例如ppm失调)与内置IEEE 1588时钟时序上的相同。因为速率纠正的单位是亚毫微秒(1亚毫微秒=2-32纳秒),对时钟输出频率进行精细调谐(达十亿分之一的数量级)。
除了固定速率纠正以外,对速率纠正编程使其工作在某特定值,持续时间短达1/2秒(一个“临时速率”)。在临时速率持续时间结束后,速率纠正返回至固定速率纠正值。通过在短时时间隔内纠正额外的频率失调,时钟输出信号不会在频率或者相位上表现出离散阶跃。DP83640也提供了一种使时钟输出信号相位对准主时钟相位的方法。与采用8 ns离散精度产生的器件触发输出不同,时钟输出由可调谐的模拟源,即频率控制振荡器(FCO)或相位产生模块(PGM)来产生。默认情况为,在上电时激活时钟输出,工作频率为25MHz,但是1588逻辑,包括1588时钟,必须在工作前作初始化。因此时钟输出和1588主时钟之间的初始相位关系是未知的。然而,明智地使用DP83640的特性可使时钟输出相位对准1588时钟的相位。
两种1588时钟源各有优点。FCO方法提供了更好的抖动性能,但纠正范围较小,而且为了在链接丢失事件发生时保留时钟相位,在使用上有所限制。PGM方法没有上述限制并能提供较大的纠正范围,但其长时间抖动性能不如FCO方法那么好。
3.0 理论
3.1 速率纠正
IEEE 1588时钟输出速率纠正功能利用了与内置1588时钟相同的逻辑。DP83640包括26位速率纠正参数,以每个参考时钟周期内的亚毫微秒数为单位。在软件控制下,当本地参考时钟比主时钟运行较慢时,速率纠正为正值,当本地参考时钟比主时钟运行更快时,速率纠正表现为负值。以每8纳秒时钟周期1亚毫微秒的速率纠正间隔,时钟输出是可调的,增量为2-32亚毫微秒 / 8纳秒 = 十亿分之0.029(ppb)。
采用P T P 速率控制寄存器( P T P _ R AT E H 和PTP_RATEL)和PTP临时速率控制寄存器(PTP_TRDH和PTP_TRDL)来控制PTP速率。
固定速率纠正可以如下方式编程:
1. 将速率方向(0x8000表示更高,0x0000表示更低)和该值的上10位写入PTP_RATEH寄存器中。
2. 将该值的低16位写入PTP_RATEL寄存器。在速率写到PTP_RATEL时即生效。
举例:设定固定速率纠正至相对于主时钟的-100 ppm1. 因为标称参考时钟周期为8 ns,100 ppm为0.0008 ns,即0.0008 * 232 亚毫微秒,大约等于3435974亚毫微秒(0x346DC6)。
2. 将0x8034写入PTP_RATEH。
3. 将0x6DC6写入PTP_RATEL。
除了也必须设定PTP_RATEH的第14位(0x4000)以
外,一个临时的速率纠正以编程固定速率纠正类似的方法得以编成。因为临时速率在写入PTP_RATEL寄存器时立即生效,所以在设定临时速率前必须对PTP临时速率延时寄存器进行编程。在临时速率持续时间结束后,将速率纠正数值切换回到固定速率纠正数值。临时速率延时必须按以下方式配置:
1. 临时速率持续时间为一个26位的数,单位是时钟周期。在默认的8 ns参考时钟周期时,最大持续时间约为537 ms。
2. 将临时速率持续时间的上10位写入PTP_TRDH。
3. 将临时速率持续时间的低16位写入PTP_TRDL。在写该寄存器时临时速率持续时间立即生效,并且会保持恒定,直到通过写寄存器操作进行修改。通常不需要改变临时速率的持续时间。
举例:在10 ms内设定临时速率纠正持续时间为+3 ns:
1. 若要在默认参考时钟周期下实现1 ms的临时速率持续时间,我们需要10 ms / 8 ns = 1250000个时钟周期(0x1312D0)。若要在1250000个时钟周期实现+3ns的纠正,需要3 ns / 1250000 = 0.0000024 ns =10308亚毫微秒/时钟周期(0x2844)。
2. 将0x0013写入PTP_TRDH。
3. 将0x12D0写入PTP_TRDL。
4. 将0xC000写入PTP_RATEH。
5. 将0x2844写入PTP_RATEL。
3.1.1 最大速率纠正
由于通常不需要较大的速率纠正(如大于100 ppm),为1588时钟输出而对源信号的选择决定了最大速率纠正。
当使用FCO时,最大有效速率纠正为0x1555555,即+/- 651ppm。当使用PGM时,最大有效速率纠正为0x3FFFFFF,也即 +/- 1953 ppm。
3.2 相位对准
时钟输出相位的对准要求执行下列步骤:
1. 确保已使能时钟输出引脚。
2. 在使能PTP同步协议之前,使能时钟输出和PTP时钟。
3. 使能单个事件的事件监控器以捕捉时钟输出引脚的上升沿。
4. 通过对准的期望时间确定时钟输出失调:时钟输出周期,即事件时间标记模时钟输出周期。
5. 执行一个步长调整以对准时钟输出。
6. 在同步期间,所有的步长调节都应以时钟输出周期为单位。
举例:一个10 MHz时钟输出的相位对准:
1. 确保时钟输出引脚是使能的。在上电之前将GPIO1引脚拉到高电平,或清除PHYCR2寄存器(页面0,寄存器0x1C)的CLK_OUT_DISABLE位(第2位)来实现该操作。
2. 在10 MHz处使能时钟输出: 将0 x 8 0 1 9 写入PTP_COC寄存器中。注意到0x19的十进制为25,用25去除250MHz时钟。使能PTP时钟:将0x0004写入PTP_CTL寄存器。
3. 取CLK_OUT相位错误的100个样值
— 使能事件监控并得到事件的时间标记:
— 将0x1CE1写入PTP_EVNT寄存器。
— 将0x5CE1写入PTP_EVNT寄存器中。
第一个写操作为CLK_OUT/GPIO12(时钟输出引脚)与事件7(尽管可使用任何事件)设置一个单独的事件捕捉。第二个写操作执行相同的操作,并使能了捕捉。
— 读取PTP_ESTS寄存器检查0位是否被设置。如果没有,请等待并重复这一步。
— 一旦TP_ESTS的0位被设定,通过对PTP_ESTS值的7:6位加1,从而确定事件时间标记长度(1到4个16位字)。
— 确保事件数目为7,既PTP_ESTS的4:2位的值等于7。
— 确保事件为上升沿。通过PTP_ESTS第5位的数值等于1来指示。
— 读取PTP_EDATA寄存器。事件时间标记返回如下:
i. 事件纳秒位15:0
ii. 事件纳秒位29:16
iii. 事件秒位15:0
iv. 事件秒位31:16
— 从时间标记中减去三倍的参考时钟周期和11 ns;对于通常为8 ns的参考时钟周期,这个值为35 ns。由此对引脚输入延时和边沿检测进行了纠正。
— 计算相位误差为(100–(事件时间标记模100))。
若结果与时钟周期相等(在此为100 ns),则相位误差为0。若相位误差在时钟周期的10 ns之内(在此为91-99 ns),则设置”高值”标志。这等同与负相位误差在-9到-1 ns内的情况。
4. 平均相位误差。如果有小的正和负相位误差的样值,比如已设了高值(HighValue),并且相位误差的样值小于10 ns,则必须将时钟周期加到样值上,以便正确地做样值平均:
— If(HighValue & error[sample]<10)error[sample] +=clkout_period
5. 若平均相位误差大于时钟周期,则减去时钟周期以得到最终的平均相位误差。
6. 计算纠正数值,其为平均相位误差加上两倍的参考时钟周期:
— Correction = 2 * ref_period + avg_phase_error
7. 做单步1588时钟时间调整:
— 将纠正值写入PTP_TDR。
— 将PTP_STEP_CLK(0x8)写入PTP_CTL。
3.2.1 链接丢失时维持相位对准
在使用FCO来产生CLK_OUT信号时,链接的丢失会使CLK_OUT信号在短时间内停止,造成相位对准丢失。DP83640提供三种选择来维护CLK_OUT与1588时钟对准,并在链接丢失时触发。
1. 在已知100 Mb/s的网络上使用自动协商建立链接。在此情况下,将0x803F对页面0寄存器0x1E写两次。这将使链接丢失后能保持CLK_OUT的相位对准。
此外,通过用一个2.2千欧姆电阻下拉LED_SPEED引脚电平,或将0x0181写入自动协商广播寄存器(ANAR,寄存器0x04),DP83640可被束缚在仅告知100 Mb/s的方式。若链接速度允许是10 Mb/s,则不用仅告知100 Mb/s的方式。
2. 网络速度为10 Mb/s或者不能保证是100 Mb/s,并且应用能容忍从PGM到CLK_OUT的稍高的抖动。设置PTP时钟输出控制寄存器(PTP_COC,页面6,寄存器0x14)中的14位(PTP_CLKOUT_SEL)。
3. 要求CLK_OUT上的时钟是低抖动,同时不采用选项1。如果网络设置允许,强制物理层(PHY)进入已知的100 Mb/s或10 Mb/s方式。在BMCR寄存器(寄存器0x00)内,清除12位,禁止自动协商,设置13位为100 Mb/s和8位为全双工。
4.0 抖动测试结果
4.1 测试设置
将器件与一个采用(版本1的)IEEE 1588精密时间协议的主时钟同步,以1秒的同步间隔和10毫秒的临时速率持续时间,执行了一系列的测试来测量时钟输出上的抖动。
使用Tektronix TDS784C示波器,以单个周期(100 ns)和10 μs延迟时信号(10 MHz)来测量抖动的直方图。将探针连接到器件的时钟输出信号,使用了TektronixTDS784C内部的直方图功能在特定的延迟时间点捕捉时钟信号的上升沿。在每个测试条件下大约能捕捉1000个数据点,并记录了直方图的峰峰值和标准偏差值。
4.2 测试条件
下表总结了抖动测试设置的条件。
表1. 抖动测试的测试条件
4.3 测试结果
下表显示了对于FCO和PGM源的抖动测量。
表2. 抖动测试的结果
由此数据可显而易见,尽管FCO源和PGM源的(逐周期)短期抖动可相比拟,但使用PGM源的长时间抖动性能较差。
以下图例,即图1,图2,图3和图4表征了在DP83640与主时钟同步的条件下,时钟输出信号的典型直方图。
图1. 采用FCO时钟源的逐周期的抖动直方图
图2. 采用FCO时钟源的10 μs延时抖动直方图
图3. 采用PGM时钟源的逐周期的抖动直方图
图4. 采用PGM时钟源的10 μs延时抖动直方图
5.0 时钟相位误差测试结果
5.1 测试设置
通过确定主时钟输出到从时钟输出引脚的时延可测得对主时钟的同步误差。直接用1米的CAT5电缆连接器件。用了IEEE 1588版本1,1秒的同步周期,100毫秒临时速率持续时间,激活时间标记插入,以及激活单步操作。
5.2 测试条件
下表总结了时钟相位误差测试的设置。
表 3. 相位误差测试的测量条件
5.3 示波器设置
Tektronix TDS784C示波器的配置如表4所示。
表4. 用于相位误差测试的示波器设置
5.4 测试结果
下表说明了时钟相位误差测试结果的平均值和标准偏差。
表5. 时钟相位误差
结果表明,时钟的相位误差与PCO或PGM的选择无关。
图5和图6表征了DP83640与主时钟同步的条件下,时钟输出相位误差的典型直方图。
图 5. 采用FCO时钟源的时钟输出相位误差
图 6 采用PGM时钟源的时钟输出相位误差
6.0 结论
DP83640提供了一个高精度的低抖动时钟输出,对于IEEE 1588主时钟而言是频率对准的,同时也是相位对准的。经验测试显示非常低的抖动(使用FCO源时低于1 ns的峰峰值和标准偏差)和精确的相位校准。尽管测试结果表明使用FCO源能有极好的长时间抖动性能,但使用PGM时钟源具有多模(10 Mb/s或100 Mb/s)运行的优点。