基于FPGA的高精度同步時(shí)鐘系統(tǒng)設(shè)計(jì)
摘要: 介紹了精密時(shí)鐘同步協(xié)議(PTP)的原理。本文精簡(jiǎn)了該協(xié)議,設(shè)計(jì)并實(shí)現(xiàn)了一種低成本、高精度的時(shí)鐘同步系統(tǒng)方案。該方案中,本地時(shí)鐘單元、時(shí)鐘協(xié)議模塊、發(fā)送緩沖、接收緩沖以及系統(tǒng)打時(shí)標(biāo)等功能都在FPGA中實(shí)現(xiàn)。經(jīng)過測(cè)試,該方案能夠?qū)崿F(xiàn)ns級(jí)同步精度。該方案成本低,并且易于擴(kuò)展,非常適合局域網(wǎng)絡(luò)時(shí)鐘同步的應(yīng)用領(lǐng)域。
本文引用地址:http://butianyuan.cn/article/201808/388116.htm在很多大型物理實(shí)驗(yàn)和工業(yè)應(yīng)用中,時(shí)鐘同步技術(shù)都扮演著舉足輕重的作用。比如在中國四川錦屏暗物質(zhì)探測(cè)實(shí)驗(yàn)中,需要為多個(gè)獨(dú)立探測(cè)裝置提供相應(yīng)的時(shí)間信息,這些探測(cè)器包括中心探測(cè)器(HpGe)、液氬反符合探測(cè)器、實(shí)驗(yàn)室外部宇宙線反符合探測(cè)器[1]。又比如在大亞灣中微子實(shí)驗(yàn)中,需要為三個(gè)實(shí)驗(yàn)廳的子探測(cè)器提供同步時(shí)鐘和時(shí)間戳,也需要為未來的長(zhǎng)基線中微子振蕩實(shí)驗(yàn)提供同步時(shí)鐘和時(shí)間戳[2]。
為此,本文基于可編程邏輯器件FPGA,設(shè)計(jì)了一套高精度、低成本、易于擴(kuò)展的時(shí)間戳同步系統(tǒng)。
1 PTP協(xié)議簡(jiǎn)介
PTP精密時(shí)鐘定時(shí)協(xié)議又稱為IEEE 1588協(xié)議。它的基本功能是利用基于時(shí)間戳的報(bào)文通信的方法,使得分布式網(wǎng)絡(luò)中的所有的時(shí)鐘都與特定的某個(gè)時(shí)鐘保持精確同步。IEEE 1588協(xié)議可以用軟件實(shí)現(xiàn),也可以用專門的硬件實(shí)現(xiàn)。很顯然,用硬件實(shí)現(xiàn)能達(dá)到更高的精度。本文中的同步系統(tǒng)就是基于純硬件實(shí)現(xiàn)的。
IEEE 1588協(xié)議中定義了5種類型的傳輸報(bào)文[3]:同步報(bào)文(sync)、跟隨報(bào)文(follow_up)、延時(shí)請(qǐng)求報(bào)文(delay_req)、延時(shí)響應(yīng)報(bào)文(delay_resp)和管理報(bào)文(management)。其中前4種報(bào)文主要用于時(shí)間戳交換,具體的時(shí)間戳交換的過程示意圖如圖1所示。
圖1 PTP協(xié)議同步過程示意圖
如圖1所示,時(shí)間戳同步過程包括主節(jié)點(diǎn)和從節(jié)點(diǎn),主節(jié)點(diǎn)和從節(jié)點(diǎn)都利用晶振維持本地時(shí)鐘。同步的目的是使從節(jié)點(diǎn)的本地時(shí)鐘的時(shí)間戳與主節(jié)點(diǎn)本地時(shí)鐘的時(shí)間戳達(dá)到相對(duì)同步。未同步時(shí),從節(jié)點(diǎn)相對(duì)主節(jié)點(diǎn)有一個(gè)時(shí)間偏差offset。同步的過程能夠計(jì)算出這個(gè)偏差。
主時(shí)鐘周期性地向從時(shí)鐘發(fā)送同步報(bào)文SYNC,這個(gè)報(bào)文中沒有任何有效數(shù)據(jù),但是當(dāng)SYNC發(fā)出時(shí),主節(jié)點(diǎn)能夠記錄下來時(shí)間戳t1,當(dāng)從節(jié)點(diǎn)接收到SYNC,從節(jié)點(diǎn)能夠記錄下來時(shí)間戳t2。為了讓從節(jié)點(diǎn)也知道t1,稍后主節(jié)點(diǎn)向從節(jié)點(diǎn)發(fā)送跟隨報(bào)文FOLLOW_UP,這個(gè)報(bào)文中包含了t1這個(gè)有效數(shù)據(jù)。
然后,為了計(jì)算主節(jié)點(diǎn)到從節(jié)點(diǎn)的延時(shí),在從節(jié)點(diǎn)接收到FOLLOW_UP后一段時(shí)間,從節(jié)點(diǎn)向主節(jié)點(diǎn)發(fā)送一個(gè)DELAY_REQ報(bào)文。和SYNC類似,當(dāng)DELAY_REQ離開時(shí)得到時(shí)間戳t3,當(dāng)DELAY_REQ到達(dá)主節(jié)點(diǎn)時(shí),主節(jié)點(diǎn)得到時(shí)間戳t4。一段時(shí)間后,主節(jié)點(diǎn)再向從節(jié)點(diǎn)發(fā)送DELAY_RESP報(bào)文,這個(gè)報(bào)文中包含了t4,從而從節(jié)點(diǎn)得到了4個(gè)時(shí)間戳t1~t4。
有了以上4個(gè)時(shí)間戳之后,假設(shè)主節(jié)點(diǎn)到從節(jié)點(diǎn)與從節(jié)點(diǎn)到主節(jié)點(diǎn)傳輸和網(wǎng)絡(luò)延時(shí)不變,可以得到傳輸延時(shí)和時(shí)鐘偏差的計(jì)算方法:
如果PTP主從鏈路對(duì)稱,即Dm2s=Ds2m=delay,則:
由以上分析方法可知,PTP主從節(jié)點(diǎn)鏈路對(duì)稱與否會(huì)影響offset的計(jì)算,從而會(huì)影響時(shí)間戳的同步精度。
另外,由于主節(jié)點(diǎn)和從節(jié)點(diǎn)需要用本地晶振維護(hù)本地時(shí)鐘。而隨著時(shí)間的積累,晶振存在頻率漂移,并且不同晶振的固有頻率也會(huì)有偏差,這兩個(gè)屬性都會(huì)影響時(shí)鐘同步的精度。
為了實(shí)現(xiàn)高精度時(shí)間同步,設(shè)計(jì)同步系統(tǒng)時(shí)應(yīng)該同時(shí)考慮到主從節(jié)點(diǎn)鏈路的對(duì)稱性和晶振的特性。
2 電子學(xué)設(shè)計(jì)
時(shí)鐘同步系統(tǒng)的整體結(jié)構(gòu)設(shè)計(jì)如圖2所示。
圖2 時(shí)鐘同步系統(tǒng)的硬件結(jié)構(gòu)圖
本方案中主節(jié)點(diǎn)和從節(jié)點(diǎn)使用同一塊硬件電路,在設(shè)計(jì)的時(shí)候,硬件電路板上設(shè)計(jì)了一個(gè)跳線器,可以選擇一塊硬件電路是主節(jié)點(diǎn)或者從節(jié)點(diǎn)。為了保證主從節(jié)點(diǎn)的鏈路對(duì)稱, PCB電路板時(shí)鐘收發(fā)路徑以及PTP報(bào)文收發(fā)路徑的長(zhǎng)度都應(yīng)該用蛇形線設(shè)計(jì)來保證長(zhǎng)度一致。另外,為了消除晶振的頻率漂移以及頻率偏差帶來的影響,本方案中從節(jié)點(diǎn)不使用本地晶振,而是直接使用主節(jié)點(diǎn)傳輸來時(shí)鐘信號(hào)作為時(shí)間戳的時(shí)鐘,也就是說主節(jié)點(diǎn)和從節(jié)點(diǎn)使用了同源時(shí)鐘。
雖然主從節(jié)點(diǎn)使用的本地clock是同源的,但是由于clock的傳輸路徑的差異,主從節(jié)點(diǎn)的clock是有相位差異的。這個(gè)相位差如果不考慮在設(shè)計(jì)方案中的話,會(huì)嚴(yán)重影響整個(gè)時(shí)鐘系統(tǒng)能夠?qū)崿F(xiàn)的同步精度。如圖3所示,如果系統(tǒng)中沒有考慮主從節(jié)點(diǎn)的本地clock的相位差,也就是圖中phase,那時(shí)鐘系統(tǒng)所能達(dá)到的同步精度最好也就是相位差的值。假設(shè),主從節(jié)點(diǎn)的周期T為100 ns,主從節(jié)點(diǎn)的相位差為60 ns,那說明同步系統(tǒng)所能達(dá)到的最高精度為60 ns。
圖3 主從節(jié)點(diǎn)時(shí)鐘相位差測(cè)量的重要性示意圖
為了進(jìn)一步提高時(shí)間戳同步的精度,必須設(shè)計(jì)相位測(cè)量模塊,消除主從時(shí)鐘相位差對(duì)時(shí)間戳的同步精度帶來的影響。所以,主節(jié)點(diǎn)中包括了相位鑒別芯片以及ADC芯片,用來精確測(cè)量主從節(jié)點(diǎn)時(shí)間戳的時(shí)鐘相位差。
有了這個(gè)相位差測(cè)量模塊,就真的可以消除主從節(jié)點(diǎn)時(shí)間戳的時(shí)鐘相位差帶來的影響嗎?答案是肯定的。圖4為主從節(jié)點(diǎn)時(shí)鐘傳播示意圖,AD8302即為本文中所用的相位鑒別芯片。
圖4 主從節(jié)點(diǎn)時(shí)鐘傳播示意圖
我們已經(jīng)知道,為了使從節(jié)點(diǎn)與主節(jié)點(diǎn)的時(shí)間戳實(shí)現(xiàn)精確同步,最直接的方法就是算出盡量精確的offset值,也就是要得出盡量精確的t1~t4的值。
圖4中,Clk1為主節(jié)點(diǎn)晶振時(shí)鐘,Clk2為從節(jié)點(diǎn)從主節(jié)點(diǎn)接收到的時(shí)鐘,由于有一段長(zhǎng)的傳播路徑,因而Clk2相對(duì)Clk1會(huì)有一個(gè)相位差。為了在主節(jié)點(diǎn)測(cè)量相位差,Clk3是從節(jié)點(diǎn)將Clk2直接發(fā)送到主節(jié)點(diǎn)而得到的時(shí)鐘,因而Clk3相對(duì)于Clk2又會(huì)有一個(gè)相位差。具體Clk1~Clk3的示意圖如圖5所示。
圖5 主從節(jié)點(diǎn)時(shí)鐘關(guān)系圖
對(duì)于時(shí)間戳t1而言,t1指的是SYNC包從主節(jié)點(diǎn)發(fā)出的時(shí)刻,觸發(fā)時(shí)鐘為Clk1,而時(shí)間戳?xí)r鐘是主節(jié)點(diǎn)的系統(tǒng)時(shí)鐘Clk1,因而t1是精確的。對(duì)于時(shí)間戳t2而言,t2指的是SYNC包到達(dá)從節(jié)點(diǎn)的時(shí)刻,觸發(fā)時(shí)鐘為Clk2,而時(shí)間戳?xí)r鐘是從節(jié)點(diǎn)的系統(tǒng)時(shí)鐘Clk2,因而t2也是精確的。對(duì)于時(shí)間戳t3而言,t3指的是DELAY_REQ包從從節(jié)點(diǎn)觸發(fā)出的時(shí)刻,觸發(fā)時(shí)鐘為Clk2,而時(shí)間戳?xí)r鐘為從節(jié)點(diǎn)的系統(tǒng)時(shí)鐘Clk2,因而t3也是精確的。對(duì)于時(shí)間戳t4而言,t4指的是DELAY_REQ包到達(dá)主節(jié)點(diǎn)時(shí)的時(shí)刻,觸發(fā)時(shí)鐘為Clk3,而時(shí)間戳?xí)r鐘為主節(jié)點(diǎn)的系統(tǒng)時(shí)鐘Clk1,因而t4不是精確的,是有偏差的。由圖5的時(shí)鐘關(guān)系圖可知,精確的t4p應(yīng)該在t4之前:
可見,相位差測(cè)量模塊在整個(gè)時(shí)間戳同步方案中取到了舉足輕重的作用。
3 固件程序設(shè)計(jì)
3.1 主節(jié)點(diǎn)固件設(shè)計(jì)
主節(jié)點(diǎn)的固件結(jié)構(gòu)框圖如圖6所示,A/D控制模塊和相位測(cè)量模塊是用來控制幅相鑒別芯片和ADC芯片。發(fā)送緩沖的作用是將主節(jié)點(diǎn)時(shí)鐘同步協(xié)議中的通信報(bào)文以曼徹斯特編碼方式發(fā)送出去,接收緩沖的作用是從接收路徑中解碼出相應(yīng)的通信報(bào)文。本地時(shí)鐘模塊的作用就是維護(hù)一個(gè)本地時(shí)鐘。主節(jié)點(diǎn)時(shí)鐘同步協(xié)議的主要作用是控制報(bào)文的發(fā)送和接收。
圖6 主節(jié)點(diǎn)固件結(jié)構(gòu)框圖
圖7為主節(jié)點(diǎn)時(shí)鐘同步協(xié)議模塊的狀態(tài)機(jī)轉(zhuǎn)換圖。
圖7 主節(jié)點(diǎn)同步協(xié)議模塊的狀態(tài)機(jī)轉(zhuǎn)換圖
idle狀態(tài)下,當(dāng)檢測(cè)到pps信號(hào)的上升沿,則開始整個(gè)同步周期。首先,開始ADC的讀取操作,當(dāng)?shù)鹊紸D_ready=’1’,則說明ADC的數(shù)據(jù)已經(jīng)準(zhǔn)備好,然后進(jìn)行讀取保存即可。然后,進(jìn)入到sync狀態(tài),這個(gè)狀態(tài)下,主節(jié)點(diǎn)會(huì)向從節(jié)點(diǎn)發(fā)送SYNC同步包,之后模塊進(jìn)入sync_wait狀態(tài)。等一段固定的時(shí)間之后,模塊進(jìn)入follow狀態(tài),在這個(gè)狀態(tài)下,主節(jié)點(diǎn)會(huì)向從節(jié)點(diǎn)發(fā)送FOLLOW_UP同步包。之后模塊進(jìn)入after_follow_wait,等待一段固定的時(shí)間之后,模塊進(jìn)入delay_req_pre,這個(gè)狀態(tài)下,主節(jié)點(diǎn)會(huì)通知從節(jié)點(diǎn)可以發(fā)DELAY_REQ包了。之后,模塊等待DELAY_REQ包,如果很長(zhǎng)時(shí)間都沒有等到DELAY_REQ包,即等待超時(shí),則模塊返回idle狀態(tài);如果接收到了DELAY_REQ包,主節(jié)點(diǎn)就向從節(jié)點(diǎn)發(fā)送DELAY_RESP。最后,等一段時(shí)間后,模塊返回到idle狀態(tài)。
3.2 從節(jié)點(diǎn)固件設(shè)計(jì)
從節(jié)點(diǎn)固件的結(jié)構(gòu)框圖如圖8所示,相位部分計(jì)算模塊用來計(jì)算出前文說到的phase值,offset計(jì)算模塊的作用是用t1~t4和phase值計(jì)算出精確的offset值。從節(jié)點(diǎn)時(shí)鐘同步協(xié)議的主要作用是控制報(bào)文的發(fā)送和接收和更新本地時(shí)鐘。
圖8 從節(jié)點(diǎn)固件結(jié)構(gòu)框圖
圖9為從節(jié)點(diǎn)時(shí)鐘同步協(xié)議模塊的狀態(tài)機(jī)轉(zhuǎn)換圖。
圖9 從節(jié)點(diǎn)時(shí)鐘同步協(xié)議模塊的狀態(tài)機(jī)轉(zhuǎn)換圖
當(dāng)處在idle狀態(tài)時(shí),從節(jié)點(diǎn)監(jiān)測(cè)接收到的數(shù)據(jù)流,直到監(jiān)測(cè)到sync包后立即進(jìn)入wait_follow狀態(tài)。在wait_follow狀態(tài),從節(jié)點(diǎn)同樣監(jiān)測(cè)接收的數(shù)據(jù)流,直到監(jiān)測(cè)到follow_up包后,立即進(jìn)入wait_pre狀態(tài),如果在這個(gè)狀態(tài)很久都沒有接收到follow_up包,將等待超時(shí)返回到idle狀態(tài)。同樣,wait_pre狀態(tài)下,直到監(jiān)測(cè)到delay_req_pre包后,跳入delay_req狀態(tài);如果等待超時(shí),則返回idle狀態(tài)。delay_req狀態(tài)下,從節(jié)點(diǎn)向主節(jié)點(diǎn)發(fā)送delay_req包后立即進(jìn)入wait_delay_resp狀態(tài)。在wait_delay_resp狀態(tài)下,監(jiān)測(cè)到delay_resp包后,從節(jié)點(diǎn)立即進(jìn)入phase_cacul狀態(tài);如果長(zhǎng)時(shí)間沒有監(jiān)測(cè)到delay_resp包,則返回idle狀態(tài)。在phase_cacul狀態(tài)下,開始相位差計(jì)算模塊后,立即進(jìn)入wait_phase_result狀態(tài)。在wait_phase_result狀態(tài)下,等到相位測(cè)量結(jié)果準(zhǔn)備好后,進(jìn)入delay_cacul狀態(tài);如果長(zhǎng)時(shí)間,相位結(jié)果都沒有準(zhǔn)備好,或者相位結(jié)果錯(cuò)誤,則返回idle狀態(tài)。在delay_cacul狀態(tài)下,開啟offset計(jì)算模塊后,進(jìn)入wait_result狀態(tài)。在wait_result狀態(tài)下,當(dāng)檢測(cè)到偏移測(cè)量結(jié)果準(zhǔn)備好信號(hào)后,進(jìn)入offset_update狀態(tài);否則返回到idle狀態(tài)。在offset_update狀態(tài)下,從節(jié)點(diǎn)時(shí)鐘同步協(xié)議向本地時(shí)鐘模塊發(fā)送偏移校正信號(hào),從而更新從節(jié)點(diǎn)的本地時(shí)鐘,然后進(jìn)入idle狀態(tài)。
4 測(cè)試結(jié)果
實(shí)際測(cè)試環(huán)境包括一個(gè)主節(jié)點(diǎn)和一個(gè)從節(jié)點(diǎn),之間用光纖連接。示波器用來觀察主節(jié)點(diǎn)和從節(jié)點(diǎn)輸出的pps信號(hào)。由于主從節(jié)點(diǎn)的時(shí)鐘相位不一致,示波器觀察到的就是這個(gè)相位差。pps上升沿到來時(shí),主從節(jié)點(diǎn)時(shí)間戳通過串口模塊輸出給PC機(jī)。通過對(duì)比示波器測(cè)得的主從相位差以及pps上升沿主從時(shí)間戳的差值,就可以得出真實(shí)的時(shí)間戳同步精度。
本次測(cè)試使用了三種不同長(zhǎng)度(3 m、6 m、5.15 m)的光纖,然后通過觀察在不同長(zhǎng)度光纖下的實(shí)驗(yàn)結(jié)果,從而可以判斷時(shí)鐘同步系統(tǒng)所能達(dá)到的精度。主從節(jié)點(diǎn)相位差直方圖以及相應(yīng)的時(shí)間戳的差值直方圖略——編者注。
由這三種不同長(zhǎng)度光纖所得出的結(jié)果來看,本文實(shí)現(xiàn)的同步時(shí)鐘系統(tǒng)的時(shí)間戳同步精度可達(dá)1 ns。
結(jié)語
本方案實(shí)現(xiàn)的時(shí)鐘同步系統(tǒng),以IEEE 1588協(xié)議中基于時(shí)間戳的報(bào)文通信為基本原理,在純硬件電路(FPGA)中實(shí)現(xiàn)。通過在主節(jié)點(diǎn)添加了相位差測(cè)試模塊,消除了主從節(jié)點(diǎn)相位不同的影響,最后實(shí)現(xiàn)的時(shí)間戳同步精度高達(dá)1ns。
本文設(shè)計(jì)出來的時(shí)鐘同步系統(tǒng)所需成本低,同步精度非常高,非常適合應(yīng)用在需要高精度時(shí)間戳的場(chǎng)合。
評(píng)論