基于FPGA的高精度同步時(shí)鐘系統設計
摘要: 介紹了精密時(shí)鐘同步協(xié)議(PTP)的原理。本文精簡(jiǎn)了該協(xié)議,設計并實(shí)現了一種低成本、高精度的時(shí)鐘同步系統方案。該方案中,本地時(shí)鐘單元、時(shí)鐘協(xié)議模塊、發(fā)送緩沖、接收緩沖以及系統打時(shí)標等功能都在FPGA中實(shí)現。經(jīng)過(guò)測試,該方案能夠實(shí)現ns級同步精度。該方案成本低,并且易于擴展,非常適合局域網(wǎng)絡(luò )時(shí)鐘同步的應用領(lǐng)域。
本文引用地址:http://dyxdggzs.com/article/201808/388116.htm在很多大型物理實(shí)驗和工業(yè)應用中,時(shí)鐘同步技術(shù)都扮演著(zhù)舉足輕重的作用。比如在中國四川錦屏暗物質(zhì)探測實(shí)驗中,需要為多個(gè)獨立探測裝置提供相應的時(shí)間信息,這些探測器包括中心探測器(HpGe)、液氬反符合探測器、實(shí)驗室外部宇宙線(xiàn)反符合探測器[1]。又比如在大亞灣中微子實(shí)驗中,需要為三個(gè)實(shí)驗廳的子探測器提供同步時(shí)鐘和時(shí)間戳,也需要為未來(lái)的長(cháng)基線(xiàn)中微子振蕩實(shí)驗提供同步時(shí)鐘和時(shí)間戳[2]。
為此,本文基于可編程邏輯器件FPGA,設計了一套高精度、低成本、易于擴展的時(shí)間戳同步系統。

1 PTP協(xié)議簡(jiǎn)介
PTP精密時(shí)鐘定時(shí)協(xié)議又稱(chēng)為IEEE 1588協(xié)議。它的基本功能是利用基于時(shí)間戳的報文通信的方法,使得分布式網(wǎng)絡(luò )中的所有的時(shí)鐘都與特定的某個(gè)時(shí)鐘保持精確同步。IEEE 1588協(xié)議可以用軟件實(shí)現,也可以用專(zhuān)門(mén)的硬件實(shí)現。很顯然,用硬件實(shí)現能達到更高的精度。本文中的同步系統就是基于純硬件實(shí)現的。
IEEE 1588協(xié)議中定義了5種類(lèi)型的傳輸報文[3]:同步報文(sync)、跟隨報文(follow_up)、延時(shí)請求報文(delay_req)、延時(shí)響應報文(delay_resp)和管理報文(management)。其中前4種報文主要用于時(shí)間戳交換,具體的時(shí)間戳交換的過(guò)程示意圖如圖1所示。

圖1 PTP協(xié)議同步過(guò)程示意圖
如圖1所示,時(shí)間戳同步過(guò)程包括主節點(diǎn)和從節點(diǎn),主節點(diǎn)和從節點(diǎn)都利用晶振維持本地時(shí)鐘。同步的目的是使從節點(diǎn)的本地時(shí)鐘的時(shí)間戳與主節點(diǎn)本地時(shí)鐘的時(shí)間戳達到相對同步。未同步時(shí),從節點(diǎn)相對主節點(diǎn)有一個(gè)時(shí)間偏差offset。同步的過(guò)程能夠計算出這個(gè)偏差。
主時(shí)鐘周期性地向從時(shí)鐘發(fā)送同步報文SYNC,這個(gè)報文中沒(méi)有任何有效數據,但是當SYNC發(fā)出時(shí),主節點(diǎn)能夠記錄下來(lái)時(shí)間戳t1,當從節點(diǎn)接收到SYNC,從節點(diǎn)能夠記錄下來(lái)時(shí)間戳t2。為了讓從節點(diǎn)也知道t1,稍后主節點(diǎn)向從節點(diǎn)發(fā)送跟隨報文FOLLOW_UP,這個(gè)報文中包含了t1這個(gè)有效數據。
然后,為了計算主節點(diǎn)到從節點(diǎn)的延時(shí),在從節點(diǎn)接收到FOLLOW_UP后一段時(shí)間,從節點(diǎn)向主節點(diǎn)發(fā)送一個(gè)DELAY_REQ報文。和SYNC類(lèi)似,當DELAY_REQ離開(kāi)時(shí)得到時(shí)間戳t3,當DELAY_REQ到達主節點(diǎn)時(shí),主節點(diǎn)得到時(shí)間戳t4。一段時(shí)間后,主節點(diǎn)再向從節點(diǎn)發(fā)送DELAY_RESP報文,這個(gè)報文中包含了t4,從而從節點(diǎn)得到了4個(gè)時(shí)間戳t1~t4。
有了以上4個(gè)時(shí)間戳之后,假設主節點(diǎn)到從節點(diǎn)與從節點(diǎn)到主節點(diǎn)傳輸和網(wǎng)絡(luò )延時(shí)不變,可以得到傳輸延時(shí)和時(shí)鐘偏差的計算方法:
如果PTP主從鏈路對稱(chēng),即Dm2s=Ds2m=delay,則:
由以上分析方法可知,PTP主從節點(diǎn)鏈路對稱(chēng)與否會(huì )影響offset的計算,從而會(huì )影響時(shí)間戳的同步精度。
另外,由于主節點(diǎn)和從節點(diǎn)需要用本地晶振維護本地時(shí)鐘。而隨著(zhù)時(shí)間的積累,晶振存在頻率漂移,并且不同晶振的固有頻率也會(huì )有偏差,這兩個(gè)屬性都會(huì )影響時(shí)鐘同步的精度。
為了實(shí)現高精度時(shí)間同步,設計同步系統時(shí)應該同時(shí)考慮到主從節點(diǎn)鏈路的對稱(chēng)性和晶振的特性。
2 電子學(xué)設計
時(shí)鐘同步系統的整體結構設計如圖2所示。

圖2 時(shí)鐘同步系統的硬件結構圖
本方案中主節點(diǎn)和從節點(diǎn)使用同一塊硬件電路,在設計的時(shí)候,硬件電路板上設計了一個(gè)跳線(xiàn)器,可以選擇一塊硬件電路是主節點(diǎn)或者從節點(diǎn)。為了保證主從節點(diǎn)的鏈路對稱(chēng), PCB電路板時(shí)鐘收發(fā)路徑以及PTP報文收發(fā)路徑的長(cháng)度都應該用蛇形線(xiàn)設計來(lái)保證長(cháng)度一致。另外,為了消除晶振的頻率漂移以及頻率偏差帶來(lái)的影響,本方案中從節點(diǎn)不使用本地晶振,而是直接使用主節點(diǎn)傳輸來(lái)時(shí)鐘信號作為時(shí)間戳的時(shí)鐘,也就是說(shuō)主節點(diǎn)和從節點(diǎn)使用了同源時(shí)鐘。
雖然主從節點(diǎn)使用的本地clock是同源的,但是由于clock的傳輸路徑的差異,主從節點(diǎn)的clock是有相位差異的。這個(gè)相位差如果不考慮在設計方案中的話(huà),會(huì )嚴重影響整個(gè)時(shí)鐘系統能夠實(shí)現的同步精度。如圖3所示,如果系統中沒(méi)有考慮主從節點(diǎn)的本地clock的相位差,也就是圖中phase,那時(shí)鐘系統所能達到的同步精度最好也就是相位差的值。假設,主從節點(diǎn)的周期T為100 ns,主從節點(diǎn)的相位差為60 ns,那說(shuō)明同步系統所能達到的最高精度為60 ns。

圖3 主從節點(diǎn)時(shí)鐘相位差測量的重要性示意圖
為了進(jìn)一步提高時(shí)間戳同步的精度,必須設計相位測量模塊,消除主從時(shí)鐘相位差對時(shí)間戳的同步精度帶來(lái)的影響。所以,主節點(diǎn)中包括了相位鑒別芯片以及ADC芯片,用來(lái)精確測量主從節點(diǎn)時(shí)間戳的時(shí)鐘相位差。
有了這個(gè)相位差測量模塊,就真的可以消除主從節點(diǎn)時(shí)間戳的時(shí)鐘相位差帶來(lái)的影響嗎?答案是肯定的。圖4為主從節點(diǎn)時(shí)鐘傳播示意圖,AD8302即為本文中所用的相位鑒別芯片。

圖4 主從節點(diǎn)時(shí)鐘傳播示意圖
我們已經(jīng)知道,為了使從節點(diǎn)與主節點(diǎn)的時(shí)間戳實(shí)現精確同步,最直接的方法就是算出盡量精確的offset值,也就是要得出盡量精確的t1~t4的值。
圖4中,Clk1為主節點(diǎn)晶振時(shí)鐘,Clk2為從節點(diǎn)從主節點(diǎn)接收到的時(shí)鐘,由于有一段長(cháng)的傳播路徑,因而Clk2相對Clk1會(huì )有一個(gè)相位差。為了在主節點(diǎn)測量相位差,Clk3是從節點(diǎn)將Clk2直接發(fā)送到主節點(diǎn)而得到的時(shí)鐘,因而Clk3相對于Clk2又會(huì )有一個(gè)相位差。具體Clk1~Clk3的示意圖如圖5所示。

圖5 主從節點(diǎn)時(shí)鐘關(guān)系圖
對于時(shí)間戳t1而言,t1指的是SYNC包從主節點(diǎn)發(fā)出的時(shí)刻,觸發(fā)時(shí)鐘為Clk1,而時(shí)間戳時(shí)鐘是主節點(diǎn)的系統時(shí)鐘Clk1,因而t1是精確的。對于時(shí)間戳t2而言,t2指的是SYNC包到達從節點(diǎn)的時(shí)刻,觸發(fā)時(shí)鐘為Clk2,而時(shí)間戳時(shí)鐘是從節點(diǎn)的系統時(shí)鐘Clk2,因而t2也是精確的。對于時(shí)間戳t3而言,t3指的是DELAY_REQ包從從節點(diǎn)觸發(fā)出的時(shí)刻,觸發(fā)時(shí)鐘為Clk2,而時(shí)間戳時(shí)鐘為從節點(diǎn)的系統時(shí)鐘Clk2,因而t3也是精確的。對于時(shí)間戳t4而言,t4指的是DELAY_REQ包到達主節點(diǎn)時(shí)的時(shí)刻,觸發(fā)時(shí)鐘為Clk3,而時(shí)間戳時(shí)鐘為主節點(diǎn)的系統時(shí)鐘Clk1,因而t4不是精確的,是有偏差的。由圖5的時(shí)鐘關(guān)系圖可知,精確的t4p應該在t4之前:

可見(jiàn),相位差測量模塊在整個(gè)時(shí)間戳同步方案中取到了舉足輕重的作用。
3 固件程序設計
3.1 主節點(diǎn)固件設計
主節點(diǎn)的固件結構框圖如圖6所示,A/D控制模塊和相位測量模塊是用來(lái)控制幅相鑒別芯片和ADC芯片。發(fā)送緩沖的作用是將主節點(diǎn)時(shí)鐘同步協(xié)議中的通信報文以曼徹斯特編碼方式發(fā)送出去,接收緩沖的作用是從接收路徑中解碼出相應的通信報文。本地時(shí)鐘模塊的作用就是維護一個(gè)本地時(shí)鐘。主節點(diǎn)時(shí)鐘同步協(xié)議的主要作用是控制報文的發(fā)送和接收。

圖6 主節點(diǎn)固件結構框圖
圖7為主節點(diǎn)時(shí)鐘同步協(xié)議模塊的狀態(tài)機轉換圖。

圖7 主節點(diǎn)同步協(xié)議模塊的狀態(tài)機轉換圖
idle狀態(tài)下,當檢測到pps信號的上升沿,則開(kāi)始整個(gè)同步周期。首先,開(kāi)始ADC的讀取操作,當等到AD_ready=’1’,則說(shuō)明ADC的數據已經(jīng)準備好,然后進(jìn)行讀取保存即可。然后,進(jìn)入到sync狀態(tài),這個(gè)狀態(tài)下,主節點(diǎn)會(huì )向從節點(diǎn)發(fā)送SYNC同步包,之后模塊進(jìn)入sync_wait狀態(tài)。等一段固定的時(shí)間之后,模塊進(jìn)入follow狀態(tài),在這個(gè)狀態(tài)下,主節點(diǎn)會(huì )向從節點(diǎn)發(fā)送FOLLOW_UP同步包。之后模塊進(jìn)入after_follow_wait,等待一段固定的時(shí)間之后,模塊進(jìn)入delay_req_pre,這個(gè)狀態(tài)下,主節點(diǎn)會(huì )通知從節點(diǎn)可以發(fā)DELAY_REQ包了。之后,模塊等待DELAY_REQ包,如果很長(cháng)時(shí)間都沒(méi)有等到DELAY_REQ包,即等待超時(shí),則模塊返回idle狀態(tài);如果接收到了DELAY_REQ包,主節點(diǎn)就向從節點(diǎn)發(fā)送DELAY_RESP。最后,等一段時(shí)間后,模塊返回到idle狀態(tài)。
3.2 從節點(diǎn)固件設計
從節點(diǎn)固件的結構框圖如圖8所示,相位部分計算模塊用來(lái)計算出前文說(shuō)到的phase值,offset計算模塊的作用是用t1~t4和phase值計算出精確的offset值。從節點(diǎn)時(shí)鐘同步協(xié)議的主要作用是控制報文的發(fā)送和接收和更新本地時(shí)鐘。

圖8 從節點(diǎn)固件結構框圖
圖9為從節點(diǎn)時(shí)鐘同步協(xié)議模塊的狀態(tài)機轉換圖。

圖9 從節點(diǎn)時(shí)鐘同步協(xié)議模塊的狀態(tài)機轉換圖
當處在idle狀態(tài)時(shí),從節點(diǎn)監測接收到的數據流,直到監測到sync包后立即進(jìn)入wait_follow狀態(tài)。在wait_follow狀態(tài),從節點(diǎn)同樣監測接收的數據流,直到監測到follow_up包后,立即進(jìn)入wait_pre狀態(tài),如果在這個(gè)狀態(tài)很久都沒(méi)有接收到follow_up包,將等待超時(shí)返回到idle狀態(tài)。同樣,wait_pre狀態(tài)下,直到監測到delay_req_pre包后,跳入delay_req狀態(tài);如果等待超時(shí),則返回idle狀態(tài)。delay_req狀態(tài)下,從節點(diǎn)向主節點(diǎn)發(fā)送delay_req包后立即進(jìn)入wait_delay_resp狀態(tài)。在wait_delay_resp狀態(tài)下,監測到delay_resp包后,從節點(diǎn)立即進(jìn)入phase_cacul狀態(tài);如果長(cháng)時(shí)間沒(méi)有監測到delay_resp包,則返回idle狀態(tài)。在phase_cacul狀態(tài)下,開(kāi)始相位差計算模塊后,立即進(jìn)入wait_phase_result狀態(tài)。在wait_phase_result狀態(tài)下,等到相位測量結果準備好后,進(jìn)入delay_cacul狀態(tài);如果長(cháng)時(shí)間,相位結果都沒(méi)有準備好,或者相位結果錯誤,則返回idle狀態(tài)。在delay_cacul狀態(tài)下,開(kāi)啟offset計算模塊后,進(jìn)入wait_result狀態(tài)。在wait_result狀態(tài)下,當檢測到偏移測量結果準備好信號后,進(jìn)入offset_update狀態(tài);否則返回到idle狀態(tài)。在offset_update狀態(tài)下,從節點(diǎn)時(shí)鐘同步協(xié)議向本地時(shí)鐘模塊發(fā)送偏移校正信號,從而更新從節點(diǎn)的本地時(shí)鐘,然后進(jìn)入idle狀態(tài)。
4 測試結果
實(shí)際測試環(huán)境包括一個(gè)主節點(diǎn)和一個(gè)從節點(diǎn),之間用光纖連接。示波器用來(lái)觀(guān)察主節點(diǎn)和從節點(diǎn)輸出的pps信號。由于主從節點(diǎn)的時(shí)鐘相位不一致,示波器觀(guān)察到的就是這個(gè)相位差。pps上升沿到來(lái)時(shí),主從節點(diǎn)時(shí)間戳通過(guò)串口模塊輸出給PC機。通過(guò)對比示波器測得的主從相位差以及pps上升沿主從時(shí)間戳的差值,就可以得出真實(shí)的時(shí)間戳同步精度。
本次測試使用了三種不同長(cháng)度(3 m、6 m、5.15 m)的光纖,然后通過(guò)觀(guān)察在不同長(cháng)度光纖下的實(shí)驗結果,從而可以判斷時(shí)鐘同步系統所能達到的精度。主從節點(diǎn)相位差直方圖以及相應的時(shí)間戳的差值直方圖略——編者注。
由這三種不同長(cháng)度光纖所得出的結果來(lái)看,本文實(shí)現的同步時(shí)鐘系統的時(shí)間戳同步精度可達1 ns。
結語(yǔ)
本方案實(shí)現的時(shí)鐘同步系統,以IEEE 1588協(xié)議中基于時(shí)間戳的報文通信為基本原理,在純硬件電路(FPGA)中實(shí)現。通過(guò)在主節點(diǎn)添加了相位差測試模塊,消除了主從節點(diǎn)相位不同的影響,最后實(shí)現的時(shí)間戳同步精度高達1ns。
本文設計出來(lái)的時(shí)鐘同步系統所需成本低,同步精度非常高,非常適合應用在需要高精度時(shí)間戳的場(chǎng)合。
評論