陳 龍 劉淑芬 姜 宏 葉有時 趙云富
北京控制工程研究所,北京100190
在分布式實時系統中,時鐘同步是進行數據調度和任務執(zhí)行的關鍵技術之一,它提供了確定事件發(fā)生時間先后順序的機制,保證了節(jié)點發(fā)送和接收消息等在時間邏輯上的正確性[1]。在時間確定性網絡中,通過使用時鐘同步協議等策略保證高精度的時鐘同步。NTP協議作為最早提出的時鐘同步協議,通過UTC時間報文校正主機時間,同步精度可達到毫秒級[2]。在TTE(時間觸發(fā)以太網)中使用IEEE 1588時鐘同步協議,使用時間戳進行透明時鐘傳輸,實現亞微秒級的時鐘同步。Yin Hongtao等通過FPGA實現了1588時鐘同步,同步精度達到了50ns[3]。
SpaceWire總線協議專門針對航天應用而設計,具有高速(最高傳輸速率為400Mbps)、可靠、低功耗等諸多優(yōu)點[4],被成功應用于“Mars Express”火星探測器、“Rosetta Spacecraft”彗星探測項目和“Cryosat”地球環(huán)境遙感衛(wèi)星等諸多項目中[5]。北京控制工程研究所對SpaceWire ECSS-E-50-12C標準進行了改進,結合光纖重量輕、寬帶寬、抗干擾能力強的特點,研制了SpaceWire光纖總線,進一步提高了總線速率[6],實現了2Gbps的高速傳輸。
總線速率的提升,對時鐘同步提出了更高要求。改進前SpaceWire ECSS-E-50-12C標準規(guī)定通過Time-Code(時間碼)分發(fā)的方法保證節(jié)點的時鐘計數一致,同步精度很難達到10μs[4]。改進后,在SpaceWire光纖總線中,吉比特每秒的傳輸速率下,消息的傳輸時間縮短到微秒級,消息間隔進一步縮短,因此需要更高精度的時鐘同步提供保障。
SpaceWire ECSS-E-50-12C標準中使用了基于Time-Code(時間碼)廣播的主從式時間同步。在協議中規(guī)定了唯一的主節(jié)點,其他節(jié)點作為從節(jié)點。主節(jié)點的時鐘為參考時鐘,并通過網絡廣播包含6bits時間計數的Time-Code讓從節(jié)點與主節(jié)點計數保持一致來實現時間同步[4]。Time-Code如下圖:

圖1 Time-code消息
ESC為時間消息幀頭,1、0為時間碼標志,T0到T7為8比特時間計數,其中6比特為計數值,2比特為預留位。當從節(jié)點接收到Time-Code時,首先將計數值取出,然后與本地計數器值比較,若本地計數值比接收的計數值少1,則更新本地計數值并接收處理后續(xù)消息,否則只更新本地計數值并返回錯誤信號。

1)計時精度不高且計時長度短。從節(jié)點的時間計數值完全依賴Time-Code信號,計時精度受Time-Code的同步間隙限制,間隙越短精度越高。在實際過程中同步間隙不可能太短[9],因此計時精度低。6位時間碼最大的計數值為64,超過64后需要循環(huán)計數,計時長度太短。在光纖總線系統中,短消息的傳輸在微秒內完成,消息間隔小,原協議規(guī)定的時間計數遠遠不能滿足計時精度和長度要求。需要提高計數器位數,并延長計時長度;
2)延時誤差不可控。原協議規(guī)定的時鐘同步方式,傳輸延時受節(jié)點數量和鏈路傳輸速率影響[7],且通過6位的時間碼無法計算延時時間。另外由于忽略了消息處理延時的抖動,導致延時誤差不可控。在SpaceWire光纖總線系統中除了根據光纖總線節(jié)點特性設計時間戳來計算延時誤差,同時需要考慮延時計算策略來控制延時抖動;
3)頻率偏差無法補償。在使用本地時鐘計數的過程中,不同節(jié)點間時鐘頻率大小可能不同,且物理時鐘晶振的穩(wěn)定性受環(huán)境溫度以及工作時長的影響,時鐘頻率會產生漂移。在一個同步周期內,時鐘頻率偏差的積累會對同步精度造成較大影響。因此在提高晶振性能的同時,需要通過有效的方式來消除時鐘頻率偏差的影響。使用固定時鐘頻率調整的方式受經驗限制,且無法實時動態(tài)調整,考慮設計動態(tài)的時鐘頻率補償方法。
在高速Spacewire光纖總線系統中,針對以上問題,對原協議規(guī)定的時鐘同步方式進行了改進:1)采用節(jié)點的本地時鐘設計了32位高精度的時鐘計數機制,提高時鐘計數的精度和長度;2)參考IEEE1588協議,在時間消息傳輸過程中用打時間戳的方式計算時鐘延時進行延時補償,并通過計算平均延時時間來減少延時抖動對同步精度的影響;3)增加頻率偏差補償,通過對時鐘頻率偏差的計算來動態(tài)調整時鐘計數。改進的時鐘同步方式如圖2所示:

圖2 時鐘同步改進原理圖
為了滿足時鐘計數的精度和長度要求,改進了原協議中從節(jié)點使用6位計數器的時鐘計數方式,將主節(jié)點的參考時鐘和從節(jié)點本地時鐘設為32位,并通過設置標識來實現進位計算。32位時鐘計數寄存器如圖3所示:

圖3 32位時鐘計數
前2位是標識位,“00”表示時鐘計數,“01”表示進位計數。當標識位是“00”時,后30位表示時鐘計數值,每當時鐘輸入跳變一次,產生一個時鐘節(jié)拍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時刻,當主節(jié)點發(fā)送時間消息時,產生一個使能信號,將此時的時鐘值Tclock0(t0)存入時間戳寄存器;在t0′時刻,從節(jié)點接收到信號,并通過硬件電路進行時間消息判斷,在t0″時刻,解析完成,產生使能信號,將此時的時鐘值Tclock1(t0″)存入時間戳寄存器。類似的方式,將從節(jié)點響應消息的發(fā)送時刻Tclock1(t1″),主節(jié)點接收時刻Tclock0(t1)通過時間戳的使能信號存入時間戳寄存器。由于解析時間消息造成的延時抖動Latency0′和Latency1′通過時間差值來消除,因此計算時鐘延時為:

(2)
在t時刻的時鐘延時均值為Tlatency(t)
(3)
其中,n為t時刻前,寄存器中Tlatency的個數。
由于操作系統和協議棧的影響,時間戳標記越靠近硬件單元精度越高。在SpaceWire光纖總線系統中,網絡接口主要由光電/電光轉換模塊(光模塊)組成,因為光信號不能直接用于判斷消息內容,所以在硬件電路中設計時間消息檢測模塊來使能時間戳信號。
為了應對時鐘頻率偏差的動態(tài)變化,提出了使用時鐘計數寄存器來計算頻率偏差值和動態(tài)調整計數的方法。時鐘頻率偏差計算如圖5:

圖5 時鐘頻率偏差計算
本地時鐘頻率與參考時鐘頻率的關系可以通過固定時間段內,產生時鐘節(jié)拍的比值來衡量:
(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時刻時鐘消息從主節(jié)點到從節(jié)點的延時,假設同一路徑的延時差值不大,則差值約為0。其中Tick0(t0)、Tick0(t1)、Tick1(t0′)和Tick1(t1′)的值,通過時間戳的使能信號存入時鐘計數寄存器。本地時鐘的時
鐘調整頻率fadjust(tn)為:

(7)
從節(jié)點在tn時刻收到的外部時鐘值Texternal(tn),由式(3)得平均時延Tlatency(tn),通過對時鐘信號進行延時補償即為本時刻的參考時鐘值Tsyn(tn):
Tsyn(tn)=Texternal(tn)+Tlatency(tn)
(8)
由以上計算的參考時鐘值對本地時鐘進行相位補償,同時由計算的時鐘調整頻率對本地時鐘計數進行動態(tài)修正,得到此時的本地時鐘值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為含有主節(jié)點和從節(jié)點的SpaceWire光纖總線系統時鐘同步模塊示意圖。

圖6 時鐘同步模塊示意圖
Master_en為主從節(jié)點標志信號,值為1時,節(jié)點為主節(jié)點, 系統中有且只有一個主節(jié)點;為0時,節(jié)點為從節(jié)點。Tn_t為發(fā)送時刻節(jié)點的時鐘值,即式(9)中的Tclockn(t);Tn_oi為時間戳寄存器計算的時鐘差值,即式(2)中Tclockn(t1)-Tclockn(t0);Tn_oo為時鐘計數寄存器計算的時鐘節(jié)拍差值,即式(5)中的ΔN。Time_in_stamp和Time_out_stamp為時間戳信號,通過網絡接口中的時間消息判斷單元使能。在消息發(fā)送和接收過程中都加入了最大80ns的隨機傳輸延時以及8ns的隨機延時抖動。
時間消息的格式為:“地址”(8bits)+“時間消息標識”(8bits)+“Tn_t”(64bits)+“Tn_oi”(32bits)+“Tn_oo”(32bits)。
仿真驗證中,首先測試了使用SpaceWire ECSS-E-50-12C標準規(guī)定的時鐘同步方法,主節(jié)點和從節(jié)點基于Time-Code分發(fā)進行時間計數同步。然后對時鐘同步方式進行改進,測試了主從節(jié)點在不同時鐘頻率情況下,使用時鐘延時調整模塊的結果。最后加入動態(tài)時鐘頻率調整模塊后,測試了時鐘同步精度。
在光纖總線系統中,主節(jié)點的時鐘頻率設為125MHz,調整同步間隙為10ms,測試原協議使用Time-Code分發(fā)結果如圖7:

圖7 原協議時鐘同步仿真結果
時鐘同步精度通過直接比較一段時間內時鐘計數差值來衡量,測得最大時鐘計數偏差為1,計算的同步精度約為10ms。其計時精度為10ms,且最大計數為64,所以計時長度只有640ms。
在對時鐘同步的改進中,用32位的時鐘計數表示當前時間,使最小的計時精度達到8ns。為了模擬子節(jié)點的時鐘偏差,從節(jié)點中的時鐘計數采用100MHz的本地時鐘,與主節(jié)點時鐘頻率相差25MHz。同樣在10ms的同步間隙下進行時鐘同步測試。

圖8 時鐘延時調整的時鐘同步仿真結果
加入時鐘延時調整后,時鐘同步效果如圖8,通過時間戳計算得平均延時為12個時鐘計數,即96ns,同步后時鐘延時為-2,即-16ns。最大計數偏差24997,時鐘同步精度約為199976ns。
在延時補償的基礎上繼續(xù)調整時鐘頻率進行動態(tài)時鐘計數修正,時鐘同步效果如圖:

圖9 加入動態(tài)頻率調整的時鐘同步仿真結果
在3個時鐘同步間隙完成了25MHz時鐘頻率偏差的調整。在第一個時鐘同步間隙,時鐘頻率修正存在誤差,時鐘計數差值隨時間增大,最大差值為20;第二個同步間隙時鐘頻率偏差被進一步調整,最大時鐘計數差值穩(wěn)定為10;第三個同步間隙開始,時鐘計數偏差幾乎不變,此時頻率修正達到穩(wěn)定。時鐘計數偏差絕對值最大值為3,同步精度約為24ns。
最后統計了在不同時鐘同步間隙下,3種情況的時鐘同步結果,如表1。

表1 不同改進方法下時鐘同步參數測試結果
由統計結果可以看出,原協議的時鐘同步精度與時鐘同步間隙有關,時鐘同步間隙越短,時鐘同步精度越高,在實際應用中最高能達到微秒級。改進后的時鐘同步方法能夠明顯改善時鐘同步精度,當加入時鐘延時調整,使用時間戳寄存器計算平均延時后,時鐘延時被降低到約16ns。但是只進行時鐘延時補償,同步精度依然受同步間隙影響較大,需要進行更加精細的調整。加入時鐘頻率調整后,使用時鐘計數寄存器進行動態(tài)時鐘計數修正,時鐘同步效果明顯被提升,時鐘同步精度達到納秒級。
仿真結果表明,改進后的時鐘同步方法能夠有效解決SpaceWire ECSS-E-50-12C標準中time-code時間分發(fā)的同步精度問題。在SpaceWire光纖總線中,改進后的時鐘同步使用了本地時鐘進行32位的時鐘計數,計時精度提高到了8ns,計時長度提升到8.59*109s。采用物理單元打時間戳計算平均時鐘延時,可以準確計算傳輸延時,降低延時抖動的影響,延時誤差約為16ns。采用時鐘計數寄存器計算時鐘頻率偏差,通過動態(tài)修正時鐘計數補償時鐘頻率偏差,進一步提高時鐘同步精度達到了24ns,能夠滿足高速SpaceWire光纖總線時鐘同步的需求。