摘要
IEEE1588标准又称为网络测量和控制系统的精确时钟同步协议标准,是IEEE标准委员会颁布的为了满足定位服务和无线移动通信系统高精度同步要求的标准。随着Ethernet技术的广泛应用,采用IEEE1588方式通过以太网实现时钟同步方案在网络上的应用越来越普遍。本文简要介绍1588的原理和常见的实现方式,并详细介绍TI KeyStone架构上的1588实现方案。
1 概述
1588是IEEE规范定义的网络实时同步标准[1]。它提供一种通过网络信息交互以获得精准时钟信息的标准。和在广域网上的NTP协议比较,1588最新标准提供高于纳秒级别的时钟精度,可以用来满足要求在一个相对小的空间范围内对时钟同步有严格要求的应用场景,例如基站同步,音视频网桥(AVB),工业控制,产线控制,军事应用等。
KeyStone架构是TI推出的高性能多核架构,该架构目前已演进了两代——KeyStone1 和KeyStone2。基于KeyStone架构,TI推出多款针对基站和网络应用的多核芯片。
KeyStone1家族基于40nm工艺,包括如下器件型号:
- TCI6616,参见文献[2]
- TCI6618,参见文献[3]
- TCI6614 和TCI6612,参见文献[4]和[5]
- TMS320C6678、TMS320C6674、TMS320C6672 等,参见文献[6]
KeyStone2家族基于28nm工艺,包括如下器件型号:
- TCI6636K2H,参见文献[7]
- TCI6634K2K,参见文献[8]
- TCI6638K2K,参见文献[9]
- TCI6630K2L (即将发布),参见文献[10]
本文首先介绍IEEE1588的基本原理,然后以常见的基于PHY的IEEE1588实现方案为参考,介绍KeyStone架构上支持IEEE1588的硬件功能。同时,本文总结了在KeyStone1芯片上实现IEEE1588方案需要注意的实现细节,并对KeyStone2芯片的1588方案做初步介绍。
2 IEEE1588时钟同步原理
IEEE1588使用精准时间协议PTP(Precision Timing Protocol),通过端到端的报文交互获得时钟参考信息,矫正本地时钟频率和相位。1588协议基于两个假设条件:第一,在时钟源设备和受时钟设备之间,网络报文传输时间是对称的。也就是说一个报文从时钟源设备到受时钟设备的传输时间等于报文从受时钟设备到时钟源设备的传输时间相同;第二,在PTP报文交换过程当中,本地时钟的漂移可以忽略不计。
图1:IEEE1588时钟同步原理
如图所示,在经过sync->delay_request->delay_response消息交互以后,受时钟设备获得4个时间值。以太网报文在两个设备之间的环路时延可以计算为:
Troundtrip=(t4-t1)-(t3-t2)
假设包传输时延是对称的,那么单路时延是:
Ttripdelay=((t4-t1)-(t3-t2))/2
从时钟设备的时钟和主时钟的差值是:
Tdelta=t2-(t1+Ttripdelay)
实际部署时,时钟源发送sync消息,从设备根据多个sync消息来计算本地时钟的偏差。当从设备需要同步本地时钟相位的时候,发送delay_req消息,时钟源发送delay_response,从设备根据获得的4个时间值来估计相位的偏差。
对于时钟源设备,如果在发送sync报文时所带的时间戳就是报文发送时采集的准确时间,这种模式叫做single step模式。如果发送sync报文的时候所带的时间戳只是一个近似时间,sync报文发送的准确时间不能在发送sync报文的时候获得或者实时插入到sync报文中,时钟源设备需要发一个follow up消息报文,用来传递sync 报文的准确发送时间,这种模式叫做two step模式。下面介绍的PHY 方案支持时钟源single step,TI的KeyStone架构支持时钟源two step模式。
3 1588芯片实现方案
根据打时间戳的方式不同,常见的1588方案分为软件时间戳方案和硬件时间戳方案。软件方案通常是通过软件手段在网络报文的接收中记录PTP报文接收或发送时间,处理灵活,可以根据应用场景灵活处理PTP协议报文,支持多种封装格式。但是因为软件中断的时间抖动大,软件时间戳方案的精度较差,在对精度要求不高的情况下使用。硬件方案通过特殊硬件解析PTP 报文,并用硬件记录报文发送或接收时间。硬件方案精度高,但是需要特殊硬件解析PTP报文,在特殊场景中,例如PTP over IPSec,报文经过加密,硬件无法解析PTP报文。根据硬件方案获取报文收发时间地点不同,硬件方案又分在PHY上集成的1588方案和MII集成的1588方案等。
下面先简单介绍一下TI基于PHY的硬件解决方案作为参考,然后着重介绍KeyStone架构上的基于MII和PA的1588 方案。
3.1 以太网PHY1588方案(DP83640)
图2:DP83640高精度时钟同步硬件模块
DP83640[11]是一款百兆网口PHY,集成1588功能,对外提供校准过的时钟和PPS信号,同时还支持同步以太网功能,直接从物理层获得远端时钟。在支持同步以太网的情况下,使用1588做相位调整,实验表明最终的时钟偏差精度可以达到纳秒以下。
83640 timestamp模块维护一个本地的1588计数器,包括32bit的秒计数和30bit的纳秒计数。PTP报文中要求的48bit秒计数中的高16位需要软件维护。上层软件在发送一个1588报文的时候,时间戳中秒计数的高16位由软件设置的,低32位设置为0。
报文解析模块用来匹配解析PTP报文。83640支持1588Annex D&E和Annex F格式的报文。当PTP报文送至PHY时,报文解析硬件检测到这个PTP报文的时钟,在报文发出时,把本地的时间戳写到PTP报文里面,并修改相关的CRC 和CHKSUM值。83640支持1588 single step模式的时钟源。在报文接收方向,同样有报文解析硬件。在解析到PTP报文以后,接收报文的准确时间戳可以插入在报文里,或者通过控制接口上报。
83640的1588时钟模块对外提供频率控制接口,软件通过控制寄存器可以调整输出的时钟频率。1588时钟模块根据上层软件的配置,对1588时钟模块的输入时钟信号微调,然后分频输出。时钟调整是通过调整每个时钟周期的时间来实现的。在每个时钟周期调整的单位是2-32ns。在正常模式下,这个调整机制用来补偿本地时钟和时钟源的差距。在长期工作以后产生累积同步误差时,软件可以调整寄存器的值,在一定时间内,对频率向上或者向下微调,以补偿相位差距。当在相位补偿以后,恢复正常频率补偿模式。
软件协议栈通过协议处理以后获得本地的时钟与时钟源的绝对时间差值,然后通过寄存器调整本地绝对时间戳。在修改时,软件把绝对时间差值写入寄存器,然后使能修改。这种方法适用初始同步时单次校正本地绝对时间戳。如在正常工作中出现累积相位偏差,应该使用前面介绍的微调方法,避免输出时钟抖动。
应用层通过设置83640的trigger control模块来控制输出PPS 或者其他同步信号。应用可以设置在timestamp 的哪些具体时刻某个GPIO管脚可以发生反转。trigger的输出可以线与并输出到GPIO管脚,通过线与可以是输出复杂的周期波形。
83640方案实现简单,直接输出矫正时钟及相位信号,但是对于复杂传输场景支持困难;而且相比不包含IEEE1588功能的PHY芯片,83640的成本要高出许多。
3.2 KeyStone1 1588方案
KeyStone架构是TI推出的高性能多核架构,现在已经有KeyStone1和KeyStone2两种架构。KeyStone架构中也包含了对IEEE1588功能的支持。
KeyStone1系列芯片的1588方案包括两个硬件部分:记录时间戳,发送同步脉冲。KeyStone1支持two step的时间戳模式,同时也能支持1588协议中Annex D&E和Annex F规定的PTP报文解析。
对于记录时间戳,KeyStone1对于Annex D&E和Annex F采用不同的硬件来支持。Annex D&E使用以太网协处理(NetCP)里面的包加速器(PA)来支持;Annex F报文使用以太网交换机(GE Switch)里面的CPTS模块来支持 [12-13]。
对于同步信号的输出,KeyStone1里面需要通过Timer64[14]来完成。软件通过CPTS或者PA获取到时间戳后,计算需要调整的频率和相位,然后通过配置Timer64的周期寄存器来更改Timer64的输出周期,调整输出的相位信息;通过SPI接口调整外部的VCXO的输出频率,矫正本地时钟频率。
图3:KeyStone1 IEEE1588时钟同步方案
3.2.1 Annex D&E PTP报文处理
PA内部会维护一个48bit的计时器,该计时器的频率与PA的频率一致(一般是350MHz)。由于Annex D&E报文的承载方式为IP/UDP承载(报文模式为IPv4和IPv6),当用户收到或者发送一个IPv4或IPv6的PTP报文时,在PA 侧会记录一个报文接收(或发送)的时间戳,这个时间戳只有32bit(为48bit中的低32bit)。这个时间戳保存在用户指定的QMSS的某个Queue的描述符里面。
用户从Queue中提取出该描述符:如果是接收,用户可根据描述符信息解析报文类型,获取报文内容,同时读取32bit时间戳并换算成绝对时间。如果是发送,用户只需读取时间戳,转换为1588 48bit绝对时间后按照1588 two step的规则再做报文发送。
3.2.2 Annex F PTP报文处理
GE Switch模块上的CPTS模块支持对1588 Annex F(以太网封装)的PTP报文解析,支持VLAN。在CPSW逻辑匹配到PTP报文时,会触发一个硬件信号给CPTS模块用来触发时间戳获取。
CPTS 的时间戳模块维护一个32bit的timer,根据配置,这个timer可以工作在二分之一CPU主频上。这个timer 是一个free run timer。软件通过这个timer换算得到1588的32bit纳秒时钟和48bit秒时钟。因为timer只有32bit,所以软件需要处理timer反转事件,用来维护秒信息。CPTS得到时间事件以后,会将PTP报文的消息类型和Sequence ID等信息压入EVENT FIFO中,并触发中断让用户处理。
3.2.3 同步信号的产生
同步信号需要通过Timer64来产生。由于Timer64,PA以及CPTS都是共用KeyStone外部的VCXO,因此从时间源上保证各个计时器之间没有累积误差。这样计算出来的各个绝对时间也是固定不变的。
关于同步信号的时间戳,有两点需要说明:
1.KeyStone芯片的1588功能不维护绝对时间戳,时间信息是从CPTS timer或者PA的timer换算出来。这样也不支持对1588报文发送时实时修改,所以在用KeyStone芯片做时钟源时,芯片只支持two step模式。
2.输出时钟方案需使用KeyStone1芯片上的定时器的输出。因为CPTS(或PA)上打时间戳的计数器和定时器使用的时钟虽然是同源,但是相位不同,产生的PPS时钟时,需要软件参与校正两个计数器,并对记录相应的相位差。具体实现时,需要首先对CPTS(或PA)里面的计数器和选定的Timer64计数器相差相位进行计算。软件首先操作CPTS(或PA)寄存器,触发一个CPTS时间戳记录事件(或者发起一个读取PA时间戳寄存器的命令),然后马上读取timer64的值。考虑到cache问题以及硬件总线上的竞争可能性,软件应在一个循环内多次执行这个操作,保证执行程序加载到L1 cache中,两个时钟之间的相位差应该可以通过循环几次获得的值平均得到。
3.3 KeyStone2 1588方案
KeyStone2架构的TI芯片对1588的支持做了改进和增强。CPTS模块支持同步以太网(Annex F)和1588 Annex D &E的报文。在KeyStone2芯片中,PPS输出是直接由CPTS逻辑驱动的。软件通过设置相关寄存器设置下一个PPS 输出时timestamp的值,当计数器跑到设置的值的时候,硬件触发PPS信号输出。
图4: KeyStone2 IEEE1588时钟同步方案
相比KeyStone1的方案,KeyStone2的主要优点在于:
1.方案简单,涉及到的硬件和底层器件更少
KeyStone1需要PA,CPTS,Timer64,QMSS等外设和加速器来支持整套方案,而KeyStone2只需要CPTS一个模块就可以支持Annex D&E和Annex F的PTP报文,同时也支持同步信号的输出;
2.时间戳个数减少,降低了计算复杂度
KeyStone1里面需要计算包括PA时间戳,CPTS时间戳以及Timer64的时间戳在内的共计3个时间戳与PTP报文的真实时间的绝对时间相差;KeyStone2里面只有CPTS一个时间戳需要计算;
3.方案全由硬件逻辑完成,彻底避免了软件干预同时也提高了同步精度
KeyStone 1的方案由于记录时间戳的时间源(PA和CPTS)与发送同步信号的时间源(Timer64)是不同的,因此在系统运行的时候需要软件计算不同时间源的绝对时间差,这样才能在后面的时间同步中精确调整时间。这里有软件读取并计算时间差的工作,这部分工作不可避免的存在软件误差,虽然可以通过多次计算取平均等统计手段缩小误差,但还是对精度存在一定的影响。KeyStone2中,记录时间戳和发送同步脉冲都在CPTS中,因此无需计算两者的时间差,这样就避免了软件干预,也提高了同步精度。
4 KeyStone1 1588方案实现
前文从原理和方案上描述了KeyStone中如何实现1588方案,本章节以KeyStone1为例,从技术细节方面来阐述1588实现方式。
以Annex F的PTP报文为例,1588的实现主要分为配置Gbe Switch[3]和计算时间偏差两部分。整体流程如下:当接收(或发送)一个802.3的PTP报文时,Gbe Switch会自动侦测到PTP报文的接收(或发送)时间,并将该时间戳记录下来;用户根据记录下来的时间戳,配置Timer64的时间输出信号,获取当前需要调整的时间偏差。
4.1 Gbe Switch配置
KeyStone1中的Gbe Switch是一个集成了1588 PTP报文检测的交换机,其中CPTS用来记录时间戳,CPSW用来侦测1588报文。因此1588实现方式主要通过配置CPTS和配置CPSW来实现。
4.1.1 CPTS配置
CPTS是KeyStone1架构中Gbe Switch中的一个模块,请参考文献[12]中的2.3.5章节。该章节详细介绍了CPTS模块的工作场景和寄存器列表。
图5: KeyStone1 CPTS寄存器列表
CPTS 配置步骤如下:
1)复位CPTS模块;
CPTS的复位通过将TS_CONTROL寄存器中的CPTS_EN位域写0来实现。
2)选择CPTS时钟源;
CPTS时钟源在CPTS_RFTCLK_SEL寄存器中选择,有四种时钟源可以选择:SYSCLK3,SYSCLK4,TIMI0 和TIMI1。其中SYSCLK3是1/2 CPU时钟,SYSCLK4是1/3 CPU时钟,TIMI0和TIMI1分别是两个外部时钟输入pin脚,原本是作为Timer64的输入时钟,这里也可以复用为CPTS的时钟源。
3)使能CPTS模块;
CPTS的使能通过将TS_CONTROL寄存器中的CPTS_EN位域写1来实现。当CPTS使能后,CPTS内部的时间记数器就会根据输入时钟的频率开始记数。
4)使能CPTS中断;
CPTS模块中断使能通过配置INT_EABLE来完成。CPTS可以产生多种事件的中断,主要有:
- Push中断:用户手动触发一个Push事件,该事件会记录当前CPTS的时间戳,并触发中断;
- 记数器翻转中断:当CPTS的32bit记数器从0xFFFFFFFF变为0x00000000时会自动触发一个中断;
- 记数器半翻转中断:当CPTS的32bit记数器从0x7FFFFFFF变为0x80000000时会自动触发一个中断;
- 以太网PTP报文接收中断:当接受1个以太网PTP报文时触发中断;
- 以太网PTP报文发送中断:当发送1个以太网PTP报文时触发中断;
4.1.2 CPSW的配置
CPSW是属于Switch的组成部分,可以通过配置CPSW让Switch识别PTP报文。CPSW的报文识别功能也通过配置寄存器的方式来实现。需要说明的是,由于Switch对外有两个接口(port1和port2),因此对应的寄存器也有两份。其寄存器列表如下图所示:
图6: KeyStone1 CPSW寄存器列表
配置步骤如下:
1)配置LTYPE;
每种以太网报文都有一个类型,CPSW将根据这个类型配置侦测用户需要的报文。根据以太网报文的定义,IEEE1588的PTP报文的类型为0x88F7。用户需要将这个类型写入Pn_TS_SEQ_LTYPE中(n表示端口号)。
2)配置VLAN ID(如果使能了VLAN报文的话);
用户可以定义需要的VLAN ID,在Pn_TS_VLAN寄存器里面配置。
3)使能CPSW检测模块;
CPSW的使能包括接收和发送的使能,需要用户配置Pn_TS_CTL里面对应的位域。
4.2 时间偏差的计算和调整
Gbe Switch完成对PTP报文的时间戳记录之后,用户需要根据时间戳计算当前需要调整的时间数。由于真实系统时间是基于Timer64的时间戳,因此用户在计算CPTS的时间戳之后需要换算到真实系统时间。
为了方便说明和计算,在下面的配置中,假定CPU时钟为1GHz,CPTS采用1/3 CPU时钟,Timer64的定时周期为1ms。
4.2.1 CPTS时钟到系统时钟
由于CPTS的时间戳只有32bit,因此CPTS翻转后时间戳不能代表真实时间,用户需要记录翻转的次数以获得Tcpts。那么换算关系如下:
其中,N代表CPTS翻转次数,TIME_STAMP_CPTS代表当前CPTS的32bit时间戳。Timer64是以1ms为周期进行记数的定时器,其输入时钟为固定的1/6 CPU时钟,因此可以算出Timer64的记数器范围为0~166666(Timer64采用连续记数方式)。因此可以得出如下公式:
其中TIME_STAMP_TIMER代表当前Timer64的时间戳。当Timer64和CPTS完成使能,用户可以通过读取两者时间戳的方式获取两者的在1ms内的基本时间戳。假设读取之后两者时间戳偏差为Toffset,由于Timer64和CPTS同源,因此可以认为此偏差在CPTS或Timer64复位前保持不变。
4.2.2 时间调整
1588的时间调整包括调频和调相两部分。通常来说,需要先保证频率同步,然后再进行相位调整。调频的部分不需要Timer64的参与,需要比对PTP报文中的时间戳差值和CPTS记录的时间戳,处理如下:
其中Teth1和Teth0分别表示收到的两个PTP报文中自带的主时钟时间戳(纳秒级),而Tcpts1和Tcpts0代表这接收这两个PTP报文时由CPTS得到的时间。考虑到传输对称性,这里可以不考虑传输过程时延的影响。
用户通过比对eth和cpts来确定当前系统频率与主时钟频率的差别。
当调频过程基本完成,即eth≈cpts时可以进行相位调整。调相的主要工作是调整Timer64的输出脉冲,由于输出脉冲以1ms为周期,因此只需计算在1ms内的偏差即可。相位调整的主要原理如下:
其中,Teth表示接收到的PTP报文的主时钟时间,Tcpts表示该PTP报文对应的CPTS时间,Toffset表示CPTS和Timer64的时间差,Ttripdelay表示网络传输时间。
按照计算后,Timer64的输出周期需要满足如下条件:
4.3 KeyStone1 1588方案的说明
KeyStone1的1588方案主要依靠配置Gbe Switch和软件换算时间戳两部分来完成。需要强调的是,在软件换算时间的部分,这涉及到具体的1588时间戳计算算法。基于应用的需求和精度需求,许多算法往往比这里介绍的更复杂,但是原理上来说都是相同的。这也是KeyStone架构使用软件实现1588部分的一个优势,用户可以灵活使用软件功能来提高1588的同步精度。
5 小结
从目前来看,IEEE1588v2标准已经越来越多的应用在通讯网络中。由于IEEE1588v2标准也还在不断的完善中,因此从技术角度出发,熟悉1588同步原理,了解并设计不同场景中的1588方案,不论是从芯片设计角度或者基站整体解决方案角度来说,都是十分必要的。
本文简要的介绍了IEEE1588的原理,并分类分析了1588同步功能在PHY 以及KeyStone1和KeyStone2芯片上的应用方案。以太网PHY实现1588同步的精度最高,但是成本相对比较昂贵;德州仪器的KeyStone架构上集成了支持1588的Switch,用户可以通过KeyStone架构灵活实现1588同步功能,也为用户的方案设计提供了更多的选择。
参考文献
[1] IEEE Standard for a Precision Clock Synchronization Protocol for Networked Measurement and Control Systems
[2] http://www.ti.com/product/tms320tci6616
[3] http://www.ti.com/product/tms320tci6618
[4] http://www.ti.com/product/tms320tci6614
[5] http://www.ti.com/product/tms320tci6612
[6] http://www.ti.com/product/tms320c6670
[7] http://www.ti.com/product/tci6636k2h
[8] http://www.ti.com/product/tci6634k2k
[9] http://www.ti.com/product/tci6638k2k
[10] http://www.ti.com/product/tci6630k2l
[11] DP83640 Precision PHYTERTM
[12] KeyStone Architecture Gigabit Etherent (GbE) Switch Subsystem (SPRUGV9B)
[13] Packet Accelerator (PA) for KeyStone Devices User's Guide (SPRUGS4A)
[14] 64-Bit Timer (Timer64) for KeyStone Devices User's Guide (SPRUGV5A) |