在很多大型物理实验和工业应用中,时钟同步技术都扮演着举足轻重的作用。比如在中国四川锦屏暗物质探测实验中,需要为多个独立探测装置提供相应的时间信息,这些探测器包括中心探测器(HpGe)、液氩反符合探测器、实验室外部宇宙线反符合探测器[1]。又比如在大亚湾中微子实验中,需要为三个实验厅的子探测器提供同步时钟和时间戳,也需要为未来的长基线中微子振荡实验提供同步时钟和时间戳[2]。
为此,本文基于可编程逻辑器件FPGA,设计了一套高精度、低成本、易于扩展的时间戳同步系统。
1 PTP协议简介
PTP精密时钟定时协议又称为IEEE 1588协议。它的基本功能是利用基于时间戳的报文通信的方法,使得分布式网络中的所有的时钟都与特定的某个时钟保持精确同步。IEEE 1588协议可以用软件实现,也可以用专门的硬件实现。很显然,用硬件实现能达到更高的精度。本文中的同步系统就是基于纯硬件实现的。
IEEE 1588协议中定义了5种类型的传输报文[3]:同步报文(sync)、跟随报文(follow_up)、延时请求报文(delay_req)、延时响应报文(delay_resp)和管理报文(management)。其中前4种报文主要用于时间戳交换,具体的时间戳交换的过程示意图如图1所示。
图1 PTP协议同步过程示意图
如图1所示,时间戳同步过程包括主节点和从节点,主节点和从节点都利用晶振维持本地时钟。同步的目的是使从节点的本地时钟的时间戳与主节点本地时钟的时间戳达到相对同步。未同步时,从节点相对主节点有一个时间偏差offset。同步的过程能够计算出这个偏差。
主时钟周期性地向从时钟发送同步报文SYNC,这个报文中没有任何有效数据,但是当SYNC发出时,主节点能够记录下来时间戳t1,当从节点接收到SYNC,从节点能够记录下来时间戳t2。为了让从节点也知道t1,稍后主节点向从节点发送跟随报文FOLLOW_UP,这个报文中包含了t1这个有效数据。
然后,为了计算主节点到从节点的延时,在从节点接收到FOLLOW_UP后一段时间,从节点向主节点发送一个DELAY_REQ报文。和SYNC类似,当DELAY_REQ离开时得到时间戳t3,当DELAY_REQ到达主节点时,主节点得到时间戳t4。一段时间后,主节点再向从节点发送DELAY_RESP报文,这个报文中包含了t4,从而从节点得到了4个时间戳t1~t4。
有了以上4个时间戳之后,假设主节点到从节点与从节点到主节点传输和网络延时不变,可以得到传输延时和时钟偏差的计算方法:
如果PTP主从链路对称,即Dm2s=Ds2m=delay,则:
由以上分析方法可知,PTP主从节点链路对称与否会影响offset的计算,从而会影响时间戳的同步精度。
另外,由于主节点和从节点需要用本地晶振维护本地时钟。而随着时间的积累,晶振存在频率漂移,并且不同晶振的固有频率也会有偏差,这两个属性都会影响时钟同步的精度。
为了实现高精度时间同步,设计同步系统时应该同时考虑到主从节点链路的对称性和晶振的特性。
2 电子学设计
时钟同步系统的整体结构设计如图2所示。
图2 时钟同步系统的硬件结构图
本方案中主节点和从节点使用同一块硬件电路,在设计的时候,硬件电路板上设计了一个跳线器,可以选择一块硬件电路是主节点或者从节点。为了保证主从节点的链路对称, PCB电路板时钟收发路径以及PTP报文收发路径的长度都应该用蛇形线设计来保证长度一致。另外,为了消除晶振的频率漂移以及频率偏差带来的影响,本方案中从节点不使用本地晶振,而是直接使用主节点传输来时钟信号作为时间戳的时钟,也就是说主节点和从节点使用了同源时钟。
虽然主从节点使用的本地clock是同源的,但是由于clock的传输路径的差异,主从节点的clock是有相位差异的。这个相位差如果不考虑在设计方案中的话,会严重影响整个时钟系统能够实现的同步精度。如图3所示,如果系统中没有考虑主从节点的本地clock的相位差,也就是图中phase,那时钟系统所能达到的同步精度最好也就是相位差的值。假设,主从节点的周期T为100 ns,主从节点的相位差为60 ns,那说明同步系统所能达到的最高精度为60 ns。
图3 主从节点时钟相位差测量的重要性示意图
为了进一步提高时间戳同步的精度,必须设计相位测量模块,消除主从时钟相位差对时间戳的同步精度带来的影响。所以,主节点中包括了相位鉴别芯片以及ADC芯片,用来精确测量主从节点时间戳的时钟相位差。
有了这个相位差测量模块,就真的可以消除主从节点时间戳的时钟相位差带来的影响吗?答案是肯定的。图4为主从节点时钟传播示意图,AD8302即为本文中所用的相位鉴别芯片。
图4 主从节点时钟传播示意图
我们已经知道,为了使从节点与主节点的时间戳实现精确同步,最直接的方法就是算出尽量精确的offset值,也就是要得出尽量精确的t1~t4的值。
图4中,Clk1为主节点晶振时钟,Clk2为从节点从主节点接收到的时钟,由于有一段长的传播路径,因而Clk2相对Clk1会有一个相位差。为了在主节点测量相位差,Clk3是从节点将Clk2直接发送到主节点而得到的时钟,因而Clk3相对于Clk2又会有一个相位差。具体Clk1~Clk3的示意图如图5所示。
图5 主从节点时钟关系图
对于时间戳t1而言,t1指的是SYNC包从主节点发出的时刻,触发时钟为Clk1,而时间戳时钟是主节点的系统时钟Clk1,因而t1是精确的。对于时间戳t2而言,t2指的是SYNC包到达从节点的时刻,触发时钟为Clk2,而时间戳时钟是从节点的系统时钟Clk2,因而t2也是精确的。对于时间戳t3而言,t3指的是DELAY_REQ包从从节点触发出的时刻,触发时钟为Clk2,而时间戳时钟为从节点的系统时钟Clk2,因而t3也是精确的。对于时间戳t4而言,t4指的是DELAY_REQ包到达主节点时的时刻,触发时钟为Clk3,而时间戳时钟为主节点的系统时钟Clk1,因而t4不是精确的,是有偏差的。由图5的时钟关系图可知,精确的t4p应该在t4之前:
可见,相位差测量模块在整个时间戳同步方案中取到了举足轻重的作用。
3 固件程序设计
3.1 主节点固件设计
主节点的固件结构框图如图6所示,A/D控制模块和相位测量模块是用来控制幅相鉴别芯片和ADC芯片。发送缓冲的作用是将主节点时钟同步协议中的通信报文以曼彻斯特编码方式发送出去,接收缓冲的作用是从接收路径中解码出相应的通信报文。本地时钟模块的作用就是维护一个本地时钟。主节点时钟同步协议的主要作用是控制报文的发送和接收。
图6 主节点固件结构框图
图7为主节点时钟同步协议模块的状态机转换图。
图7 主节点同步协议模块的状态机转换图
idle状态下,当检测到pps信号的上升沿,则开始整个同步周期。首先,开始ADC的读取操作,当等到AD_ready=’1’,则说明ADC的数据已经准备好,然后进行读取保存即可。然后,进入到sync状态,这个状态下,主节点会向从节点发送SYNC同步包,之后模块进入sync_wait状态。等一段固定的时间之后,模块进入follow状态,在这个状态下,主节点会向从节点发送FOLLOW_UP同步包。之后模块进入after_follow_wait,等待一段固定的时间之后,模块进入delay_req_pre,这个状态下,主节点会通知从节点可以发DELAY_REQ包了。之后,模块等待DELAY_REQ包,如果很长时间都没有等到DELAY_REQ包,即等待超时,则模块返回idle状态;如果接收到了DELAY_REQ包,主节点就向从节点发送DELAY_RESP。最后,等一段时间后,模块返回到idle状态。
3.2 从节点固件设计
从节点固件的结构框图如图8所示,相位部分计算模块用来计算出前文说到的phase值,offset计算模块的作用是用t1~t4和phase值计算出精确的offset值。从节点时钟同步协议的主要作用是控制报文的发送和接收和更新本地时钟。
图8 从节点固件结构框图
图9为从节点时钟同步协议模块的状态机转换图。
图9 从节点时钟同步协议模块的状态机转换图
当处在idle状态时,从节点监测接收到的数据流,直到监测到sync包后立即进入wait_follow状态。在wait_follow状态,从节点同样监测接收的数据流,直到监测到follow_up包后,立即进入wait_pre状态,如果在这个状态很久都没有接收到follow_up包,将等待超时返回到idle状态。同样,wait_pre状态下,直到监测到delay_req_pre包后,跳入delay_req状态;如果等待超时,则返回idle状态。delay_req状态下,从节点向主节点发送delay_req包后立即进入wait_delay_resp状态。在wait_delay_resp状态下,监测到delay_resp包后,从节点立即进入phase_cacul状态;如果长时间没有监测到delay_resp包,则返回idle状态。在phase_cacul状态下,开始相位差计算模块后,立即进入wait_phase_result状态。在wait_phase_result状态下,等到相位测量结果准备好后,进入delay_cacul状态;如果长时间,相位结果都没有准备好,或者相位结果错误,则返回idle状态。在delay_cacul状态下,开启offset计算模块后,进入wait_result状态。在wait_result状态下,当检测到偏移测量结果准备好信号后,进入offset_update状态;否则返回到idle状态。在offset_update状态下,从节点时钟同步协议向本地时钟模块发送偏移校正信号,从而更新从节点的本地时钟,然后进入idle状态。
4 测试结果
实际测试环境包括一个主节点和一个从节点,之间用光纤连接。示波器用来观察主节点和从节点输出的pps信号。由于主从节点的时钟相位不一致,示波器观察到的就是这个相位差。pps上升沿到来时,主从节点时间戳通过串口模块输出给PC机。通过对比示波器测得的主从相位差以及pps上升沿主从时间戳的差值,就可以得出真实的时间戳同步精度。
本次测试使用了三种不同长度(3 m、6 m、5.15 m)的光纤,然后通过观察在不同长度光纤下的实验结果,从而可以判断时钟同步系统所能达到的精度。主从节点相位差直方图以及相应的时间戳的差值直方图略——编者注。
由这三种不同长度光纤所得出的结果来看,本文实现的同步时钟系统的时间戳同步精度可达1 ns。
结语
本方案实现的时钟同步系统,以IEEE 1588协议中基于时间戳的报文通信为基本原理,在纯硬件电路(FPGA)中实现。通过在主节点添加了相位差测试模块,消除了主从节点相位不同的影响,最后实现的时间戳同步精度高达1ns。
本文设计出来的时钟同步系统所需成本低,同步精度非常高,非常适合应用在需要高精度时间戳的场合。