霍海強(qiáng) 陳旭東 趙巖
摘要:針對(duì)計(jì)算機(jī)時(shí)間同步需求,設(shè)計(jì)了一種基于PCI Express(PCIe)總線(xiàn)的IRIG-B碼(B碼)解碼卡,該板卡接收外部B碼信號(hào)并解調(diào)出B碼時(shí)間信息,通過(guò)PCIe總線(xiàn)將B碼時(shí)間信息傳遞給計(jì)算機(jī)進(jìn)而完成計(jì)算機(jī)時(shí)間同步。測(cè)試結(jié)果表明,計(jì)算機(jī)能夠同步到B碼時(shí)間,且B碼解碼精度優(yōu)于100 ns,能夠滿(mǎn)足多數(shù)應(yīng)用需求。
關(guān)鍵詞:PCIe;B碼;FPGA
中圖分類(lèi)號(hào):TN253文獻(xiàn)標(biāo)志碼:A文章編號(hào):1008-1739(2021)15-51-4
0引言
時(shí)間是靶場(chǎng)、電力系統(tǒng)、導(dǎo)航定位、計(jì)算機(jī)網(wǎng)絡(luò)通信等領(lǐng)域的一個(gè)非常重要的參數(shù),同步精度指標(biāo)直接影響著系統(tǒng)工作的穩(wěn)定性與可靠性。為保障系統(tǒng)中各個(gè)設(shè)備之間時(shí)間的準(zhǔn)確性,通常配備時(shí)鐘源作為時(shí)間基準(zhǔn),將B碼等時(shí)頻信號(hào)傳輸?shù)接脮r(shí)設(shè)備,系統(tǒng)中計(jì)算機(jī)則配置B碼解碼卡從時(shí)鐘源獲取高精度的時(shí)間[1],從而與系統(tǒng)時(shí)間保持一致。鑒于B碼解碼卡僅用于傳輸時(shí)間信息,傳輸?shù)臄?shù)據(jù)量小,因此設(shè)計(jì)采用內(nèi)嵌PCIe硬核的FPGA實(shí)現(xiàn)PCIe總線(xiàn)通信,通過(guò)這樣的方式簡(jiǎn)化設(shè)計(jì)難度,降低制作成本,同時(shí)能夠?yàn)橛?jì)算機(jī)提供基于PCIe總線(xiàn)的時(shí)間信息[2]。
1總體設(shè)計(jì)
1.1 B碼授時(shí)原理
GJB 2991A-2008《B時(shí)間碼接口終端通用規(guī)范》規(guī)定,B碼的時(shí)幀速率為1幀/秒,1幀包含100個(gè)脈沖(碼元),碼元周期為10 ms。每個(gè)碼元序號(hào)由索引計(jì)數(shù)所確定,索引計(jì)數(shù)由準(zhǔn)時(shí)點(diǎn)起,0~99。碼元脈寬分為5 ms,2 ms,8 ms,2 ms表征二進(jìn)制0;5 ms表征二進(jìn)制1;8 ms表征位置識(shí)別標(biāo)志P[3]。在B碼的幀格式中,時(shí)幀的參考標(biāo)志由一個(gè)位置識(shí)別標(biāo)志和相鄰的參考碼元組成,Pr為幀參考點(diǎn),其寬度為8 ms。每10個(gè)碼元有一個(gè)位置識(shí)別標(biāo)志:P1,P2,P3,…,P9,P0,它們均為8 ms寬度。一個(gè)時(shí)間格式幀從幀參考標(biāo)志開(kāi)始,因此連續(xù)2個(gè)8 ms寬脈沖表明時(shí)幀中秒的開(kāi)始,從第2個(gè)8 ms開(kāi)始對(duì)碼元進(jìn)行編碼,分別為第0,1,2,…,99個(gè)碼元。B碼共100個(gè)碼元,使用部分碼元表示年、天、時(shí)、分、秒、潤(rùn)秒鋒信息,第2個(gè)8 ms的上升沿代表秒始信號(hào),通過(guò)對(duì)B碼進(jìn)行解碼進(jìn)而獲得時(shí)間信息及秒始信號(hào),即完成B碼授時(shí),B碼格式如圖1所示[4]。
2總體架構(gòu)設(shè)計(jì)
基于PCIe總線(xiàn)的B碼解碼卡由解碼卡、驅(qū)動(dòng)和上位機(jī)軟件三部分組成。B碼解碼卡完成B碼解碼、搭建底層PCIe鏈路功能;驅(qū)動(dòng)程序構(gòu)建上位機(jī)軟件與解碼卡之間的PCIe鏈路;上位機(jī)軟件通過(guò)驅(qū)動(dòng)讀取B碼解碼卡解出的時(shí)間信息,進(jìn)而更新本地時(shí)間,完成計(jì)算機(jī)B碼授時(shí),總體架構(gòu)設(shè)計(jì)如圖2所示。
3解碼卡設(shè)計(jì)
3.1硬件電路設(shè)計(jì)
解碼卡主要由電平轉(zhuǎn)換芯片、FPGA、Flash及電源芯片等組成,其中FPGA選用XILINX公司內(nèi)置PCIe硬核的SPARTAN 6系列,鑒于計(jì)算機(jī)上電過(guò)程中BIOS需要在500 ms內(nèi)掃描到PCIe硬件,因此FPGA及Flash需要在500 ms內(nèi)具備運(yùn)行狀態(tài),為了保證FPGA上電程序?qū)霑r(shí)間滿(mǎn)足上述要求,解碼卡采用并行BPI Flash保證程序?qū)霑r(shí)間。硬件設(shè)計(jì)框圖如圖3所示。
解碼卡通過(guò)電平轉(zhuǎn)換芯片將外部B(DC)碼轉(zhuǎn)換為L(zhǎng)VTTL電平送入FPGA,F(xiàn)PGA可使用內(nèi)時(shí)頻或外時(shí)頻解調(diào)出B碼時(shí)間信息及1 PPS信號(hào)建立本地時(shí)間基準(zhǔn),計(jì)算機(jī)通過(guò)金手指為解碼卡供電,并通過(guò)PCIe通信鏈路設(shè)置解碼卡參數(shù),讀取B碼解碼時(shí)間。
3.2 FPGA程序設(shè)計(jì)
3.2.1 B碼解碼程序設(shè)計(jì)
根據(jù)B碼特性,2個(gè)連續(xù)8 ms碼元的第2個(gè)8 ms代表秒始,因此搜索這2個(gè)碼元最為關(guān)鍵[5-6],在獲得秒始后,根據(jù)碼元計(jì)數(shù)可得B碼時(shí)間信息,具體流程如下。
①FPGA以晶振的10 MHz為參考時(shí)鐘分頻出1 kHz脈沖,對(duì)外部輸入B碼脈寬進(jìn)行計(jì)數(shù),判別出各個(gè)碼元的脈寬;
②根據(jù)連續(xù)2個(gè)8 ms脈寬碼元,獲得秒始信號(hào)Pr;
③根據(jù)Pr位置及后續(xù)碼元脈寬,獲得各個(gè)位置碼元值;
④存儲(chǔ)各個(gè)碼元值,根據(jù)國(guó)軍標(biāo)規(guī)定的年、天、時(shí)、分、秒、潤(rùn)、秒對(duì)應(yīng)的碼元位置及碼元值,確定B碼解碼時(shí)間;
⑤根據(jù)Pr位置提取秒始信號(hào),獲得秒沿1 PPS信號(hào)并輸出。
在1 PPS信號(hào)上升沿秒以上進(jìn)行加一秒操作,秒以下計(jì)數(shù)清零,同時(shí)秒以下計(jì)數(shù)以晶振10 MHz為時(shí)鐘進(jìn)行累加,提供秒以下時(shí)間信息。
3.2.2 PCIe通信鏈路程序設(shè)計(jì)
解碼卡FPGA的PCIe通信鏈路程序由PCIe硬核及邏輯程序組成,通過(guò)例化FPGA廠(chǎng)家封裝的IP核即可調(diào)用PCIe硬核,另外,可根據(jù)具體需求對(duì)PCIe IP核的各個(gè)寄存器進(jìn)行設(shè)置,其中包括BAR、ID、性能寄存器、結(jié)構(gòu)寄存器等多個(gè)參數(shù)。需要注意的是,當(dāng)需要插入2張解碼卡時(shí),2張卡的ID不能相同,否則會(huì)造成沖突。
完成IP核設(shè)置之后,在FPGA頂層文件中,根據(jù)上位機(jī)動(dòng)態(tài)庫(kù)寄存器地址及對(duì)應(yīng)的操作、IP核參數(shù)等設(shè)計(jì)PCIe讀寫(xiě)操作模塊,建立與上位機(jī)之間的PCIe總線(xiàn)通信基礎(chǔ)。FPGA建立PCIe硬核之后,需要調(diào)用PCIe的Tx_Engine、Rx_Engine才能進(jìn)行PCIe收發(fā)操作,發(fā)送引擎和接收引擎狀態(tài)機(jī)如圖4和圖5所示,根據(jù)Tx_Engine、Rx_Engine狀態(tài)機(jī),在FPGA中建立對(duì)應(yīng)的控制邏輯即可完成FPGA的PCIe鏈路通信工作。
4上位機(jī)驅(qū)動(dòng)及軟件設(shè)計(jì)
上位機(jī)需要使用驅(qū)動(dòng)才能建立PCIe通信,完成對(duì)解碼卡的讀寫(xiě)操作。為簡(jiǎn)化應(yīng)用程序設(shè)計(jì)、擴(kuò)展用戶(hù)應(yīng)用,在安裝驅(qū)動(dòng)的基礎(chǔ)上,建立動(dòng)態(tài)庫(kù)完成驅(qū)動(dòng)函數(shù)的調(diào)用,然后用戶(hù)可根據(jù)動(dòng)態(tài)庫(kù)接口,在相應(yīng)的軟件中調(diào)用動(dòng)態(tài)庫(kù)函數(shù)即可完成解碼卡狀態(tài)設(shè)置、B碼時(shí)間提取等工作。
4.1驅(qū)動(dòng)及動(dòng)態(tài)庫(kù)設(shè)計(jì)
為簡(jiǎn)化設(shè)計(jì)流程,使用Jungo公司的Windriver軟件包完成驅(qū)動(dòng)開(kāi)發(fā),該軟件包可以大幅簡(jiǎn)化設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)和硬件訪(fǎng)問(wèn)程序,將底層芯片復(fù)雜操作(如DMA傳輸?shù)龋┓庋b起來(lái),并提供動(dòng)態(tài)庫(kù)接口調(diào)用說(shuō)明即可。
基于Windriver驅(qū)動(dòng)接口,在Visual Studio環(huán)境下開(kāi)展了動(dòng)態(tài)庫(kù)函數(shù)設(shè)計(jì)工作,動(dòng)態(tài)庫(kù)函數(shù)的優(yōu)勢(shì)在于用戶(hù)應(yīng)用軟件不再關(guān)心底層硬件,有助于后續(xù)各種上位機(jī)應(yīng)用軟件開(kāi)發(fā)。驅(qū)動(dòng)及動(dòng)態(tài)庫(kù)函數(shù)是底層硬件與應(yīng)用程序之間通信的橋梁,如圖6所示。
根據(jù)實(shí)際工程應(yīng)用需求,設(shè)計(jì)了動(dòng)態(tài)庫(kù)接口函數(shù),如表1所示。上位機(jī)用戶(hù)軟件通過(guò)調(diào)用動(dòng)態(tài)庫(kù)的接口函數(shù)即可完成解碼卡狀態(tài)設(shè)置及時(shí)間讀寫(xiě)工作。當(dāng)需要增加新功能時(shí),在動(dòng)態(tài)庫(kù)函數(shù)中增加新的定義函數(shù),并在FPGA中增加對(duì)應(yīng)寄存器的操作即可。
4.2軟件設(shè)計(jì)
完成驅(qū)動(dòng)及動(dòng)態(tài)庫(kù)函數(shù)設(shè)計(jì)后,在上位機(jī)使用Visual Studio開(kāi)展應(yīng)用軟件設(shè)計(jì)。為滿(mǎn)足多種應(yīng)用需求,軟件界面設(shè)計(jì)97/08版本選擇、內(nèi)B碼/外B碼選擇、內(nèi)時(shí)鐘/外時(shí)鐘選擇、外部B碼狀態(tài)、B碼時(shí)間設(shè)置等功能,可設(shè)置解碼卡工作在不同版本、不同B碼源、不同時(shí)鐘源(外部有高性能時(shí)鐘源)。在軟件運(yùn)行過(guò)程中,將自動(dòng)存儲(chǔ)B碼時(shí)間及B碼狀態(tài),每小時(shí)保存一個(gè)“.txt”文件,當(dāng)外部B碼丟失或B碼時(shí)間錯(cuò)誤時(shí),可為后續(xù)分析問(wèn)題及解決問(wèn)題提供數(shù)據(jù)支撐。軟件界面如圖7所示。
5測(cè)試結(jié)果分析
對(duì)解碼卡進(jìn)行測(cè)試,測(cè)試框圖如圖8所示。時(shí)頻信號(hào)產(chǎn)生器內(nèi)置銣鐘,產(chǎn)生B碼、10 MHz和1 PPS信號(hào),分別送入解碼卡及計(jì)數(shù)器;解碼卡插到計(jì)算機(jī)PCIe×1槽位,解調(diào)外部B碼并將解出的1 PPS送入計(jì)數(shù)器進(jìn)行測(cè)量,同時(shí),計(jì)算機(jī)存儲(chǔ)測(cè)量結(jié)果及解碼卡解碼時(shí)間信息。
解碼卡時(shí)間存儲(chǔ)結(jié)果如圖9所示,最后一位為標(biāo)志位,當(dāng)外部B碼有效時(shí)為A,無(wú)效時(shí)為V。
時(shí)間間隔計(jì)數(shù)器測(cè)試結(jié)果如圖10所示,時(shí)頻信號(hào)產(chǎn)生器1 PPS與解碼1 PPS存在55 ns左右的偏差,經(jīng)分析,由于B碼傳輸為單向傳輸,傳輸路徑將導(dǎo)致時(shí)頻信號(hào)產(chǎn)生器輸出端B碼與解碼卡輸入端B碼信號(hào)存在12 ns固定的偏差,該偏差與線(xiàn)纜類(lèi)型及線(xiàn)纜長(zhǎng)度有關(guān),解碼卡解調(diào)1 PPS與B碼輸入存在33 ns左右偏差,該偏差與信號(hào)在FPGA內(nèi)部傳輸路徑有關(guān)。當(dāng)前B碼解碼精度一般在200 ns,能夠滿(mǎn)足大多數(shù)應(yīng)用的需求。
6結(jié)束語(yǔ)
介紹了基于PCIe總線(xiàn)的B碼解碼板卡的設(shè)計(jì)與實(shí)現(xiàn),鑒于PCIe總線(xiàn)數(shù)據(jù)流量較小,板卡使用內(nèi)嵌PCIe硬核的FPGA實(shí)現(xiàn)底層B碼解碼及PCIe通信,解碼精度優(yōu)于100 ns,與使用專(zhuān)用PCIe橋接芯片方案相比,方案更加簡(jiǎn)潔,同時(shí)降低了生產(chǎn)成本。另外,在上位機(jī)使用Windriver建立PCIe驅(qū)動(dòng),然后設(shè)計(jì)與FPGA程序?qū)?yīng)的動(dòng)態(tài)庫(kù)及應(yīng)用程序即可通過(guò)PCIe總線(xiàn)讀取B碼解碼時(shí)間信息,最終完成對(duì)計(jì)算機(jī)的授時(shí),實(shí)現(xiàn)計(jì)算機(jī)時(shí)間與系統(tǒng)時(shí)間同步。
參考文獻(xiàn)
[1]任連芳.基于PCI+Express總線(xiàn)的數(shù)據(jù)傳輸與存儲(chǔ)[D].南京:南京理工大學(xué),2010.
[2]張森峰.基于PCI+Express的數(shù)據(jù)傳輸適配卡設(shè)計(jì)[D].太原:中北大學(xué),2009.
[3]張明迪.基于FPGA的IRIG-B碼解碼設(shè)計(jì)[D].哈爾濱:哈爾濱工程大學(xué),2011.
[4]陳利.基于FPGA的IRIG-B碼基帶產(chǎn)生電路的設(shè)計(jì)與實(shí)現(xiàn)[D].蘇州:蘇州大學(xué),2014.
[5]耿家慶.新一代的GPS-B碼解碼授時(shí)系統(tǒng)設(shè)計(jì)[D].濟(jì)南:山東大學(xué),2014.
[6]吳煒,周燁,黃子強(qiáng).FPGA實(shí)現(xiàn)IRIG-B(DC)碼編碼和解碼的設(shè)計(jì)[J].電子設(shè)計(jì)工程,2010,18(12):162-164.
計(jì)算機(jī)與網(wǎng)絡(luò)2021年15期