王偉偉,閆新峰,修 展,徐 進,張 甜
(北京航天長征飛行器研究所,北京 100076)
隨著航天技術的發展,FPGA憑借其豐富的接口和邏輯資源,逐漸取代單片機和DSP,越來越多地應用到產品設計中。它可以大大減小設計規模,提高設計效率。根據可編程技術不同,FPGA分為SRAM(static random access memory)型、反熔絲型和Flash型[1-2]。由于SRAM型FPGA采用CMOS工藝,集成度高、性能優越、資源豐富、成本低廉,其可重復編程的特性使它擁有廣闊的應用,尤其是在航天器的在軌更新和維護方面,優勢明顯。但航天系統是一個可靠性要求的系統,空間輻射對于SRAM型FPGA影響巨大,會引起單粒子反轉,如果導致關鍵性能失效,很有可能導致任務失敗,帶來巨大的損失。同時航天工程是一個復雜的工程,需要各系統協同合作才能完成。通常在研制初期,由于進度原因,細節考慮不全或因為用戶需求變化,在總裝后需要對產品中FPGA軟件進行升級才能正常工作,這時如果產品不具備在線重構功能,則必須進行拆卸操作,由此造成了巨大的時間和成本損失,因此FPGA具備在線重構功能成為系統越來越迫切的需求[3-4]。
針對Xilinx 7系列以下FPGA、7系列FPGA和ZYNQ提出了三種提高在線重構可靠性的設計方法,分別為基于ASIC在線重構設計方法、基于MultiBoot多鏡像的設計方法和基于ZYNQ的在線重構技術[5-7]。這三種方法幾乎涵蓋了Xilinx所有FPGA,實現了在線重構技術,提高了系統可靠性。
在嵌入式領域,FPGA憑借豐富的接口和邏輯資源,越來越受到工程師的歡迎,尤其是配置方式的多樣性和在線重構技術,給工程師提供了豐富的設計方法和設計空間,根據實際需求隨時改變設計來實現改變或增加新的功能,提高系統的安全性和可靠性。不同廠家的FPGA配置方式有所不同但大同小異,本文主要針對Xilinx的FPGA進行研究,提出設計方法。
Xilinx FPGA支持多種配置方式,從配置時鐘的來源可以分為:主模式(Master Modes)和從模式(Slave Modes);從數據讀取方式可分為:并行模式(Master Modes)和串行模式(Serial Modes)。根據這兩種不同進行組合,可以得到5種FPGA常用的配置方式:主串、從串、主并、從并和JATG模式。工程上最常使用的是SelectMAP(主并)和SPI模式(主從),分開使用Xilinx的配置芯片PROM和FPGA支持的SPI Flash芯片。SelectMAP和SPI模式采用主模式,FPGA在上電后加載片外Flash芯片中的配置比特流,配置所需的時鐘信號(CCLK)由FPGA內部產生,且FPGA控制整個配置過程。自動將配置數據從相應的Flash芯片讀入到SRAM中。以7系列FPGA為例,其配置流程大致分為8個步驟,如圖1所示。

圖1 FPGA配置流程
上電后,FPGA的PROGRAM_B引腳變低開始整個配置過程,可以通過控制FPGA硬件硬件PROGRAM_B引腳的變化來重新配置FPGA。上電后,使用JTAG JPROGRAM指令或IPROG命令,配置存儲器將并清空。在此期間,通過使用全局三態將I/O置于高阻態,如果硬件引腳PUDC_B為低電平,則內部上拉。硬件引腳INIT_B在初始化期間內部驅動為低電平,完成后變為高電平。接著設備對外部模式配置硬件M[2:0]進行采樣,開始驅動時鐘CCLK,將一組32bit特殊的同步字(0xAA995566)發送到配置邏輯。同步字用來將配置數據與內部配置邏輯對齊。設備同步后,先通過設備ID檢查才能加載配置數據。如果在配置期間發生ID錯誤,則設備會嘗試重新配置,設備ID檢查內置于比特流中。之后FPGA開始加載配置幀,加載配置數據時會根據數據包計算循環冗余校驗(CRC),然后和比特流中存儲好的CRC值進行比較,匹配通過后FPGA開始進行啟動序列,啟動完成后,FPGA配置完成,開始正常工作。
根據上述FPGA的配置過程,可以通過軟硬件設計保證FPGA能夠將配置存儲器存儲的配置比特流可靠地加載到FPGA中。隨著FPGA技術的不斷發展,不同代的FPGA產品在重構方便擁有不同的特性。Xilinx FPGA 7系列具備MultiBoot多鏡像啟動功能,支持在線更新系統,配置文件可以現場動態升級。7系列以前的FPGA則不具備該功能,需要外置芯片來進行重構設計。而對于ZYNQ系列,由于內置有ARM處理器,因此其配置方式更加靈活多樣,方便實現在線重構設計[8-10]。
FPGA軟件的一個重要特性是它具有重構性,可以遠程實現配置數據的更新,更改軟件,實現新的功能。該功能解決了產品在總裝后無法在不拆卸的情況下更新FPGA軟件的難題,縮短了時間,大大節省了人力財力,提高了效率。針對遙測系統不斷變化的需求,軟件更新頻率很高,因此該功能逐漸變為軟件設計的基本要求,增強了產品的安全性和可靠性,大大提高了設計效率。典型的在線升級系統如圖2所示。

圖2 典型的在線升級系統設計框圖
如圖2所示,一般地,目標系統和地面系統進行通信采用UART、1553B、Ethernet等接口形式中的一種或多種,實現彈地數據之間的傳輸。這樣就可以將地面系統中更改后的新的FPGA配置文件通過上述接口傳輸到目標系統上的FPGA控制器,接著FPGA控制flash讀寫將配置文件正確寫入到Flash固定位置,從而實現數據流的更新。FPGA的在線重構技術,關鍵是要保證在更新失敗的情況下,任然可以運行舊版本或可以重新對其進行配置,否則就失去了在線重構的意義。下面針對上文提到的3種設計方法分別進行描述。
對于Xilinx 7系列以下的FPGA芯片,本身不具備在線重構能力,需要外置配置管理芯片進行配置,從而實現在線重構,提高可靠性和安全性。一般地,對于只存在一個FPGA芯片的設備,可以外加一個MCU或CPLD來實現對FPGA的在線重構設計。Xilinx的應用筆記中給出了基于MicroBlaze軟核和CPLD的在線重構技術來實現系統的在線更新。若一個設備中有多個FPGA芯片,且配置芯片也不同,有采用SelectMAP模式的PROM芯片,也有基于SPI模式的Flash存儲芯片,各個模塊之間通過背板連接。為了減少成本,提高設計效率,可以使用專用ASIC芯片來統一管理各FPGA芯片,實現在線重構,實現框圖如圖3所示。

圖3 在線升級ASIC設計原理框圖
該設計可以分別通過JTAG和SPI接口實現對PROM和SPI Flash的讀寫操作,最大支持8路JATG和8路SPI接口,同時支持JTAG協議的菊花鏈設計,可以對一個板卡上的多個FPGA進行配置。上位機可以通過UART接口選擇對哪個板卡上的某個FPGA進行操作,實現在線升級。同時也可以直接在設備附近使用JATG下載器對FPGA進行在線調試和升級,這樣完全保證了在總裝完成后也可以對產品進行調試和升級的需求,解決了軟件升級需要重新拆裝的難題,大大節約了成本,提高了效率。
針對Xilinx 7 系列FPGA可以使用推薦的MultiBoot方案來實現FPGA的在線重構。MultiBoot直接操作的是兩個鏡像,也可以是多個鏡像。其中一個鏡像永遠不會改變,用于令一個鏡像在加載失敗時可以返回到該鏡像上重新加載,稱之為G鏡像(Golden Image),后面的鏡像稱之為M鏡像(MuliBoot Image)。當需要進行遠程更新實現重構時,FPGA可以直接對Flash 芯片中M鏡像存放的位置進行讀寫操作,G鏡像的存儲位置和數據永遠不變。這樣在M鏡像出現錯誤時,可以退回到G鏡像,保證FPGA能夠正常運行,然后再對M鏡像進行更新。MultiBoot實現框圖如圖4所示。

圖4 MultiBoot 實現流程圖
一般的FPGA從Flash的基地址開始存放G鏡像,后面存放M鏡像。根據前面介紹的FPGA配置方法中,上電后,FPGA從地址為0的地方開始加載,也就是先加載G鏡像,但是在G鏡像的開始位置添加了IPROG(內部編程)命令和M鏡像的地址,當FPGA運行到這個位置時會直接跳到M鏡像位置開始加載,IPROG是一條命令可以在G鏡像中生效,也可以在設計中使用,將IPROG通過內部配置訪問接口ICAP(internal configuration accesa port)接口發送,從而實現任意時刻觸發重新重構。當加載M鏡像過程中遇到IDCode錯誤、CRC錯誤、WatchDog超時和BPI地址越界錯誤時,FPAG會觸發退回(FallBack)操作,同時FPGA內部寄存器會記錄,發生退回操作后,會忽略IPROG指令,直接加載G鏡像后面的配置文件,運行G鏡像。
Xilinx 7系列FPGA通過將IRPOG指令潛入到比特流中的方式,實現了FPGA的多鏡像啟動,確保了FPGA配置的可靠性。IPROG指令內容如表1所示,其中WBSTAR為Warm Boot Start Address Register的縮寫,即熱啟動地址寄存器。

表1 IPROG指令描述
在G鏡像中通過加入IPROG指令實現了地址的跳轉,當M鏡像發生錯誤后,會觸發FallBack操作,退回到基地址位置,FPGA將忽略該部分指令,繼續執行G鏡像的后面其他部分內容,實現G鏡像的加載,正常運行。G鏡像中設計有遠程更新程序,可以操作Flash芯片,更新M鏡像數據,從而實現對M鏡像的在線更新,實現FPGA的遠程更新和重構。
Xilinx ZYNQ與傳統FPGA有著巨大的差異,是一款SoC(可編程片上系統),擁有雙核ARM A9處理器和7系列FPGA邏輯資源。啟動過程體現了以處理器為核心這一特點,先啟動處理器(PS)再啟動邏輯部分(PL),也就是PL的配置是通過ARM核來配置的,不支持從PL端直接啟動配置。
ZYNQ7000的配置按先后順序分為3個階段:stage0、stage1、stage2,其中stage2可選。每個階段的功能及處理過程如表2所示。

表2 ZYNQ配置過程
根據表2中的內容可知,ZYNQ上電后先運行BootROM,初始化外部存儲設備驅動程序,然后從存儲設備的0地址開始,搜索第一階段啟動程序FSBL(First Stage Boot Loader),然后根據FSBL加載PL鏡像和后續的PS鏡像。基于Qaud-SPI(QSPI) Flash啟動方式的ZYNQ啟動流程如圖5所示。

圖5 基于QSPI Flash的ZYNQ啟動流程
如圖5所示,上電后,ZYNQ運行BootROM,初始化QSPI接口,開始讀取Flash中數據,由于BootROM能夠訪問QSPI Flash的最大地址為16 M,因此在此地址區間內必須存在完整的FSBL。找到FSBL后,根據FSBL開始加載PL和PS鏡像。由此可知,如果QSPI Flash中存在多個鏡像文件時,ZYNQ只執行第一個鏡像,第一個鏡像加載不成功才會加載后面的鏡像。根據此特性,可設計在線升級方案,如圖6所示。

圖6 ZYNQ 多鏡像在QSPI Flash中的存儲位置
如圖6所示,在拿到一個全新的ZYNQ硬件設計后,QSPI Flash為空,不存在任何可執行的鏡像文件。這時需要用JTAG模式,將Golden鏡像下載到QSPI FLash的高地址位置,該地址要大于一個ZYNQ可執行鏡像的大小,保證更新時不會破壞到G鏡像。在生成鏡像文件時,PPGA和ARM執行文件要選擇md5校驗,這樣可以確保鏡像的正確性和唯一性。在Golden鏡像中有在線升級程序,可以根據地面指令,更新MultiBoot鏡像,即從0地址開始更新最新的鏡像,由于G鏡像和M鏡像中的軟件版本有區別,這樣可以在線驗證更新是否成功。如果為成功,版本信息顯示G鏡像版本;如果成功則顯示M鏡像版本。通過這種方式可以實現ZYNQ類器件的在線重構,簡單方便,穩定可靠。
針對3種不同的設計方法,通過設計地面軟件來實現對FPGA的在線重構。首先打開地面軟件,選擇待升級的二進制配置bin文件,并計算總CRC。然后再給PFGA上電,FPGA在上電后會發送準備好信號給地面軟件,地面收到該信號后會發送在線升級指令給FPGA,如果一分鐘內未收到在線升級指令,則FPGA退出在線升級狀態,進入正常工作狀態。收到在線升級指令后,FPGA開始對配置寄存器進行擦除操作,擦除完成后給地面反饋擦除結果。地面收到擦除完成指令后,開始以每64字節為一包發送有效配置數據,直到所有都完成后,再發送總CRC。FPGA對每包數據進行校驗并計算CRC,所有包完成后計算得到CRC,并和地面傳送來的CRC進行對比,正確則燒寫成功,否則燒寫失敗。燒寫成功后,對FPGA重新加電,通過版本號判斷是否更新成功。通過多次測試,3種方式均100%燒寫成功,可靠實現了在線升級功能。
針對FPGA類軟件可以在線重構的特性,根據Xilinx三種不同類型的FPGA的不同特性,分別提出基于ASIC的FPGA在線重構技術、基于MultiBoot多鏡像的在線重構設計以及基于ZYNQ的在線重構技術設計方法。Xilinx所有的FPGA,均可通過這三種技術中的一種或某種組合實現在線重構,解決了總裝后無法進行軟件更新的難題,同時保證了在線重構的安全性和可靠性,提高了設計效率。