王偉偉 修展 蘇峰 馬瑞 任昌健
(北京航天長(zhǎng)征飛行器研究所 北京市 100076)
隨著航天技術(shù)的發(fā)展,新技術(shù)、新產(chǎn)品層出不窮。眾所周知,航天產(chǎn)品的質(zhì)量對(duì)成敗影響巨大,小到一個(gè)螺絲釘,大到整個(gè)系統(tǒng),每個(gè)環(huán)節(jié)緊緊相扣,密不可分。隨著硬件產(chǎn)品的逐漸成熟,軟件產(chǎn)品的問題越來越凸顯,軟件來定義產(chǎn)品是大勢(shì)所趨。尤其是大規(guī)模FPGA、SOC、SOPC 等芯片的產(chǎn)生,給設(shè)計(jì)提供了開闊的空間來定義和設(shè)計(jì)產(chǎn)品,以滿足高密度、復(fù)雜的航天系統(tǒng)工程需要。
對(duì)于遙測(cè)系統(tǒng)來說,各系統(tǒng)都希望在一次試驗(yàn)中可以拿到更多的數(shù)據(jù),而不同的系統(tǒng)數(shù)據(jù)量和接口形式不同,這就導(dǎo)致遙測(cè)系統(tǒng)的對(duì)外接口種類繁多,包括光口、RapidIO 接口、網(wǎng)口、LVDS 接口、RS422 接口、I2C 接口、SPI 接口等,速率從9600bps 到2.5Gbps 不等。對(duì)于這些接口,硬件電路的成熟,需要通過軟件設(shè)計(jì)來保證數(shù)據(jù)的可靠記錄,必要時(shí)對(duì)一些重要數(shù)據(jù)進(jìn)行冗余和備份,通過記憶重發(fā)或備份重傳的方式提高數(shù)據(jù)接收的可靠性。在遙測(cè)系統(tǒng)中,這些接口的實(shí)現(xiàn)幾乎全部使用FPGA,因此FPGA 軟件可靠性設(shè)計(jì)成為影響成敗的關(guān)鍵因素,軟件質(zhì)量復(fù)查也成為產(chǎn)品乃至系統(tǒng)出廠前必不可少的一個(gè)環(huán)節(jié)。
本文針對(duì)遙測(cè)系統(tǒng)常用的FPGA 產(chǎn)品的軟件設(shè)計(jì)方法進(jìn)行了闡述,提出了提高可靠性的設(shè)計(jì)方法和建議,供大家在設(shè)計(jì)過程中參考。
根據(jù)不同的應(yīng)用場(chǎng)合,目前遙測(cè)系統(tǒng)單機(jī)產(chǎn)品使用的FPGA 芯片類型繁多不統(tǒng)一,大部分使用Xilinx 公司的芯片。例如有適用于存儲(chǔ)器的小封裝的Spartan-3E 系列的XC3S500E-4CP132I,也有應(yīng)用于多接口、高速率接口控制器的Kintex-7 系列的XQ7K325T-2FFG676,不完全統(tǒng)計(jì),使用到的FPGA 芯片種類不下十余種,這給設(shè)計(jì)帶來一定的困擾,很多成熟設(shè)計(jì)不能直接使用,還需要進(jìn)行移植,中間還會(huì)帶來很多不常見的問題,開發(fā)周期都快趕上重新設(shè)計(jì)周期了。因此根據(jù)當(dāng)前需求,結(jié)合國(guó)產(chǎn)化要求,當(dāng)務(wù)之急要統(tǒng)一硬件平臺(tái),開發(fā)成熟設(shè)計(jì),節(jié)約成本,提高設(shè)計(jì)效率。通過研究和討論,最終選定了三款應(yīng)用于不同場(chǎng)合的FPGA 芯片類型和一款CPLD 芯片,F(xiàn)PGA 分別對(duì)應(yīng)于Xilinx 的Virtex4、Virtex5 和Kintex-7 系列FPGA,CPLD 使用Altera 公司的EPM2210F256I5N。硬件平臺(tái)選擇情況見表1 所示。
通過統(tǒng)一遙測(cè)系統(tǒng)FPGA 芯片的類型,可以方便地將成熟的、經(jīng)過飛行試驗(yàn)驗(yàn)證的硬件電路和軟件設(shè)計(jì)快速移植到新的系統(tǒng)設(shè)計(jì)中,避免因?yàn)檫x擇新的設(shè)計(jì)平臺(tái)導(dǎo)致的軟硬件缺陷和未認(rèn)識(shí)到的錯(cuò)誤,從而提高了設(shè)計(jì)效率,增強(qiáng)了系統(tǒng)的可靠性。
圖1:兩時(shí)鐘輸入PLL 設(shè)計(jì)框圖
針對(duì)2.1 節(jié)中提到的硬件電路,選擇相應(yīng)的開發(fā)工具。由于國(guó)產(chǎn)器件開發(fā)兼容國(guó)外器件,且使用同一套開發(fā)工具,目前暫時(shí)使用國(guó)外的軟件開發(fā)工具,除非有特殊的國(guó)產(chǎn)化要求。針對(duì)Xilinx的FPGA 選擇ISE 和Vivado 工具開發(fā),ISE14.7 為ISE 的最終版本,Vivado 版本在不斷更新。目前推薦使用的版本為ISE14.7 和Vivado2017.4,開發(fā)工具成熟穩(wěn)定。若同時(shí)使用到SPI Flash 和Virtex5 器件,建議使用ISE12.4 及以下版本,12.4 以上版本針對(duì)Virtex5 對(duì)SPI Flash 支持不好,燒寫程序有問題。而對(duì)于Altera 的CPLD 器件,使用QuartusII 9.0 進(jìn)行開發(fā)。本章節(jié)將對(duì)開發(fā)工具中涉及到提高軟件可靠性的設(shè)計(jì)方法進(jìn)行描述。
2.2.1 IO 管腳配置
選定好軟件開發(fā)工具,開發(fā)完程序后,首先需要進(jìn)行IO 管腳配置。配置時(shí)根據(jù)需求及硬件電路,對(duì)IO 的位置、電平標(biāo)準(zhǔn)及驅(qū)動(dòng)能力進(jìn)行準(zhǔn)確的配置。IO 的位置根據(jù)硬件電路來設(shè)置;電平標(biāo)準(zhǔn)需要根據(jù)連接的塊區(qū)電壓以及與其連接的外設(shè)電平共同決定,一般GPIO 設(shè)置為L(zhǎng)VCMOS33(3.3V LVCMOS 電平);IO 驅(qū)動(dòng)能力根據(jù)需求適當(dāng)調(diào)整,一般為設(shè)置為10mA 以上。IO 管腳配置影響速率和高低電平的判別標(biāo)準(zhǔn),設(shè)置時(shí)要根據(jù)通信雙方采用的機(jī)制進(jìn)行合理配置,設(shè)置不當(dāng)會(huì)帶來通信錯(cuò)誤和不必要的麻煩。
2.2.2 時(shí)序約束
FPGA 設(shè)計(jì)的關(guān)鍵是時(shí)序設(shè)計(jì),而時(shí)序約束對(duì)設(shè)計(jì)可靠性有重要作用,合理的時(shí)序約束能夠增強(qiáng)設(shè)計(jì)的可靠性,錯(cuò)誤的時(shí)序約束會(huì)導(dǎo)致軟件異常錯(cuò)誤,時(shí)鐘余量不足,導(dǎo)致功能在某個(gè)環(huán)境中出現(xiàn)錯(cuò)誤。對(duì)于一般應(yīng)用而言,在無特殊時(shí)序要求的情況下,只需要對(duì)輸入時(shí)鐘進(jìn)行約束即可。ISE 中在“User Constraints”工具下“Create Timing Constraints”界面中“Clock Domains”,對(duì)“Unconstrained Clocks”中列出的時(shí)鐘信號(hào)進(jìn)行約束,其中包括全局時(shí)鐘輸入,同步信號(hào)時(shí)鐘輸入等,每個(gè)時(shí)鐘信號(hào)都要根據(jù)硬件電路進(jìn)行正確設(shè)置,否則工具會(huì)根據(jù)默認(rèn)時(shí)鐘進(jìn)行布局布線,最終會(huì)影響軟件性能甚至導(dǎo)致功能錯(cuò)誤。對(duì)于高速并行信號(hào)或有時(shí)序要求的同步時(shí)鐘和數(shù)據(jù)信號(hào),必要時(shí)需要增加輸入輸出延時(shí),新建一個(gè)期望頻率的“虛擬時(shí)鐘”,在此基礎(chǔ)上進(jìn)行延遲約束,保證足夠的建立和保持時(shí)間,數(shù)據(jù)能夠正確傳輸。
表1:遙測(cè)系統(tǒng)統(tǒng)一硬件平臺(tái)
表2:指令發(fā)送格式
圖2:不合理時(shí)序約束下的時(shí)序不滿足路徑報(bào)告
以Quartus II 軟件為例,使用TimeQuest 工具或Tcl 腳本文件進(jìn)行時(shí)序約束。在TimeQuest 中使用圖形文件向?qū)?chuàng)建時(shí)鐘約束和其他必要的時(shí)序約束??梢苑治鰪?fù)雜路徑下的時(shí)序余量情況以及通過約束關(guān)鍵路徑來實(shí)現(xiàn)軟件功能。一般情況下,通過TimeQuest 中的“Create Clock”工具來創(chuàng)建全局時(shí)鐘約束,使用到鎖相環(huán)(PLL)時(shí)使用“Derive PLL Clocks”工具根據(jù)PLL 設(shè)置自動(dòng)派生出其他時(shí)鐘約束,再使用“Derive Clock Uncertainty”來約束時(shí)鐘的不確定性,即可滿足工程需要。當(dāng)系統(tǒng)涉及到多個(gè)輸入時(shí)鐘時(shí),以Quartus II 軟件為例,設(shè)計(jì)時(shí)采用如圖1 所示時(shí)鐘輸入電路時(shí),需要對(duì)輸入設(shè)計(jì)時(shí)序進(jìn)行合理約束,否則會(huì)存現(xiàn)時(shí)序錯(cuò)誤報(bào)告,對(duì)功能和性能造成不良影響。
如圖1 所示,PLL(Phase Locked Loop)鎖相環(huán)采用雙時(shí)鐘輸入,可以通過判斷兩個(gè)時(shí)鐘的有無,自動(dòng)切換實(shí)現(xiàn)時(shí)鐘的輸入。兩個(gè)時(shí)鐘輸入頻率均為50MHz,PLL 的輸出為FPGA 軟件設(shè)計(jì)中使用到的不同時(shí)鐘頻率:80MHz(clk_80MHz)、240MHz(clk_240MHz)、50MHz(clk_50M)和20MHz(clk_20M)。針對(duì)上述應(yīng)用,設(shè)計(jì)時(shí)若對(duì)時(shí)鐘不約束或只對(duì)GCLK0 或GCLK1 時(shí)鐘輸入進(jìn)行約束,其他采用默認(rèn)方式。布局布線完成后,查看TimeQuest 中的Report Timing 的時(shí)序報(bào)告,會(huì)發(fā)現(xiàn)如圖2 所示的時(shí)序不滿足路徑。
觀察圖2 中的時(shí)序報(bào)告,發(fā)現(xiàn)不滿足路徑上的信號(hào)都經(jīng)歷了兩個(gè)Launch Clock(開始時(shí)鐘),分別為PLL 的clk[0](clk_80M)和clk[0]~1,clk[0]~1 為開發(fā)工具根據(jù)PLL 自動(dòng)產(chǎn)生的一個(gè)時(shí)鐘,該時(shí)鐘為不存在的虛擬時(shí)鐘,不該作為時(shí)序約束進(jìn)行分析報(bào)告。針對(duì)該問題,設(shè)計(jì)時(shí)需要對(duì)PLL 的產(chǎn)生時(shí)鐘進(jìn)行如下約束:
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:正確約束后的時(shí)序分析報(bào)告
圖4:起飛信號(hào)設(shè)計(jì)流程圖
圖5:通過I2C 通信方式實(shí)現(xiàn)健康管理數(shù)據(jù)傳輸示意圖
約束完成后,在進(jìn)行布局布線,觀察時(shí)序報(bào)告,如圖3 所示。
時(shí)序約束對(duì)于一個(gè)復(fù)雜的設(shè)計(jì)來說很關(guān)鍵,直接影響功能的實(shí)現(xiàn),因此設(shè)計(jì)時(shí)需要根據(jù)時(shí)鐘和關(guān)鍵路徑進(jìn)行合理約束,從而最大限度保證建立和保持時(shí)間,增強(qiáng)軟件的可靠性。
圖6:典型的在線升級(jí)系統(tǒng)設(shè)計(jì)框圖
FPGA 軟件設(shè)計(jì)是系統(tǒng)可靠性設(shè)計(jì)的重點(diǎn)。由于FPGA 設(shè)計(jì)語言的多樣性和靈活性,且每個(gè)設(shè)計(jì)師的設(shè)計(jì)風(fēng)格和設(shè)計(jì)習(xí)慣不同,一個(gè)功能的實(shí)現(xiàn)可以有多種方法。但一個(gè)好的設(shè)計(jì)需要未雨綢繆,在實(shí)現(xiàn)功能的前提下,綜合考慮可靠性及安全性,最大限度地針對(duì)能想到的各種異常分支,給出可靠的設(shè)計(jì)策略和方法,保證在異常情況下,軟件也可以按照設(shè)計(jì)的流程進(jìn)行,而不是出現(xiàn)“死機(jī)”“不響應(yīng)”等情況,最大可能地減少異常情況帶來的影響,至少能挽救的功能一定要保住。下面就幾個(gè)關(guān)鍵電路給出可靠性設(shè)計(jì)建議。
起飛電路是遙測(cè)系統(tǒng)乃至整個(gè)系統(tǒng)中重點(diǎn)考慮的因素。為保障可靠性,該接口硬件上會(huì)使用雙點(diǎn)雙線輸入,使用三路光耦同時(shí)接收起飛信號(hào),光耦的輸出連接到FPGA 的三個(gè)IO 管腳上。在進(jìn)行FPGA 軟件處理時(shí),首先對(duì)三路信號(hào)使用FPGA 系統(tǒng)時(shí)鐘進(jìn)行濾波處理,去除N 個(gè)系統(tǒng)時(shí)鐘周期內(nèi)的高頻干擾信號(hào),N 根據(jù)系統(tǒng)時(shí)鐘進(jìn)行合適選擇,若系統(tǒng)時(shí)鐘為20MHz,N 一般設(shè)置為3~5,可以濾除150ns~250ns 的毛刺。一旦檢測(cè)到起飛信號(hào)的上升沿,開始計(jì)數(shù)來對(duì)起飛信號(hào)進(jìn)行合適的脈寬判斷。通常遙測(cè)系統(tǒng)脈寬判斷時(shí)間為20ms,不同系統(tǒng)根據(jù)對(duì)實(shí)時(shí)性的要求按照實(shí)際需求設(shè)定判寬時(shí)間。脈寬判斷完成后,再對(duì)三路信號(hào)進(jìn)行“三判二”處理,三路中有兩路信號(hào)滿足起飛信號(hào)判斷標(biāo)準(zhǔn)即認(rèn)為起飛信號(hào)到來,一旦滿足判斷條件即封鎖該信號(hào),直到飛行結(jié)束。起飛信號(hào)的軟件設(shè)計(jì)流程如圖4 所示。
通過采用上述方法對(duì)起飛信號(hào)進(jìn)行處理,確??煽拷邮盏狡痫w信號(hào),作為后續(xù)的時(shí)序控制和數(shù)據(jù)處理的時(shí)間零點(diǎn)。
對(duì)于一些關(guān)鍵的指令信號(hào),軟件需要在保證正確接收的情況下,避免誤指令動(dòng)作。需要對(duì)指令發(fā)送格式進(jìn)行規(guī)定。通常地,在遙測(cè)系統(tǒng)中,指令種類和形式不是很多,大部分為數(shù)據(jù)傳輸,不需要判斷。為了減少響應(yīng)時(shí)間,指令長(zhǎng)度一般設(shè)計(jì)為簡(jiǎn)單的兩個(gè)字節(jié)。但為了保證指令可靠接收,使用三判二的方式處理。表2 中以串口RS422接口為例,列出了簡(jiǎn)單指令的發(fā)送格式,其中0xB8 為幀頭,CMD為命令區(qū)分字。發(fā)送端先發(fā)高字節(jié)幀頭再發(fā)低字節(jié)指令,每個(gè)指令字之間有一定的時(shí)間間隔,時(shí)間間隔可根據(jù)使用到的波特率進(jìn)行合理設(shè)置,這樣接收端可根據(jù)間隔區(qū)分目前傳輸?shù)闹噶詈拖乱粭l傳輸?shù)闹噶?,同時(shí)也避免了因連續(xù)發(fā)送造成的字節(jié)錯(cuò)亂的情況發(fā)生。接收端接收串口指令并進(jìn)行超時(shí)判斷,然后對(duì)接收到的三條指令進(jìn)行三判二處理,滿足兩個(gè)指令正確即認(rèn)為收到有效指令,執(zhí)行相應(yīng)操作。
該指令冗余設(shè)計(jì)方法為遙測(cè)系統(tǒng)常用設(shè)計(jì)方法,簡(jiǎn)單可靠。該方法只使用于傳送指令,對(duì)于一個(gè)接口即要傳輸指令又要傳輸數(shù)據(jù),則需要根據(jù)實(shí)際需求情況增加幀長(zhǎng)度,用于區(qū)分指令和數(shù)據(jù),收發(fā)雙方按照協(xié)議進(jìn)行處理,保證數(shù)據(jù)可靠接收。
隨著FPGA 規(guī)模增大以及SOC 技術(shù)的發(fā)展,F(xiàn)PGA 集成的IP功能越來越豐富。為了實(shí)時(shí)地監(jiān)測(cè)FPGA 芯片內(nèi)部的電壓及溫度,以及一些重要參數(shù),設(shè)計(jì)時(shí)需要增加健康管理功能??梢酝ㄟ^遙測(cè)數(shù)據(jù)周期性的查看FPGA 的工作狀態(tài),出現(xiàn)問題時(shí)可以快速定位,提高調(diào)試效率,簡(jiǎn)化排故流程。Xilinx 的一些FPGA 芯片自帶系統(tǒng)監(jiān)測(cè)(SYSTEM MONITOR)功能,設(shè)計(jì)時(shí)需要將IP 核加入工程中進(jìn)行設(shè)置和讀取內(nèi)部環(huán)境參數(shù)。若FPGA 不帶有該功能,需要外置傳感器和AD 采集芯片,對(duì)環(huán)境參數(shù)進(jìn)行采集,然后插入到遙測(cè)數(shù)據(jù)幀結(jié)構(gòu)中,發(fā)送給地面設(shè)備進(jìn)行監(jiān)測(cè)。
通常,多個(gè)FPGA 設(shè)備之間采用簡(jiǎn)單的通信總線形式,比如I2C、RS485、CAN 等進(jìn)行健康管理數(shù)據(jù)通信。以I2C 總線為例,如圖5 所示。設(shè)置時(shí)采用兩條I2C 進(jìn)行通信,實(shí)現(xiàn)熱備份冗余設(shè)計(jì)。首先作為主控Master 在I2C 通道1 上每個(gè)T 周期查詢一次結(jié)果,每隔T1 周期以此查詢從設(shè)備Slave1、從設(shè)備Slave2 和從設(shè)備Slave3的狀態(tài),若某個(gè)從設(shè)備未響應(yīng),連續(xù)重試2 次,依舊無響應(yīng),則切換到I2C 通道2 上進(jìn)行3 次重試,有一次成功則在這條總線進(jìn)行其他操作,直到遇到問題,切換到I2C 通道1 上,以此類推,保證通信可靠性。
FPGA 軟件的一個(gè)重要特性是它具有重構(gòu)性,可以遠(yuǎn)程實(shí)現(xiàn)配置數(shù)據(jù)的更新,更改軟件,實(shí)現(xiàn)新的功能。該功能解決了產(chǎn)品在總裝后無法在不拆卸的情況下更新FPGA 軟件的難題,縮短了時(shí)間,大大節(jié)省了人力財(cái)力,提高了效率。針對(duì)遙測(cè)系統(tǒng)不斷變化的需求,軟件更新頻率很高,因此該功能逐漸變?yōu)檐浖O(shè)計(jì)的基本要求,增強(qiáng)了產(chǎn)品的安全性和可靠性,大大提高了設(shè)計(jì)效率。典型的在線升級(jí)系統(tǒng)如圖6 所示。
如圖6 所示,一般地,目標(biāo)系統(tǒng)和地面系統(tǒng)進(jìn)行通信采用UART、1553B、Ethernet 等接口形式中的一種或多種,實(shí)現(xiàn)彈地?cái)?shù)據(jù)之間的傳輸。這樣就可以將地面系統(tǒng)中更改后的新的FPGA 配置文件通過上述接口傳輸?shù)侥繕?biāo)系統(tǒng)上的FPGA 控制器,接著FPGA控制flash 讀寫將配置文件正確寫入到Flash 固定位置,從而實(shí)現(xiàn)數(shù)據(jù)流的更新。
在遠(yuǎn)程更新的時(shí)候,需要兩個(gè)以上的多鏡像來保護(hù)設(shè)計(jì)的穩(wěn)定性和安全性。Xilinx 給出的方案為Multiboot 啟動(dòng)策略。Multiboot中至少兩個(gè)鏡像,分別為G 鏡像(Golden)和M 鏡像(Multiboot),G 鏡像燒寫后不再改變。兩個(gè)鏡像同時(shí)存在于flash 中,更新的時(shí)候只更新M 鏡像,更新后直接使用M 鏡像。當(dāng)M 鏡像更新出現(xiàn)錯(cuò)誤的時(shí)候,則啟動(dòng)G 鏡像。通過G 鏡像中的設(shè)計(jì)來重新更新Flash中M 鏡像部分,從而避免了因錯(cuò)誤操作或異常斷電等因素導(dǎo)致FPGA 徹底無法啟動(dòng)問題,能夠保證在線升級(jí)程序的有效運(yùn)行,可以再次進(jìn)行軟件升級(jí)操作。
本文針對(duì)航天遙測(cè)系統(tǒng)中設(shè)計(jì)到的FPGA 軟件產(chǎn)品,提出了幾點(diǎn)提高質(zhì)量的可靠性設(shè)計(jì)方法和建議,主要包括設(shè)計(jì)平臺(tái)的統(tǒng)一,對(duì)軟件工程中設(shè)計(jì)到的IO 管腳配置和時(shí)序約束給出合理性設(shè)置和約束的建議;同時(shí)針對(duì)系統(tǒng)中常用到的起飛接口和指令傳輸設(shè)計(jì)給出了具體的設(shè)計(jì)方法,最后對(duì)提高可靠性的健康管理和在線升級(jí)設(shè)計(jì)給出了設(shè)計(jì)方法和建議,通過以上措施,可以有效提高FPGA 軟件質(zhì)量,增強(qiáng)系統(tǒng)可靠性。