李林瞳,石云墀,張 凱,陳瑞龍,程慶林
(上海航天電子技術(shù)研究所,上海 201109)
微小衛(wèi)星對(duì)星載設(shè)備的集成化要求很高,一般要求在單一模塊完成雙機(jī)備份、多種功能模式切換以及在軌可重配置等功能。高效穩(wěn)定的FPGA 遠(yuǎn)程更新方案正是微小衛(wèi)星設(shè)計(jì)的關(guān)鍵一環(huán)。設(shè)計(jì)師往往在硬件空間、實(shí)現(xiàn)復(fù)雜度以及價(jià)格成本等因素的困擾下難以平衡各個(gè)方面。本文分析了3 種FPGA在軌重構(gòu)的設(shè)計(jì)方案和配置原理,即通過(guò)FPGA 直接讀寫(xiě)更新、雙鏡像更新和用戶自定義切換更新,比較得出更加適合于微小衛(wèi)星在軌更新應(yīng)用的配置方案。
結(jié)合項(xiàng)目需求,本文搭建基于Artix-7 與SPI Flash 的硬件平臺(tái),通過(guò)調(diào)用ICAPE2 傳輸同步字、重加載命令以及加載地址等指令信息,實(shí)現(xiàn)了對(duì)該配置方案的驗(yàn)證[1]。
可以通過(guò)FPGA 讀寫(xiě)FLASH 實(shí)現(xiàn)遠(yuǎn)程更新的方案,Xilinx 平臺(tái)需要根據(jù)時(shí)鐘、數(shù)據(jù)位寬和Flash操作命令等信息實(shí)現(xiàn)Flash 讀寫(xiě)控制器,通過(guò)FPGA直接控制Flash 的讀寫(xiě),充分挖掘FPGA 和Flash 的潛力。
但是,當(dāng)寫(xiě)入Flash 的操作出現(xiàn)錯(cuò)誤或者Flash中部分地址中的數(shù)據(jù)出現(xiàn)錯(cuò)誤時(shí),將導(dǎo)致無(wú)法正確寫(xiě)入或者存儲(chǔ)的數(shù)據(jù)出現(xiàn)錯(cuò)誤而使FPGA 無(wú)法加載成功。
當(dāng)FPGA 無(wú)法加載成功或者工作不正常時(shí),F(xiàn)LASH 的讀寫(xiě)操作也無(wú)法得到保證。此時(shí),遠(yuǎn)程更新的方案無(wú)法重新讀寫(xiě)Flash 來(lái)糾正之前的錯(cuò)誤。所以,當(dāng)Flash 直接由FPGA 控制讀寫(xiě)且遠(yuǎn)程更新出現(xiàn)錯(cuò)誤時(shí),衛(wèi)星在軌無(wú)法安排現(xiàn)場(chǎng)更新,很可能導(dǎo)致遠(yuǎn)程更新徹底失效。
可以使用雙鏡像的方案解決寫(xiě)入Flash 出錯(cuò)的問(wèn)題。在Flash 中放置兩個(gè)鏡像文件,即M 鏡像(Multiboot Image)和G 鏡 像(Golden Image)[2]。啟動(dòng)時(shí)先加載M 鏡像,當(dāng)M 鏡像出現(xiàn)錯(cuò)誤時(shí),則啟動(dòng)G 鏡像。由于G 鏡像從來(lái)沒(méi)有被更新過(guò),出現(xiàn)錯(cuò)誤的概率會(huì)非常小。加載流程和鏡像在Flash 中的相對(duì)位置如圖1 所示。Xilinx 7 系列FPGA 的雙鏡像方案是從基地址開(kāi)始存放G 鏡像的,后續(xù)存放M 鏡像。完成配置后如果配置成功,則運(yùn)行M 鏡像;如果運(yùn)行失敗,則重新加載G 鏡像。
圖1 雙鏡像配置模式加載流程
可以看出,雙鏡像方案的關(guān)鍵是完成兩個(gè)任務(wù):一是正常情況下加載完成時(shí)應(yīng)該是M 鏡像在運(yùn)行;二是出現(xiàn)錯(cuò)誤時(shí)需要返回G 鏡像。
FPGA 上電完成后,會(huì)按照設(shè)置進(jìn)行加載操作。主動(dòng)模式下,F(xiàn)PGA 會(huì)自動(dòng)完成對(duì)Flash 中存儲(chǔ)的鏡像數(shù)據(jù)的讀取,該過(guò)程用戶無(wú)法控制。一般的,F(xiàn)PGA 會(huì)從基地址開(kāi)始讀取數(shù)據(jù),所以為了完成加載完成時(shí)從M 鏡像加載,需要引入一條加載命令——內(nèi)部重加載指令(Internal program_B,IPROG)。具體而言,F(xiàn)PGA 直接從基地址開(kāi)始加載,先讀取G 鏡像數(shù)據(jù)。但是,這里G 鏡像的開(kāi)始部分添加了IPROG 指令和M 鏡像的起始地址,所以盡管從基地址加載,但G 鏡像只是運(yùn)行了最前面的幾條加載命令,M 鏡像只是等待了幾條命令后就開(kāi)始加載,可以認(rèn)為加載完成時(shí)是M 鏡像在運(yùn)行。
M 鏡像加載不成功時(shí),需要退回G 鏡像,雙鏡像方案稱這一步驟為Fallback。以下4 種錯(cuò)誤會(huì)觸發(fā)Fallback:(1)IDCODE 錯(cuò)誤;(2)CRC 校驗(yàn)錯(cuò)誤;(3)看門(mén)狗溢出錯(cuò)誤;(4)BPI 地址越界。IDCODE 錯(cuò)誤是指配置文件中的器件型號(hào)與當(dāng)前器件不匹配;CRC 校驗(yàn)指配置數(shù)據(jù)送入FPGA 后會(huì)進(jìn)行校驗(yàn),如果數(shù)據(jù)不一致導(dǎo)致CRC 校驗(yàn)出錯(cuò);看門(mén)狗溢出錯(cuò)誤發(fā)生在規(guī)定時(shí)間內(nèi)無(wú)法配置成功的情況;當(dāng)逐步增長(zhǎng)的BPI 地址超過(guò)最大值發(fā)生溢出時(shí),會(huì)觸發(fā)BPI 地址越界的錯(cuò)誤。
當(dāng)發(fā)生Fallback 后,工程會(huì)跳回0 地址開(kāi)始加載,即重新加載G 鏡像。值得注意的是,F(xiàn)PGA 內(nèi)部狀態(tài)寄存器會(huì)記錄觸發(fā)問(wèn)題等信息。根據(jù)在狀態(tài)寄存器中記錄的值,F(xiàn)PGA 會(huì)在發(fā)生Fallback 后自動(dòng)忽略IPROG 命令和加載地址等信息,直接加載G鏡像后面的部分,從而保證G 鏡像被完整加載。表1 記錄了當(dāng)G 鏡像內(nèi)置IPROG 命令,M 鏡像由于CRC 錯(cuò)誤導(dǎo)致觸發(fā)Fallback 時(shí)狀態(tài)寄存器的變化。狀態(tài)1 表示IPROG 被執(zhí)行,但在M 鏡像中檢測(cè)到CRC 出錯(cuò);狀態(tài)0 表示Fallback 被成功地加載。
表1 G 鏡像內(nèi)嵌IPGOG 且M 鏡像CRC 出錯(cuò)觸發(fā)Fallback 時(shí)狀態(tài)寄存器值
雙鏡像方案的優(yōu)點(diǎn)在于快速跳轉(zhuǎn)、加載和返回,尤其是在加載初期就進(jìn)行跳轉(zhuǎn),適合對(duì)配置時(shí)間有要求的場(chǎng)合。但是,該方案的原理和設(shè)置較為復(fù)雜,配置方式固定,無(wú)法完成微小衛(wèi)星遠(yuǎn)程更新時(shí)多種模式下的任意切換。
相對(duì)于雙鏡像方案,用戶自定義切換更新可以根據(jù)需要在多個(gè)鏡像中任意跳轉(zhuǎn),而不限于兩個(gè);用戶也可以選擇合適的時(shí)間觸發(fā)微小衛(wèi)星的遠(yuǎn)程在軌更新和模式切換。通過(guò)對(duì)內(nèi)部配置訪問(wèn)端口的分析,可以得出用戶自定義切換更新的實(shí)現(xiàn)方案。
內(nèi)部配置訪問(wèn)端口(Internal Configuration Access Port,ICAPE2)可以在FPGA 中以原語(yǔ)的方式被調(diào)用。ICAPE2 允許用戶在FPGA 陣列層面訪問(wèn)配置功能,配置命令或數(shù)據(jù)可以從FPGA 陣列的配置邏輯中被讀寫(xiě)。ICAPE2的模塊結(jié)構(gòu)如圖2所示,模塊的端口描述見(jiàn)表2??梢酝ㄟ^(guò)ICAPE 可以向FPGA 發(fā)送IPROG 指令和熱啟動(dòng)的起始地址(Warm Boot Start Address,WBSTAR)等信息,進(jìn)而實(shí)現(xiàn)配置切換[3]。
圖2 內(nèi)部配置訪問(wèn)端口結(jié)構(gòu)
表2 端口描述
通過(guò)ICAPE2 傳輸重加載命令必須在一次成功的配置之后。命令序列為傳輸同步字,傳輸熱啟動(dòng)起始地址和傳輸重加載命令。值得注意的是,為了保證ICAPE2 收發(fā)正確的指令,實(shí)際傳送的每一個(gè)收發(fā)的命令和指令必須遵循SelectMAP 數(shù)據(jù)順序。SelectMAP 數(shù)據(jù)順序是將每一個(gè)指令都按照字節(jié)劃分,劃分后每一個(gè)字節(jié)的數(shù)據(jù)都按照比特位翻轉(zhuǎn),保證配置文件成功加載到FPGA 中[4]。表3 為實(shí)現(xiàn)用戶自定義遠(yuǎn)程更新的一次成功加載的比特流序列,列出了配置數(shù)據(jù)和按字節(jié)翻轉(zhuǎn)后的配置數(shù)據(jù)。
在發(fā)送重加載指令之前,需要對(duì)ICAPE2 進(jìn)行預(yù)配置。在收到外部控制重加載的觸發(fā)信號(hào)后,第一個(gè)時(shí)鐘周期將ICAPE2 的寫(xiě)信號(hào)和片選信號(hào)置高電平,在第二個(gè)周期再將寫(xiě)信號(hào)置低電平,片選信號(hào)置高電平,第三個(gè)周期將寫(xiě)信號(hào)置低電平,片選信號(hào)也置低電平。隨后,在接下來(lái)的8個(gè)時(shí)鐘周期里,將表3 中指令隊(duì)列中的控制命令通過(guò)狀態(tài)機(jī)逐一發(fā)出,實(shí)現(xiàn)一次重加載。
在基于Artix-7 與SPI Flash 的硬件平臺(tái)上完成用戶自定義切換更新的設(shè)計(jì)實(shí)現(xiàn),SPI Flash 的型號(hào)為Micron 公司的N25Q128A,容量128 MB。觸發(fā)重加載的信號(hào)通過(guò)硬件上按鈕的方式實(shí)現(xiàn)。實(shí)際的微小衛(wèi)星在軌工作時(shí),可以通過(guò)內(nèi)總線的方式訪問(wèn)FPGA,實(shí)現(xiàn)對(duì)重加載過(guò)程的控制。在SPI Flash 中存放兩段程序,第一段比特流起始于基地址,第二段比特流從地址00400000 開(kāi)始,將兩段.bit 文件合并生成.mcs 文件并下載到SPI Flash 中。在第一段程序加載成功后,通過(guò)按鈕觸發(fā)狀態(tài)機(jī)的運(yùn)行,向ICAPE2 中寫(xiě)入控制命令,從而成功轉(zhuǎn)入第二段程序的加載;第二段程序加載成功后,再通過(guò)一次按鈕觸發(fā),狀態(tài)機(jī)開(kāi)始運(yùn)行,從而能夠回到基地址加載第一段程序。實(shí)驗(yàn)完成了在不同模式下自由切換的目的,用戶可以通過(guò)修改WBSTAR 中的內(nèi)容自由切換加載地址,完成不同模式下的任意切換。圖3 為用戶自定義切換更新方案的加載流程[5]。
用戶自定義切換更新方案需要在一次成功的加載完成后完成切換,該方案的更新手段更加靈活,用戶自由度更高,更加適用于微小衛(wèi)星在軌更新的應(yīng)用場(chǎng)景。
3 種FPGA 遠(yuǎn)程配置方案的綜合比較如表4 所示??梢?jiàn),相較于FPGA 直接讀寫(xiě)更新FLASH 和雙鏡像更新方案,用戶自定義切換的更新方案更加適合于微小衛(wèi)星在軌更新的應(yīng)用場(chǎng)景。
圖3 用戶自定義切換更新方案的加載流程
表4 3 種FPGA 遠(yuǎn)程配置方案比較
本文通過(guò)對(duì)FPGA 直接讀寫(xiě)更新FLASH、雙鏡像更新和用戶自定義切換更新3 種FPGA 的遠(yuǎn)程配置方案的論述,闡述了FPGA 直接讀寫(xiě)更新FLASH和雙鏡像更新方案用于微小衛(wèi)星遠(yuǎn)程更新場(chǎng)景的不足,并基于Artix-7 與SPI Flash 的硬件平臺(tái)完成用戶自定義切換更新的設(shè)計(jì)實(shí)現(xiàn)。實(shí)驗(yàn)結(jié)果表明,用戶自定義切換的更新方案更加適用于微小衛(wèi)星在軌更新的應(yīng)用場(chǎng)景。