王偉偉 修展 蘇峰 馬瑞 任昌健
(北京航天長征飛行器研究所 北京市 100076)
隨著航天技術的發展,新技術、新產品層出不窮。眾所周知,航天產品的質量對成敗影響巨大,小到一個螺絲釘,大到整個系統,每個環節緊緊相扣,密不可分。隨著硬件產品的逐漸成熟,軟件產品的問題越來越凸顯,軟件來定義產品是大勢所趨。尤其是大規模FPGA、SOC、SOPC 等芯片的產生,給設計提供了開闊的空間來定義和設計產品,以滿足高密度、復雜的航天系統工程需要。
對于遙測系統來說,各系統都希望在一次試驗中可以拿到更多的數據,而不同的系統數據量和接口形式不同,這就導致遙測系統的對外接口種類繁多,包括光口、RapidIO 接口、網口、LVDS 接口、RS422 接口、I2C 接口、SPI 接口等,速率從9600bps 到2.5Gbps 不等。對于這些接口,硬件電路的成熟,需要通過軟件設計來保證數據的可靠記錄,必要時對一些重要數據進行冗余和備份,通過記憶重發或備份重傳的方式提高數據接收的可靠性。在遙測系統中,這些接口的實現幾乎全部使用FPGA,因此FPGA 軟件可靠性設計成為影響成敗的關鍵因素,軟件質量復查也成為產品乃至系統出廠前必不可少的一個環節。
本文針對遙測系統常用的FPGA 產品的軟件設計方法進行了闡述,提出了提高可靠性的設計方法和建議,供大家在設計過程中參考。
根據不同的應用場合,目前遙測系統單機產品使用的FPGA 芯片類型繁多不統一,大部分使用Xilinx 公司的芯片。例如有適用于存儲器的小封裝的Spartan-3E 系列的XC3S500E-4CP132I,也有應用于多接口、高速率接口控制器的Kintex-7 系列的XQ7K325T-2FFG676,不完全統計,使用到的FPGA 芯片種類不下十余種,這給設計帶來一定的困擾,很多成熟設計不能直接使用,還需要進行移植,中間還會帶來很多不常見的問題,開發周期都快趕上重新設計周期了。因此根據當前需求,結合國產化要求,當務之急要統一硬件平臺,開發成熟設計,節約成本,提高設計效率。通過研究和討論,最終選定了三款應用于不同場合的FPGA 芯片類型和一款CPLD 芯片,FPGA 分別對應于Xilinx 的Virtex4、Virtex5 和Kintex-7 系列FPGA,CPLD 使用Altera 公司的EPM2210F256I5N。硬件平臺選擇情況見表1 所示。
通過統一遙測系統FPGA 芯片的類型,可以方便地將成熟的、經過飛行試驗驗證的硬件電路和軟件設計快速移植到新的系統設計中,避免因為選擇新的設計平臺導致的軟硬件缺陷和未認識到的錯誤,從而提高了設計效率,增強了系統的可靠性。

圖1:兩時鐘輸入PLL 設計框圖
針對2.1 節中提到的硬件電路,選擇相應的開發工具。由于國產器件開發兼容國外器件,且使用同一套開發工具,目前暫時使用國外的軟件開發工具,除非有特殊的國產化要求。針對Xilinx的FPGA 選擇ISE 和Vivado 工具開發,ISE14.7 為ISE 的最終版本,Vivado 版本在不斷更新。目前推薦使用的版本為ISE14.7 和Vivado2017.4,開發工具成熟穩定。若同時使用到SPI Flash 和Virtex5 器件,建議使用ISE12.4 及以下版本,12.4 以上版本針對Virtex5 對SPI Flash 支持不好,燒寫程序有問題。而對于Altera 的CPLD 器件,使用QuartusII 9.0 進行開發。本章節將對開發工具中涉及到提高軟件可靠性的設計方法進行描述。
2.2.1 IO 管腳配置
選定好軟件開發工具,開發完程序后,首先需要進行IO 管腳配置。配置時根據需求及硬件電路,對IO 的位置、電平標準及驅動能力進行準確的配置。IO 的位置根據硬件電路來設置;電平標準需要根據連接的塊區電壓以及與其連接的外設電平共同決定,一般GPIO 設置為LVCMOS33(3.3V LVCMOS 電平);IO 驅動能力根據需求適當調整,一般為設置為10mA 以上。IO 管腳配置影響速率和高低電平的判別標準,設置時要根據通信雙方采用的機制進行合理配置,設置不當會帶來通信錯誤和不必要的麻煩。
2.2.2 時序約束
FPGA 設計的關鍵是時序設計,而時序約束對設計可靠性有重要作用,合理的時序約束能夠增強設計的可靠性,錯誤的時序約束會導致軟件異常錯誤,時鐘余量不足,導致功能在某個環境中出現錯誤。對于一般應用而言,在無特殊時序要求的情況下,只需要對輸入時鐘進行約束即可。ISE 中在“User Constraints”工具下“Create Timing Constraints”界面中“Clock Domains”,對“Unconstrained Clocks”中列出的時鐘信號進行約束,其中包括全局時鐘輸入,同步信號時鐘輸入等,每個時鐘信號都要根據硬件電路進行正確設置,否則工具會根據默認時鐘進行布局布線,最終會影響軟件性能甚至導致功能錯誤。對于高速并行信號或有時序要求的同步時鐘和數據信號,必要時需要增加輸入輸出延時,新建一個期望頻率的“虛擬時鐘”,在此基礎上進行延遲約束,保證足夠的建立和保持時間,數據能夠正確傳輸。

表1:遙測系統統一硬件平臺

表2:指令發送格式

圖2:不合理時序約束下的時序不滿足路徑報告
以Quartus II 軟件為例,使用TimeQuest 工具或Tcl 腳本文件進行時序約束。在TimeQuest 中使用圖形文件向導創建時鐘約束和其他必要的時序約束??梢苑治鰪碗s路徑下的時序余量情況以及通過約束關鍵路徑來實現軟件功能。一般情況下,通過TimeQuest 中的“Create Clock”工具來創建全局時鐘約束,使用到鎖相環(PLL)時使用“Derive PLL Clocks”工具根據PLL 設置自動派生出其他時鐘約束,再使用“Derive Clock Uncertainty”來約束時鐘的不確定性,即可滿足工程需要。當系統涉及到多個輸入時鐘時,以Quartus II 軟件為例,設計時采用如圖1 所示時鐘輸入電路時,需要對輸入設計時序進行合理約束,否則會存現時序錯誤報告,對功能和性能造成不良影響。
如圖1 所示,PLL(Phase Locked Loop)鎖相環采用雙時鐘輸入,可以通過判斷兩個時鐘的有無,自動切換實現時鐘的輸入。兩個時鐘輸入頻率均為50MHz,PLL 的輸出為FPGA 軟件設計中使用到的不同時鐘頻率:80MHz(clk_80MHz)、240MHz(clk_240MHz)、50MHz(clk_50M)和20MHz(clk_20M)。針對上述應用,設計時若對時鐘不約束或只對GCLK0 或GCLK1 時鐘輸入進行約束,其他采用默認方式。布局布線完成后,查看TimeQuest 中的Report Timing 的時序報告,會發現如圖2 所示的時序不滿足路徑。
觀察圖2 中的時序報告,發現不滿足路徑上的信號都經歷了兩個Launch Clock(開始時鐘),分別為PLL 的clk[0](clk_80M)和clk[0]~1,clk[0]~1 為開發工具根據PLL 自動產生的一個時鐘,該時鐘為不存在的虛擬時鐘,不該作為時序約束進行分析報告。針對該問題,設計時需要對PLL 的產生時鐘進行如下約束:
create_generated_clock -name {clk_80} -source [get_ports {GCLK0}]-multiply_by 8 -divide_by 5 -master_clock {clkin} [get_pins {inst6|altpll_component|auto_generated|pll1|clk[0]}]
create_generated_clock -name {clk_240} -source [get_ports {GCLK0}]-multiply_by 24 -divide_by 5 -master_clock {clkin} [get_pins {inst6|altpll_component|auto_generated|pll1|clk[1]}]
create_generated_clock -name {clk_20} -source [get_ports {GCLK0}]-multiply_by 2 -divide_by 5 -master_clock {clkin} [get_pins {inst6|altpll_component|auto_generated|pll1|clk[3]}]

圖3:正確約束后的時序分析報告

圖4:起飛信號設計流程圖

圖5:通過I2C 通信方式實現健康管理數據傳輸示意圖
約束完成后,在進行布局布線,觀察時序報告,如圖3 所示。
時序約束對于一個復雜的設計來說很關鍵,直接影響功能的實現,因此設計時需要根據時鐘和關鍵路徑進行合理約束,從而最大限度保證建立和保持時間,增強軟件的可靠性。

圖6:典型的在線升級系統設計框圖
FPGA 軟件設計是系統可靠性設計的重點。由于FPGA 設計語言的多樣性和靈活性,且每個設計師的設計風格和設計習慣不同,一個功能的實現可以有多種方法。但一個好的設計需要未雨綢繆,在實現功能的前提下,綜合考慮可靠性及安全性,最大限度地針對能想到的各種異常分支,給出可靠的設計策略和方法,保證在異常情況下,軟件也可以按照設計的流程進行,而不是出現“死機”“不響應”等情況,最大可能地減少異常情況帶來的影響,至少能挽救的功能一定要保住。下面就幾個關鍵電路給出可靠性設計建議。
起飛電路是遙測系統乃至整個系統中重點考慮的因素。為保障可靠性,該接口硬件上會使用雙點雙線輸入,使用三路光耦同時接收起飛信號,光耦的輸出連接到FPGA 的三個IO 管腳上。在進行FPGA 軟件處理時,首先對三路信號使用FPGA 系統時鐘進行濾波處理,去除N 個系統時鐘周期內的高頻干擾信號,N 根據系統時鐘進行合適選擇,若系統時鐘為20MHz,N 一般設置為3~5,可以濾除150ns~250ns 的毛刺。一旦檢測到起飛信號的上升沿,開始計數來對起飛信號進行合適的脈寬判斷。通常遙測系統脈寬判斷時間為20ms,不同系統根據對實時性的要求按照實際需求設定判寬時間。脈寬判斷完成后,再對三路信號進行“三判二”處理,三路中有兩路信號滿足起飛信號判斷標準即認為起飛信號到來,一旦滿足判斷條件即封鎖該信號,直到飛行結束。起飛信號的軟件設計流程如圖4 所示。
通過采用上述方法對起飛信號進行處理,確??煽拷邮盏狡痫w信號,作為后續的時序控制和數據處理的時間零點。
對于一些關鍵的指令信號,軟件需要在保證正確接收的情況下,避免誤指令動作。需要對指令發送格式進行規定。通常地,在遙測系統中,指令種類和形式不是很多,大部分為數據傳輸,不需要判斷。為了減少響應時間,指令長度一般設計為簡單的兩個字節。但為了保證指令可靠接收,使用三判二的方式處理。表2 中以串口RS422接口為例,列出了簡單指令的發送格式,其中0xB8 為幀頭,CMD為命令區分字。發送端先發高字節幀頭再發低字節指令,每個指令字之間有一定的時間間隔,時間間隔可根據使用到的波特率進行合理設置,這樣接收端可根據間隔區分目前傳輸的指令和下一條傳輸的指令,同時也避免了因連續發送造成的字節錯亂的情況發生。接收端接收串口指令并進行超時判斷,然后對接收到的三條指令進行三判二處理,滿足兩個指令正確即認為收到有效指令,執行相應操作。
該指令冗余設計方法為遙測系統常用設計方法,簡單可靠。該方法只使用于傳送指令,對于一個接口即要傳輸指令又要傳輸數據,則需要根據實際需求情況增加幀長度,用于區分指令和數據,收發雙方按照協議進行處理,保證數據可靠接收。
隨著FPGA 規模增大以及SOC 技術的發展,FPGA 集成的IP功能越來越豐富。為了實時地監測FPGA 芯片內部的電壓及溫度,以及一些重要參數,設計時需要增加健康管理功能??梢酝ㄟ^遙測數據周期性的查看FPGA 的工作狀態,出現問題時可以快速定位,提高調試效率,簡化排故流程。Xilinx 的一些FPGA 芯片自帶系統監測(SYSTEM MONITOR)功能,設計時需要將IP 核加入工程中進行設置和讀取內部環境參數。若FPGA 不帶有該功能,需要外置傳感器和AD 采集芯片,對環境參數進行采集,然后插入到遙測數據幀結構中,發送給地面設備進行監測。
通常,多個FPGA 設備之間采用簡單的通信總線形式,比如I2C、RS485、CAN 等進行健康管理數據通信。以I2C 總線為例,如圖5 所示。設置時采用兩條I2C 進行通信,實現熱備份冗余設計。首先作為主控Master 在I2C 通道1 上每個T 周期查詢一次結果,每隔T1 周期以此查詢從設備Slave1、從設備Slave2 和從設備Slave3的狀態,若某個從設備未響應,連續重試2 次,依舊無響應,則切換到I2C 通道2 上進行3 次重試,有一次成功則在這條總線進行其他操作,直到遇到問題,切換到I2C 通道1 上,以此類推,保證通信可靠性。
FPGA 軟件的一個重要特性是它具有重構性,可以遠程實現配置數據的更新,更改軟件,實現新的功能。該功能解決了產品在總裝后無法在不拆卸的情況下更新FPGA 軟件的難題,縮短了時間,大大節省了人力財力,提高了效率。針對遙測系統不斷變化的需求,軟件更新頻率很高,因此該功能逐漸變為軟件設計的基本要求,增強了產品的安全性和可靠性,大大提高了設計效率。典型的在線升級系統如圖6 所示。
如圖6 所示,一般地,目標系統和地面系統進行通信采用UART、1553B、Ethernet 等接口形式中的一種或多種,實現彈地數據之間的傳輸。這樣就可以將地面系統中更改后的新的FPGA 配置文件通過上述接口傳輸到目標系統上的FPGA 控制器,接著FPGA控制flash 讀寫將配置文件正確寫入到Flash 固定位置,從而實現數據流的更新。
在遠程更新的時候,需要兩個以上的多鏡像來保護設計的穩定性和安全性。Xilinx 給出的方案為Multiboot 啟動策略。Multiboot中至少兩個鏡像,分別為G 鏡像(Golden)和M 鏡像(Multiboot),G 鏡像燒寫后不再改變。兩個鏡像同時存在于flash 中,更新的時候只更新M 鏡像,更新后直接使用M 鏡像。當M 鏡像更新出現錯誤的時候,則啟動G 鏡像。通過G 鏡像中的設計來重新更新Flash中M 鏡像部分,從而避免了因錯誤操作或異常斷電等因素導致FPGA 徹底無法啟動問題,能夠保證在線升級程序的有效運行,可以再次進行軟件升級操作。
本文針對航天遙測系統中設計到的FPGA 軟件產品,提出了幾點提高質量的可靠性設計方法和建議,主要包括設計平臺的統一,對軟件工程中設計到的IO 管腳配置和時序約束給出合理性設置和約束的建議;同時針對系統中常用到的起飛接口和指令傳輸設計給出了具體的設計方法,最后對提高可靠性的健康管理和在線升級設計給出了設計方法和建議,通過以上措施,可以有效提高FPGA 軟件質量,增強系統可靠性。