陈 龙 刘淑芬 姜 宏 叶有时 赵云富
北京控制工程研究所,北京100190
在分布式实时系统中,时钟同步是进行数据调度和任务执行的关键技术之一,它提供了确定事件发生时间先后顺序的机制,保证了节点发送和接收消息等在时间逻辑上的正确性[1]。在时间确定性网络中,通过使用时钟同步协议等策略保证高精度的时钟同步。NTP协议作为最早提出的时钟同步协议,通过UTC时间报文校正主机时间,同步精度可达到毫秒级[2]。在TTE(时间触发以太网)中使用IEEE 1588时钟同步协议,使用时间戳进行透明时钟传输,实现亚微秒级的时钟同步。Yin Hongtao等通过FPGA实现了1588时钟同步,同步精度达到了50ns[3]。
SpaceWire总线协议专门针对航天应用而设计,具有高速(最高传输速率为400Mbps)、可靠、低功耗等诸多优点[4],被成功应用于“Mars Express”火星探测器、“Rosetta Spacecraft”彗星探测项目和“Cryosat”地球环境遥感卫星等诸多项目中[5]。北京控制工程研究所对SpaceWire ECSS-E-50-12C标准进行了改进,结合光纤重量轻、宽带宽、抗干扰能力强的特点,研制了SpaceWire光纤总线,进一步提高了总线速率[6],实现了2Gbps的高速传输。
总线速率的提升,对时钟同步提出了更高要求。改进前SpaceWire ECSS-E-50-12C标准规定通过Time-Code(时间码)分发的方法保证节点的时钟计数一致,同步精度很难达到10μs[4]。改进后,在SpaceWire光纤总线中,吉比特每秒的传输速率下,消息的传输时间缩短到微秒级,消息间隔进一步缩短,因此需要更高精度的时钟同步提供保障。
SpaceWire ECSS-E-50-12C标准中使用了基于Time-Code(时间码)广播的主从式时间同步。在协议中规定了唯一的主节点,其他节点作为从节点。主节点的时钟为参考时钟,并通过网络广播包含6bits时间计数的Time-Code让从节点与主节点计数保持一致来实现时间同步[4]。Time-Code如下图:
图1 Time-code消息
ESC为时间消息帧头,1、0为时间码标志,T0到T7为8比特时间计数,其中6比特为计数值,2比特为预留位。当从节点接收到Time-Code时,首先将计数值取出,然后与本地计数器值比较,若本地计数值比接收的计数值少1,则更新本地计数值并接收处理后续消息,否则只更新本地计数值并返回错误信号。
1)计时精度不高且计时长度短。从节点的时间计数值完全依赖Time-Code信号,计时精度受Time-Code的同步间隙限制,间隙越短精度越高。在实际过程中同步间隙不可能太短[9],因此计时精度低。6位时间码最大的计数值为64,超过64后需要循环计数,计时长度太短。在光纤总线系统中,短消息的传输在微秒内完成,消息间隔小,原协议规定的时间计数远远不能满足计时精度和长度要求。需要提高计数器位数,并延长计时长度;
2)延时误差不可控。原协议规定的时钟同步方式,传输延时受节点数量和链路传输速率影响[7],且通过6位的时间码无法计算延时时间。另外由于忽略了消息处理延时的抖动,导致延时误差不可控。在SpaceWire光纤总线系统中除了根据光纤总线节点特性设计时间戳来计算延时误差,同时需要考虑延时计算策略来控制延时抖动;
3)频率偏差无法补偿。在使用本地时钟计数的过程中,不同节点间时钟频率大小可能不同,且物理时钟晶振的稳定性受环境温度以及工作时长的影响,时钟频率会产生漂移。在一个同步周期内,时钟频率偏差的积累会对同步精度造成较大影响。因此在提高晶振性能的同时,需要通过有效的方式来消除时钟频率偏差的影响。使用固定时钟频率调整的方式受经验限制,且无法实时动态调整,考虑设计动态的时钟频率补偿方法。
在高速Spacewire光纤总线系统中,针对以上问题,对原协议规定的时钟同步方式进行了改进:1)采用节点的本地时钟设计了32位高精度的时钟计数机制,提高时钟计数的精度和长度;2)参考IEEE1588协议,在时间消息传输过程中用打时间戳的方式计算时钟延时进行延时补偿,并通过计算平均延时时间来减少延时抖动对同步精度的影响;3)增加频率偏差补偿,通过对时钟频率偏差的计算来动态调整时钟计数。改进的时钟同步方式如图2所示:
图2 时钟同步改进原理图
为了满足时钟计数的精度和长度要求,改进了原协议中从节点使用6位计数器的时钟计数方式,将主节点的参考时钟和从节点本地时钟设为32位,并通过设置标识来实现进位计算。32位时钟计数寄存器如图3所示:
图3 32位时钟计数
前2位是标识位,“00”表示时钟计数,“01”表示进位计数。当标识位是“00”时,后30位表示时钟计数值,每当时钟输入跳变一次,产生一个时钟节拍tick,时钟计数加1;当标识位是“01”时,后30位表示进位计数,每当时钟计数记满时,进位计数加1,同时时钟计数值清零。如果通过数字时钟计数表示当前参考时钟值,则参考时钟Tclock0(t)等于Tick0(t),为时钟计数N00(t)和进位计数N01(t)之和。
Tclock0(t)=Tick0(t)=N00(t)+N01(t)*Ncount
(1)
其中,Ncount为时钟计数最大值,即230。通过这种方式能够产生最大精度的时钟值,同时有效增加计时长度。例如,当时钟频率为125MHz时,时钟计数精度为8ns,当进位计数全部记满时,能够记的最大位数为260,通过计算能够实现最大的计时长度为8.59*109s。
在主从式时间同步过程中,延时通过在时间消息中加盖时间戳来计算。平均延时通过请求-响应的方式计算,可以减少消息处理过程中延时抖动的影响。如图4所示:
图4 时钟延时计算
在t0时刻,当主节点发送时间消息时,产生一个使能信号,将此时的时钟值Tclock0(t0)存入时间戳寄存器;在t0′时刻,从节点接收到信号,并通过硬件电路进行时间消息判断,在t0″时刻,解析完成,产生使能信号,将此时的时钟值Tclock1(t0″)存入时间戳寄存器。类似的方式,将从节点响应消息的发送时刻Tclock1(t1″),主节点接收时刻Tclock0(t1)通过时间戳的使能信号存入时间戳寄存器。由于解析时间消息造成的延时抖动Latency0′和Latency1′通过时间差值来消除,因此计算时钟延时为:
(2)
在t时刻的时钟延时均值为Tlatency(t)
(3)
其中,n为t时刻前,寄存器中Tlatency的个数。
由于操作系统和协议栈的影响,时间戳标记越靠近硬件单元精度越高。在SpaceWire光纤总线系统中,网络接口主要由光电/电光转换模块(光模块)组成,因为光信号不能直接用于判断消息内容,所以在硬件电路中设计时间消息检测模块来使能时间戳信号。
为了应对时钟频率偏差的动态变化,提出了使用时钟计数寄存器来计算频率偏差值和动态调整计数的方法。时钟频率偏差计算如图5:
图5 时钟频率偏差计算
本地时钟频率与参考时钟频率的关系可以通过固定时间段内,产生时钟节拍的比值来衡量:
(4)
其中,fclock0(t1)和fclock1(t1))为t0到t1时刻参考时钟和本地时钟的时钟频率,ΔN和Δn′为t0到t1时刻参考时钟和本地时钟的时钟计数,由公式(1)知:
ΔN=Tick0(t1)-Tick0(t0)
(5)
Δn′=Tick1(t1′)-Tick1(t0′)+
latency1-latency0
(6)
latency0和latency1为t0时刻和t1时刻时钟消息从主节点到从节点的延时,假设同一路径的延时差值不大,则差值约为0。其中Tick0(t0)、Tick0(t1)、Tick1(t0′)和Tick1(t1′)的值,通过时间戳的使能信号存入时钟计数寄存器。本地时钟的时
钟调整频率fadjust(tn)为:
(7)
从节点在tn时刻收到的外部时钟值Texternal(tn),由式(3)得平均时延Tlatency(tn),通过对时钟信号进行延时补偿即为本时刻的参考时钟值Tsyn(tn):
Tsyn(tn)=Texternal(tn)+Tlatency(tn)
(8)
由以上计算的参考时钟值对本地时钟进行相位补偿,同时由计算的时钟调整频率对本地时钟计数进行动态修正,得到此时的本地时钟值Tclock1(t):
Tclock1(t)=Tick1(t)+Tsyn(tn)-Tclock1(tn)+
(Tick0(t)-Tick0(tn))*fadjust(tn)
(9)
本地时钟与参考时钟的时钟偏差为Toffset(t):
Toffect(t)=Tclock0(t)-Tclock1(t)
(10)
max(Toffect(t))即为时钟同步精度。
为了测试改进前后的时钟同步效果,通过Modelsim建立了时钟同步模型,并进行了仿真验证。
图6为含有主节点和从节点的SpaceWire光纤总线系统时钟同步模块示意图。
图6 时钟同步模块示意图
Master_en为主从节点标志信号,值为1时,节点为主节点, 系统中有且只有一个主节点;为0时,节点为从节点。Tn_t为发送时刻节点的时钟值,即式(9)中的Tclockn(t);Tn_oi为时间戳寄存器计算的时钟差值,即式(2)中Tclockn(t1)-Tclockn(t0);Tn_oo为时钟计数寄存器计算的时钟节拍差值,即式(5)中的ΔN。Time_in_stamp和Time_out_stamp为时间戳信号,通过网络接口中的时间消息判断单元使能。在消息发送和接收过程中都加入了最大80ns的随机传输延时以及8ns的随机延时抖动。
时间消息的格式为:“地址”(8bits)+“时间消息标识”(8bits)+“Tn_t”(64bits)+“Tn_oi”(32bits)+“Tn_oo”(32bits)。
仿真验证中,首先测试了使用SpaceWire ECSS-E-50-12C标准规定的时钟同步方法,主节点和从节点基于Time-Code分发进行时间计数同步。然后对时钟同步方式进行改进,测试了主从节点在不同时钟频率情况下,使用时钟延时调整模块的结果。最后加入动态时钟频率调整模块后,测试了时钟同步精度。
在光纤总线系统中,主节点的时钟频率设为125MHz,调整同步间隙为10ms,测试原协议使用Time-Code分发结果如图7:
图7 原协议时钟同步仿真结果
时钟同步精度通过直接比较一段时间内时钟计数差值来衡量,测得最大时钟计数偏差为1,计算的同步精度约为10ms。其计时精度为10ms,且最大计数为64,所以计时长度只有640ms。
在对时钟同步的改进中,用32位的时钟计数表示当前时间,使最小的计时精度达到8ns。为了模拟子节点的时钟偏差,从节点中的时钟计数采用100MHz的本地时钟,与主节点时钟频率相差25MHz。同样在10ms的同步间隙下进行时钟同步测试。
图8 时钟延时调整的时钟同步仿真结果
加入时钟延时调整后,时钟同步效果如图8,通过时间戳计算得平均延时为12个时钟计数,即96ns,同步后时钟延时为-2,即-16ns。最大计数偏差24997,时钟同步精度约为199976ns。
在延时补偿的基础上继续调整时钟频率进行动态时钟计数修正,时钟同步效果如图:
图9 加入动态频率调整的时钟同步仿真结果
在3个时钟同步间隙完成了25MHz时钟频率偏差的调整。在第一个时钟同步间隙,时钟频率修正存在误差,时钟计数差值随时间增大,最大差值为20;第二个同步间隙时钟频率偏差被进一步调整,最大时钟计数差值稳定为10;第三个同步间隙开始,时钟计数偏差几乎不变,此时频率修正达到稳定。时钟计数偏差绝对值最大值为3,同步精度约为24ns。
最后统计了在不同时钟同步间隙下,3种情况的时钟同步结果,如表1。
表1 不同改进方法下时钟同步参数测试结果
由统计结果可以看出,原协议的时钟同步精度与时钟同步间隙有关,时钟同步间隙越短,时钟同步精度越高,在实际应用中最高能达到微秒级。改进后的时钟同步方法能够明显改善时钟同步精度,当加入时钟延时调整,使用时间戳寄存器计算平均延时后,时钟延时被降低到约16ns。但是只进行时钟延时补偿,同步精度依然受同步间隙影响较大,需要进行更加精细的调整。加入时钟频率调整后,使用时钟计数寄存器进行动态时钟计数修正,时钟同步效果明显被提升,时钟同步精度达到纳秒级。
仿真结果表明,改进后的时钟同步方法能够有效解决SpaceWire ECSS-E-50-12C标准中time-code时间分发的同步精度问题。在SpaceWire光纤总线中,改进后的时钟同步使用了本地时钟进行32位的时钟计数,计时精度提高到了8ns,计时长度提升到8.59*109s。采用物理单元打时间戳计算平均时钟延时,可以准确计算传输延时,降低延时抖动的影响,延时误差约为16ns。采用时钟计数寄存器计算时钟频率偏差,通过动态修正时钟计数补偿时钟频率偏差,进一步提高时钟同步精度达到了24ns,能够满足高速SpaceWire光纤总线时钟同步的需求。