曹海鋒
(山西工程職業學院,山西 太原 030032)
嵌入式CPU 處理器通過特定的硬件和軟件,實現了各種智能產品的管理、控制和人機交互功能,在智能產品功能實現中發揮著重要作用。
在工業自動化領域的智能儀表、控制裝置中嵌入式CPU 的一項重要功能就是精確記錄傳感器、控制開關、警告事件等關鍵事件發生的時間,或者在多臺智能終端組成的系統化應用中要求智能終端在時間上實現精準的流水線操作或同步動作,在此類產品實現中CPU 處理器需要對類似事件的記錄或控制信號的觸發控制與CPU 系統時間相互關聯,準確地記錄事件發生的時間或在預定的時間發出控制動作/操作指令[1]。在CPU處理器中,通常采用芯片內置的RTC(實時時鐘)來實現與時間信息相關聯的功能應用。
RTC 是嵌入式CPU 處理器芯片上的常見功能模塊,它的硬件結構如圖1所示。

圖1 CPU RTC功能模塊
CPU RTC 的核心器件是一組計數器,在外部晶振的激勵下進行時間間隔的累計計數,計數器的初始值通過CPU 軟件進行初始化,使其與標準時間如北京時間或UTC 時間一致。RTCX1、RTCX2 是CPU 外部32.768KHz 晶振輸入管腳,為RTC 電路提供時鐘源,Vbat是電池供電輸入管腳,該管腳的作用是當CPU 在關機狀態時RTC 電路能通過該管腳從板載電池供電,維持RTC 電路正常工作,防止當系統再次加電開機后實時時間信息丟失。
在嵌入式CPU 系統設計中,一般基于RTC 實現對特定輸入輸出事件的時間戳標定是通過圖2所示的流程實現的。

圖2 基于RTC實現對輸入輸出事件的時間戳標定原理
事件輸入、事件輸出是與嵌入式CPU 系統實現特定應用相關聯的外部接口,如數字變電站的繼電保護裝置中的跳閘信號輸入、控制開關輸出信號,或者工業自動化生產線上溫度、濕度傳感器告警輸入和冷卻風扇控制輸出。這些與特殊應用相關聯的事件信號,通過嵌入式CPU 系統設計中的輸入/輸出事件監測電路轉換為CPU 可以識別的中斷輸入和事件類型信號輸入到CPU 處理器。CPU 收到事件中斷后,軟件響應中斷申請并進入中斷服務程序,CPU 事件中斷服務程序從RTC 功能模塊讀取當前時間并關聯到當前申請中斷的事件類型后,產生一條事件記錄消息,并通過軟件完成數據記錄或轉發,從而進一步實現上層網管信息的提交或人機交互功能。
時間同步模塊是嵌入式CPU 系統實現的可選功能,當產品應用對事件的記錄時間戳精度要求高或要實現多臺CPU 系統時間同步關聯的應用,如要求多個智能控制裝置在相同時間同時觸發輸出動作,此時需要由時間同步模塊來完成各智能終端中CPU 系統時間信息的同步。時間同步模塊一般由時間同步接口硬件和時間同步協議軟件組成,在電力行業比較常見的時間同步協議是IEEE1588、NTP,對應的接口類型是多模ST 光接口、100BASE-TX 以太網;移動通訊領域同步協議有1PPS+TOD、PTP 等,分別對應RS422 接口和1000BASE-T/1000BASE-X以太網接口[2]。
從上述時間戳標定的工作原理來看,嵌入式CPU系統完成一條事件的記錄需要經過多個硬件和軟件處理過程,每一個過程都會對事件對應的時間戳標定的精度帶來誤差,詳細分析結果參見表1。

表1 嵌入式CPU基于RTC實現事件時間戳標定的誤差分析表
從表1 分析結果來看,誤差1 為電路信號的轉換、傳輸誤差,是單向誤差,誤差大小與電路元器件的性能和具體實現方案有關,經過評估測量和補償后,該項誤差可以降到100納秒以下。
誤差2 是CPU 中斷服務程序執行過程的誤差,該過程誤差的大小與CPU 處理器性能、系統軟件功能復雜度有很大關系,是隨機誤差,不可測量且無法補償修正。
誤差3 是由于32.768KHz 晶振存在頻率偏差引起的,以50ppm 精度為例,每秒會最大累計50 微妙的時間誤差,此誤差為系統誤差,可以通過提高晶振的頻率精度和溫度穩定性,同時結合使用時間同步模塊的周期性校準來消除晶振的頻率偏差帶來的累計時間誤差,比如在采用1ppm 溫補晶振、利用時間同步模塊實現每秒校準一次的時間校頻率,理論上可以將誤差3 降到1uS 以內,如果需要進一步提高,可考慮采用GPS 馴服原子鐘銣鐘技術來實現將誤差3 降低到每秒10E-12S的偏差[3]。
誤差4是時間同步模塊在實現時間校準過程中引起的誤差,此過程產生的誤差大小與時間同步網絡實現、CPU 處理器性能、系統軟件復雜度有很大關系,NTP 協議同步精度受到同步數據報文的路由延時、CPU 軟件對同步報文時間戳標定精度有很大關系,一般采用NTP同步的系統時間誤差會大到秒級。
綜合上述分析,CPU 基于RTC 實現輸入輸出事件時間戳標定可能會存在秒級的誤差,造成誤差的主要因素是因為受CPU 性能、軟件運行的不確定性而產生的隨機誤差。在交通、工業控制、電力領域常常對智能設備的時間同步誤差要求到毫秒級甚至更小,因此該實現方案常常無法滿足實際應用的精度要求。
FPGA 是可編程的邏輯陣列,屬于專用集成電路中的一種半定制電路。FPGA 基本結構包括可編程邏輯塊、可編程輸入輸出單元、數字時鐘管理模塊、嵌入式塊RAM 存儲器、布線資源和內嵌專用硬核。由于FPGA 具有布線資源豐富,集成度高和可重復編程,投資較少的特點,在數字電路設計領域得到了很好的應用。
利用FPGA 實現對輸入輸出事件時間戳標定的設計方案如圖3所示。

圖3 基于FPGA實現對輸入輸出事件的時間戳標定原理
輸入/輸出事件監測模塊輸出的硬件中斷源和事件類型由FPGA 內部高速時鐘進行實時監控,當被監控的中斷源信號發生觸發跳變,FPGA 鎖存該中斷源和對應的事件類型,同時為該事件標定時間戳,并生成事件記錄,FPGA 通過事件記錄接口,將事件記錄數據發送給CPU,由CPU 進一步實現上層網管信息的提交或人機交互功能。
時間同步功能,由時間同步接口硬件電路實現同步報文對外的收發接口信號處理。通過此功能模塊可以實現多臺智能終端組建成時間同步系統,實現系統級的時間同步應用。目前常用的時間同步接口有GPS(全球定位系統)、PTP(精確時間協議)、TOD(日時間)及工業領域常用的IRIG-B[4]。時間同步報文由FPGA 實現接收和發送高精度時間戳標定,并對添加時間戳的報文重新進行CRC 校驗。時間同步協議則繼續由CPU軟件實現[5]。
采用FPGA 實現對輸入/輸出事件時間戳標定的設計方案主要利用了FPGA 內部的DCM 數字時鐘管理單元、BRAM 存儲器、高速時鐘網絡和可編程邏輯資源。FPGA內部功能設計如圖4所示。

圖4 FPGA內部模塊化設計方案
FPGA 事件捕獲模塊是125MHz 高速時鐘同步設計模塊,實時監控硬件中斷源信號的跳變,當采樣到有事件發生時,通過同時對RTC 計數器和事件類型鎖存,完成對觸發事件和對應時間戳的實時標定,并將得到的事件記錄寫入事件記錄FIFO。
由于外部被捕獲事件是相對于FPGA 內部高速時鐘是隨機發生的,如果直接采用時鐘信號來捕獲事件的觸發沿會存在一個時鐘周期的量化誤差。例如直接使用125MH 時鐘采用事件觸發沿會有最大接近8nS 的量化時間誤差。為提高被捕獲事件的測量精度,在FPGA 內部采用兩個時鐘PLL 實現8 個125M 時鐘的靜態相位調整,得到8 個精確到等相位差時鐘陣列,這組時鐘陣列相鄰時鐘輸出相位依次偏移1nS。在事件捕獲時采用這8 個125MHz 時鐘(本文按CLK125M_0、CLK125M_45、CLK125M_90、CLK125M_135、CLK125M_180、CLK125M_225、CLK125M_270、CLK125M_315 命名)作為被測脈沖信號的時間測試時鐘,相鄰時鐘相位偏移為45°,上升沿時間偏差1nS。
事件捕獲功能模塊使用8個32位時間測量計數器MEASURE_CNT0[31:0]、MEASURE_CNT45[31:0]…MEASURE_CNT315[31:0],這8個32位時間測量計數器,分別受CLK125M_0、CLK125M_45…CLK125M_315 8 個時鐘激勵,自由翻轉,每個計數器的跳變時間偏差為1nS,該組計數器受DCM、PLL 的復位信號做同步復位。
外部事件的脈沖信號觸發事件測量由FPGA RTC 時間計數器TIME_CNT_S、TIME_CNT_NS、8 個125M 多項位時鐘CLK125M_0~CLK125M_315、8 個時間測量計數器MEASURE_CNT0[31:0]~MEASURE_CNT315[31:0]負責實現。外部事件脈沖信號被CLK125M_0 檢測到上升沿跳變時對應的時間計數器為Tx+8,時間測量計數器MEASURE_CNT0[31:0]~MEASURE_CNT7[31:0]各自時鐘采樣到上升沿時的計數值分別為2、2、2、2、2、2、1、1,從時間測試計數器值看到與CLK125M_0 檢測到跳變沿計數值相同的計數有6 個,由此計算被測事件脈沖跳變沿發生的時間為Tx+8-2=Tx+6,測量分辨率單位為nS,測試精度可以達到1nS。
FPGA 內部RTC 時間計數器由32 位秒計數TIME_CNT_S 和32 位納秒計數TIME_CNT_NS 組成。FPGA 時間計數器由CLK125M_0時鐘觸發計數,每個時鐘周期增加8nS。FPGA RTC 時間計數器的關鍵功能是能提供時間校準接口并完成平滑校準功能,避免時間校準前后出現時間瞬間突變。
時間校準由32 位以納秒為單位的時間校正寄存器TIME_CNT_NS 和1 位校正標志TIME_ADJUST_FLAG 組成,該組寄存器提供給CPU 作為軟件時間校正接口。當軟件請求校準時,FPGA 用此組數據修正時間計數器;FPGA 內部為實現時間平滑校準功能,提供32 位時鐘調整計數器CLK_ADJUST_CNT 和32 位時鐘校正寄存器CLK_ADJUST_REG。在時間平滑調整過程中每個CLOCK 125MHz 0°上升沿到時,CLK_ADJUST_CNT值增加1,并將其和CLK_ADJUST_REG 做比較,如果相等,則CLK_ADJUST_CNT 計數清零,根據TIME_ADJUST_FLAG 標志,確定從TIME_CNT_NS 加“1”還是減“1”納秒;該機制實現的校正最高精度為1/([2E32)*8]即1/34359738360。平滑調整精度由CLK_ADJUST_REG 決定,當其值為32’h00000001時,表示每個時鐘周期調整1納秒,是最快的調整節奏,調整率為1/8,當其值為32’hffffffff 時為最慢調整節奏,調整率為1/34359738360。調整率的選擇由CPU 軟件根據時間協議軟件程序運行結果獲得的RTC 時間偏差大小來決定,大偏差采用快調整率,小偏差采用慢調整率。
事件記錄FIFO 是由FPGA 內部BRAM 數據存儲器和讀寫控制邏輯組成,有寫入和讀取兩個數據接口,遵循先入先出的寫入和讀取規則,通過事件記錄FIFO 實現了事件記錄數據的緩存和FPGA 內部不同功能模塊對接時的時鐘域切換。
UART 接口功能檢測事件記錄FIFO 是否有記錄數據,如果有數據則發起讀FIFO 操作,從事件記錄FIFO 讀出數據,按照與CPU 串口相同的波特率設置把事件記錄數據從FPGA發送給CPU。
DCM 是FPGA 內部的數字時鐘管理功能資源,它將從溫補晶振輸入的10MHz時鐘信號倍頻到125MHz并從BUFG 全局時鐘網絡輸出,BUFG 是FPGA 內部專用于時鐘信號的低延時高扇出布線資源,通過該時鐘網絡,能將125MHz 高速時鐘引入到FPGA 內部其他功能模塊,為它們提供工作時鐘[6]。
PHY MII 接口、同步報文時間戳標定、CPU MII接口模塊是FPGA 實現時間同步功能的模塊,PHY MII 接口和CPU MII 接口模塊分別實現與外部100BASE-T以太網PHY芯片和CPU 芯片的MII接口對接,實現接口時序和內部數據總線的轉換。同步報文時間戳標定是在同步報文進入FPGA 和輸出給外部PHY時由FPGA負責精確標定報文的接收和發送時間戳。采用FPGA 對時間同步報文進行時間戳標定相比CPU 通過內置RTC 標定時間戳能完全消除軟件標定時間戳過程中產生的隨機誤差,因此使時間同步功能精度得到顯著提高。
采用FPGA 對輸入輸出事件實現時間戳標定功能消除了CPU 在基于RTC 進行時間戳標定過程中由于受到CPU 處理器性能和系統軟件復雜度影響引起的隨機誤差,因此明顯提高了對事件時間戳標定的精度,詳細對比分析見表2。

表2 對比分析表
從表2可以明顯看到在采用嵌入式CPU基于芯片內部RTC功能進行事件時間戳標定時,由于受CPU性能和軟件設計復雜度影響是產生標定時間精度誤差的主要因素,且因為是隨機誤差類型,無法進行補償,采用該設計方案標定的時間戳的總體誤差在秒級別。
基于FPGA 時間戳標定的方案充分利用了FPGA實時性和硬件可編程的特點,用此方案標定時間戳的總體誤差可以控制在微妙級別。
基于嵌入式CPU 的智能產品對關鍵事件進行時間標定的應用非常廣泛,當系統對時間同步精度要求比較高時,采用FPGA 實現時間戳標定是一個較好的技術方案,在同等時間服務器組建的時間同步網應用中,相比CPU 基于內部RTC 標定事件戳,采用FPGA實現時間戳標定能將時間戳同步誤差從秒級降低到微秒級,因此,采用FPGA 標定時間戳的方案能滿足大多數高精度時間同步業務應用要求。