1.0 引言
許多工業(yè)、測(cè)試和測(cè)量、通信應(yīng)用都要求高精度的時(shí)鐘信號(hào)以便同步控制信號(hào)和捕捉數(shù)據(jù)等。在標(biāo)準(zhǔn)以太網(wǎng)中應(yīng)用的IEEE 1588精密時(shí)間協(xié)議(PTP)為傳播主時(shí)鐘時(shí)序給系統(tǒng)中的許多結(jié)點(diǎn)提供了一種方法。當(dāng)前的實(shí)現(xiàn)方法單純依靠軟件,或軟件和FPGA或ASIC的混合。盡管用這些實(shí)現(xiàn)方法的結(jié)點(diǎn)能基于主時(shí)鐘來(lái)產(chǎn)生時(shí)鐘輸出信號(hào),但這樣的信號(hào)精度不足以滿足系統(tǒng)對(duì)極低的時(shí)鐘抖動(dòng)的要求。此外,系統(tǒng)上的時(shí)鐘相位對(duì)準(zhǔn)也有嚴(yán)格要求。DP83640精密PHYTER®提供了這兩個(gè)問題的解決方案。本應(yīng)用注釋適用于產(chǎn)品DP83640。
2.0 背景
DP83640包括一個(gè)高度可配置的時(shí)鐘輸出信號(hào),其與內(nèi)置的IEEE 1588時(shí)鐘諧振。注意到諧振意味著頻率相同而相位則不必相同。這個(gè)時(shí)鐘的標(biāo)稱頻率是250 MHz的整除結(jié)果,例如250 MHz/N,其中N為從2到255的整數(shù)。因此標(biāo)稱頻率取980.4 kHz到125 MHz之間的離散值。
DP83640采用軟件輔助的速率糾正來(lái)限制本地時(shí)鐘和主參考時(shí)鐘之間的頻率失調(diào)。最終輸出頻率結(jié)合的速率糾正參數(shù)(例如ppm失調(diào))與內(nèi)置IEEE 1588時(shí)鐘時(shí)序上的相同。因?yàn)樗俾始m正的單位是亞毫微秒(1亞毫微秒=2-32納秒),對(duì)時(shí)鐘輸出頻率進(jìn)行精細(xì)調(diào)諧(達(dá)十億分之一的數(shù)量級(jí))。
除了固定速率糾正以外,對(duì)速率糾正編程使其工作在某特定值,持續(xù)時(shí)間短達(dá)1/2秒(一個(gè)“臨時(shí)速率”)。在臨時(shí)速率持續(xù)時(shí)間結(jié)束后,速率糾正返回至固定速率糾正值。通過(guò)在短時(shí)時(shí)間隔內(nèi)糾正額外的頻率失調(diào),時(shí)鐘輸出信號(hào)不會(huì)在頻率或者相位上表現(xiàn)出離散階躍。DP83640也提供了一種使時(shí)鐘輸出信號(hào)相位對(duì)準(zhǔn)主時(shí)鐘相位的方法。與采用8 ns離散精度產(chǎn)生的器件觸發(fā)輸出不同,時(shí)鐘輸出由可調(diào)諧的模擬源,即頻率控制振蕩器(FCO)或相位產(chǎn)生模塊(PGM)來(lái)產(chǎn)生。默認(rèn)情況為,在上電時(shí)激活時(shí)鐘輸出,工作頻率為25MHz,但是1588邏輯,包括1588時(shí)鐘,必須在工作前作初始化。因此時(shí)鐘輸出和1588主時(shí)鐘之間的初始相位關(guān)系是未知的。然而,明智地使用DP83640的特性可使時(shí)鐘輸出相位對(duì)準(zhǔn)1588時(shí)鐘的相位。
兩種1588時(shí)鐘源各有優(yōu)點(diǎn)。FCO方法提供了更好的抖動(dòng)性能,但糾正范圍較小,而且為了在鏈接丟失事件發(fā)生時(shí)保留時(shí)鐘相位,在使用上有所限制。PGM方法沒有上述限制并能提供較大的糾正范圍,但其長(zhǎng)時(shí)間抖動(dòng)性能不如FCO方法那么好。
3.0 理論
3.1 速率糾正
IEEE 1588時(shí)鐘輸出速率糾正功能利用了與內(nèi)置1588時(shí)鐘相同的邏輯。DP83640包括26位速率糾正參數(shù),以每個(gè)參考時(shí)鐘周期內(nèi)的亞毫微秒數(shù)為單位。在軟件控制下,當(dāng)本地參考時(shí)鐘比主時(shí)鐘運(yùn)行較慢時(shí),速率糾正為正值,當(dāng)本地參考時(shí)鐘比主時(shí)鐘運(yùn)行更快時(shí),速率糾正表現(xiàn)為負(fù)值。以每8納秒時(shí)鐘周期1亞毫微秒的速率糾正間隔,時(shí)鐘輸出是可調(diào)的,增量為2-32亞毫微秒 / 8納秒 = 十億分之0.029(ppb)。
采用P T P 速率控制寄存器( P T P _ R AT E H 和PTP_RATEL)和PTP臨時(shí)速率控制寄存器(PTP_TRDH和PTP_TRDL)來(lái)控制PTP速率。
固定速率糾正可以如下方式編程:
1. 將速率方向(0x8000表示更高,0x0000表示更低)和該值的上10位寫入PTP_RATEH寄存器中。
2. 將該值的低16位寫入PTP_RATEL寄存器。在速率寫到PTP_RATEL時(shí)即生效。
舉例:設(shè)定固定速率糾正至相對(duì)于主時(shí)鐘的-100 ppm1. 因?yàn)闃?biāo)稱參考時(shí)鐘周期為8 ns,100 ppm為0.0008 ns,即0.0008 * 232 亞毫微秒,大約等于3435974亞毫微秒(0x346DC6)。
2. 將0x8034寫入PTP_RATEH。
3. 將0x6DC6寫入PTP_RATEL。
除了也必須設(shè)定PTP_RATEH的第14位(0x4000)以
外,一個(gè)臨時(shí)的速率糾正以編程固定速率糾正類似的方法得以編成。因?yàn)榕R時(shí)速率在寫入PTP_RATEL寄存器時(shí)立即生效,所以在設(shè)定臨時(shí)速率前必須對(duì)PTP臨時(shí)速率延時(shí)寄存器進(jìn)行編程。在臨時(shí)速率持續(xù)時(shí)間結(jié)束后,將速率糾正數(shù)值切換回到固定速率糾正數(shù)值。臨時(shí)速率延時(shí)必須按以下方式配置:
1. 臨時(shí)速率持續(xù)時(shí)間為一個(gè)26位的數(shù),單位是時(shí)鐘周期。在默認(rèn)的8 ns參考時(shí)鐘周期時(shí),最大持續(xù)時(shí)間約為537 ms。
2. 將臨時(shí)速率持續(xù)時(shí)間的上10位寫入PTP_TRDH。
3. 將臨時(shí)速率持續(xù)時(shí)間的低16位寫入PTP_TRDL。在寫該寄存器時(shí)臨時(shí)速率持續(xù)時(shí)間立即生效,并且會(huì)保持恒定,直到通過(guò)寫寄存器操作進(jìn)行修改。通常不需要改變臨時(shí)速率的持續(xù)時(shí)間。
舉例:在10 ms內(nèi)設(shè)定臨時(shí)速率糾正持續(xù)時(shí)間為+3 ns:
1. 若要在默認(rèn)參考時(shí)鐘周期下實(shí)現(xiàn)1 ms的臨時(shí)速率持續(xù)時(shí)間,我們需要10 ms / 8 ns = 1250000個(gè)時(shí)鐘周期(0x1312D0)。若要在1250000個(gè)時(shí)鐘周期實(shí)現(xiàn)+3ns的糾正,需要3 ns / 1250000 = 0.0000024 ns =10308亞毫微秒/時(shí)鐘周期(0x2844)。
2. 將0x0013寫入PTP_TRDH。
3. 將0x12D0寫入PTP_TRDL。
4. 將0xC000寫入PTP_RATEH。
5. 將0x2844寫入PTP_RATEL。
3.1.1 最大速率糾正
由于通常不需要較大的速率糾正(如大于100 ppm),為1588時(shí)鐘輸出而對(duì)源信號(hào)的選擇決定了最大速率糾正。
當(dāng)使用FCO時(shí),最大有效速率糾正為0x1555555,即+/- 651ppm。當(dāng)使用PGM時(shí),最大有效速率糾正為0x3FFFFFF,也即 +/- 1953 ppm。
3.2 相位對(duì)準(zhǔn)
時(shí)鐘輸出相位的對(duì)準(zhǔn)要求執(zhí)行下列步驟:
1. 確保已使能時(shí)鐘輸出引腳。
2. 在使能PTP同步協(xié)議之前,使能時(shí)鐘輸出和PTP時(shí)鐘。
3. 使能單個(gè)事件的事件監(jiān)控器以捕捉時(shí)鐘輸出引腳的上升沿。
4. 通過(guò)對(duì)準(zhǔn)的期望時(shí)間確定時(shí)鐘輸出失調(diào):時(shí)鐘輸出周期,即事件時(shí)間標(biāo)記模時(shí)鐘輸出周期。
5. 執(zhí)行一個(gè)步長(zhǎng)調(diào)整以對(duì)準(zhǔn)時(shí)鐘輸出。
6. 在同步期間,所有的步長(zhǎng)調(diào)節(jié)都應(yīng)以時(shí)鐘輸出周期為單位。
舉例:一個(gè)10 MHz時(shí)鐘輸出的相位對(duì)準(zhǔn):
1. 確保時(shí)鐘輸出引腳是使能的。在上電之前將GPIO1引腳拉到高電平,或清除PHYCR2寄存器(頁(yè)面0,寄存器0x1C)的CLK_OUT_DISABLE位(第2位)來(lái)實(shí)現(xiàn)該操作。
2. 在10 MHz處使能時(shí)鐘輸出: 將0 x 8 0 1 9 寫入PTP_COC寄存器中。注意到0x19的十進(jìn)制為25,用25去除250MHz時(shí)鐘。使能PTP時(shí)鐘:將0x0004寫入PTP_CTL寄存器。
3. 取CLK_OUT相位錯(cuò)誤的100個(gè)樣值
— 使能事件監(jiān)控并得到事件的時(shí)間標(biāo)記:
— 將0x1CE1寫入PTP_EVNT寄存器。
— 將0x5CE1寫入PTP_EVNT寄存器中。
第一個(gè)寫操作為CLK_OUT/GPIO12(時(shí)鐘輸出引腳)與事件7(盡管可使用任何事件)設(shè)置一個(gè)單獨(dú)的事件捕捉。第二個(gè)寫操作執(zhí)行相同的操作,并使能了捕捉。
— 讀取PTP_ESTS寄存器檢查0位是否被設(shè)置。如果沒有,請(qǐng)等待并重復(fù)這一步。
— 一旦TP_ESTS的0位被設(shè)定,通過(guò)對(duì)PTP_ESTS值的7:6位加1,從而確定事件時(shí)間標(biāo)記長(zhǎng)度(1到4個(gè)16位字)。
— 確保事件數(shù)目為7,既PTP_ESTS的4:2位的值等于7。
— 確保事件為上升沿。通過(guò)PTP_ESTS第5位的數(shù)值等于1來(lái)指示。
— 讀取PTP_EDATA寄存器。事件時(shí)間標(biāo)記返回如下:
i. 事件納秒位15:0
ii. 事件納秒位29:16
iii. 事件秒位15:0
iv. 事件秒位31:16
— 從時(shí)間標(biāo)記中減去三倍的參考時(shí)鐘周期和11 ns;對(duì)于通常為8 ns的參考時(shí)鐘周期,這個(gè)值為35 ns。由此對(duì)引腳輸入延時(shí)和邊沿檢測(cè)進(jìn)行了糾正。
— 計(jì)算相位誤差為(100–(事件時(shí)間標(biāo)記模100))。
若結(jié)果與時(shí)鐘周期相等(在此為100 ns),則相位誤差為0。若相位誤差在時(shí)鐘周期的10 ns之內(nèi)(在此為91-99 ns),則設(shè)置”高值”標(biāo)志。這等同與負(fù)相位誤差在-9到-1 ns內(nèi)的情況。
4. 平均相位誤差。如果有小的正和負(fù)相位誤差的樣值,比如已設(shè)了高值(HighValue),并且相位誤差的樣值小于10 ns,則必須將時(shí)鐘周期加到樣值上,以便正確地做樣值平均:
— If(HighValue & error[sample]<10)error[sample] +=clkout_period
5. 若平均相位誤差大于時(shí)鐘周期,則減去時(shí)鐘周期以得到最終的平均相位誤差。