周 駿,宋 凱,沈 洋,丁 遜
(中國船舶集團(tuán)有限公司第八研究院,南京 211153)
近年來FPGA遠(yuǎn)程更新多采用ARM、CPLD等微處理器輔助方式實(shí)現(xiàn)[1-4],上位機(jī)通過網(wǎng)絡(luò)通信接口將新程序發(fā)送給微處理器,并由微處理器寫入非易失性存儲器中。FPGA配置的加載由微處理器通過I/O口模擬FPGA配置信號時序,將新程序加載到FPGA中,完成更新。在雷達(dá)應(yīng)用中,F(xiàn)PGA承擔(dān)復(fù)雜的信號處理算法,需要大量邏輯實(shí)現(xiàn),將遠(yuǎn)程更新邏輯與用戶業(yè)務(wù)邏輯耦合在一起會大量占用業(yè)務(wù)可使用的邏輯資源。本文提出一種基于重構(gòu)的FPGA遠(yuǎn)程更新方法,將Flash芯片分成遠(yuǎn)程更新程序區(qū)域和用戶業(yè)務(wù)邏輯區(qū)域,通過ICAP原語與IPROG命令實(shí)現(xiàn)遠(yuǎn)程更新程序和用戶業(yè)務(wù)邏輯的跳轉(zhuǎn)加載。在遠(yuǎn)程更新程序中完成Flash用戶業(yè)務(wù)邏輯區(qū)域配置文件的更新與維護(hù),在完成更新后,跳轉(zhuǎn)至用戶業(yè)務(wù)邏輯,實(shí)現(xiàn)不斷電遠(yuǎn)程更新程序的目的。
基于重構(gòu)的FPGA遠(yuǎn)程更新功能依靠網(wǎng)絡(luò)通信功能和FPGA的MultiBoot能力[5],其中MultiBoot功能是指FPGA在不斷電的情況下,可以重新加載Flash中不同地址的配置文件,實(shí)現(xiàn)FPGA整片邏輯重構(gòu)。將Flash按照最大配置文件大小分成用戶業(yè)務(wù)邏輯區(qū)域和遠(yuǎn)程更新邏輯區(qū)域兩個區(qū)域:前者存儲用戶業(yè)務(wù)程序,后者存儲遠(yuǎn)程更新程序。所有配置程序均包含重構(gòu)模塊,重構(gòu)模塊通過將配置區(qū)域Flash地址寫入ICAP原語并發(fā)送IPROG命令的方法,實(shí)現(xiàn)FPGA整片邏輯重構(gòu)。
遠(yuǎn)程更新程序邏輯由重構(gòu)模塊、MicroBlaze系統(tǒng)以及運(yùn)行于Microblaze系統(tǒng)上的嵌入式程序構(gòu)成,可采用TCP/IP協(xié)議接收上位機(jī)傳輸?shù)腇PGA新配置,并寫入Flash用戶業(yè)務(wù)邏輯區(qū)域,實(shí)現(xiàn)配置文件的遠(yuǎn)程更新,完成后再重構(gòu)加載用戶業(yè)務(wù)程序即可。由圖1所示的工作原理可以看出,F(xiàn)PGA通過網(wǎng)絡(luò)接口模塊和一個簡單的狀態(tài)機(jī)以及ICAP原語完成用戶業(yè)務(wù)程序和遠(yuǎn)程更新程序的切換,由于兩個配置邏輯文件完全獨(dú)立,可以使產(chǎn)品具備遠(yuǎn)程更新功能的同時不占用用戶業(yè)務(wù)邏輯資源。
圖1 遠(yuǎn)程更新工作原理框圖
2.1.1 硬件設(shè)計
為了滿足低成本、小型化需求,系統(tǒng)硬件采用單片F(xiàn)PGA處理模塊、Flash芯片、網(wǎng)絡(luò)芯片構(gòu)成,其硬件框如圖2所示。FPGA選用Xilinx公司的Virtex 6芯片,該芯片有充足的邏輯資源、DSP資源和RAM資源,滿足導(dǎo)航雷達(dá)復(fù)雜信號處理的需求,同時該芯片內(nèi)置專用加載模塊,支持MultiBoot功能。網(wǎng)絡(luò)接口芯片采用88E1111,F(xiàn)lash選擇Mircon公司的JS28F512P30,存儲64 MB,滿足存儲兩個bin文件的需求。在本系統(tǒng)中,遠(yuǎn)程更新邏輯與用戶業(yè)務(wù)邏輯共用相同網(wǎng)絡(luò)通信鏈路,避免了網(wǎng)絡(luò)交換芯片的使用。
圖2 遠(yuǎn)程更新硬件框圖
2.1.2 嵌入式軟核設(shè)計
遠(yuǎn)程更新邏輯需要實(shí)現(xiàn)網(wǎng)絡(luò)協(xié)議通信及Flash芯片控制,系統(tǒng)采用構(gòu)建MicroBlaze嵌入式軟核來替代傳統(tǒng)方法中的ARM芯片。MicroBlaze系統(tǒng)設(shè)計如圖3所示,外設(shè)方面包括網(wǎng)絡(luò)接口模塊、Flash控制模塊、定時模塊、調(diào)試模塊、中斷管理模塊、存儲模塊等,其中由于本系統(tǒng)無DDR3芯片,為了給嵌入式程序提供足夠的運(yùn)行空間,通過AXI總線將一個片內(nèi)BlockRAM模塊連接到MicroBlaze的M_AXI_DC和M_AXI_IC端口充當(dāng)緩存。
圖3 遠(yuǎn)程更新MicroBlaze系統(tǒng)框圖
2.2.1 重構(gòu)模塊
用戶業(yè)務(wù)邏輯和遠(yuǎn)程更新邏輯均有重構(gòu)模塊,該模塊利用FPGA的Multiboot功能可以不斷電加載Flash中不同區(qū)域FPGA配置文件,完成整片F(xiàn)PGA重構(gòu)。當(dāng)收到重構(gòu)跳轉(zhuǎn)命令后,重構(gòu)模塊狀態(tài)機(jī)向ICAP原語寫入內(nèi)部加載邏輯指令序列,將重構(gòu)區(qū)域Flash地址填入加載起始地址寄存器(WBSTAR)中,并寫入IPROG控制指令完成重構(gòu)加載。
重構(gòu)跳轉(zhuǎn)邏輯如圖4所示。設(shè)備上電時,F(xiàn)PGA默認(rèn)加載遠(yuǎn)程更新程序,如果在一定時間內(nèi)無法連接上位機(jī),則跳轉(zhuǎn)至用戶業(yè)務(wù)程序,否則等待上位機(jī)操作;當(dāng)FPGA跳轉(zhuǎn)至用戶業(yè)務(wù)程序后,如果接收網(wǎng)絡(luò)重構(gòu)命令,通過重構(gòu)模塊將遠(yuǎn)程更新邏輯區(qū)域的Flash地址寫入ICAP原語,并發(fā)送IPROG命令,F(xiàn)PGA將從遠(yuǎn)程更新邏輯區(qū)域地址開始加載遠(yuǎn)程更新邏輯,實(shí)現(xiàn)FPGA由用戶業(yè)務(wù)邏輯向遠(yuǎn)程更新邏輯的重構(gòu)。當(dāng)FPGA重構(gòu)為遠(yuǎn)程更新邏輯時,通過TCP/IP協(xié)議連接上位機(jī)服務(wù)器,接收由上位機(jī)發(fā)送的新用戶業(yè)務(wù)邏輯bin文件數(shù)據(jù)流,寫入用戶業(yè)務(wù)邏輯區(qū)域,實(shí)現(xiàn)遠(yuǎn)程更新功能。當(dāng)完成更新時,遠(yuǎn)程更新邏輯將再次利用ICAP原語,使FPGA從用戶業(yè)務(wù)區(qū)域加載更新后的程序,完成不斷電用戶業(yè)務(wù)程序更新。
圖4 重構(gòu)模塊原理流程圖
2.2.2 嵌入式內(nèi)核程序設(shè)計
嵌入式內(nèi)核程序運(yùn)行于FPGA構(gòu)建的MicroBlaze嵌入式軟核內(nèi),其設(shè)計基于FreeRTOS操作系統(tǒng),并運(yùn)行LWIP網(wǎng)絡(luò)協(xié)議棧,實(shí)現(xiàn)TCP/IP通信。嵌入式內(nèi)核程序流程如圖5所示:首先完成Flash操作庫和LWIP網(wǎng)絡(luò)庫初始化,然后連接指定IP的TCP服務(wù)器。如果在一定時間內(nèi)無法連接,則對重構(gòu)模塊發(fā)送命令跳轉(zhuǎn)至用戶業(yè)務(wù)模塊。如果連接成功,將等待上位機(jī)操作。當(dāng)需要更新程序時,上位機(jī)軟件通過TCP協(xié)議發(fā)送新的用戶業(yè)務(wù)程序數(shù)據(jù)包給嵌入式內(nèi)核程序,嵌入式內(nèi)核程序接收數(shù)據(jù)包,并寫入Flash中的用戶業(yè)務(wù)邏輯區(qū)域,將接收到的數(shù)據(jù)包CRC32校驗(yàn)值和寫入的Flash數(shù)據(jù)包總大小返回給上位機(jī)程序。當(dāng)上位機(jī)完成新程序文件發(fā)送,并接收到正確的CRC32校驗(yàn)值和數(shù)據(jù)包大小時,認(rèn)為更新完成,發(fā)送重構(gòu)命令給嵌入式內(nèi)核程序,實(shí)現(xiàn)新用戶業(yè)務(wù)程序的加載。
2.2.3 上位機(jī)程序設(shè)計
上位機(jī)采用MFC設(shè)計,通過TCP/IP協(xié)議與嵌入式內(nèi)核程序進(jìn)行通信,主要完成創(chuàng)建更新TCP服務(wù)端,UDP重構(gòu)命令發(fā)送,用戶文件讀取等功能。當(dāng)FPGA重構(gòu)為遠(yuǎn)程更新邏輯時,嵌入式內(nèi)核程序?qū)⒅鲃舆B接上位機(jī)的TCP服務(wù)端。在嵌入式內(nèi)核程序連接服務(wù)器成功后,上位機(jī)讀取本地用戶更新文件,并發(fā)送給嵌入式內(nèi)核程序?qū)崿F(xiàn)更新。更新完成后,上位機(jī)發(fā)送UDP重構(gòu)命令,實(shí)現(xiàn)FPGA由遠(yuǎn)程更新邏輯跳轉(zhuǎn)至用戶業(yè)務(wù)邏輯;當(dāng)FPGA重構(gòu)為用戶業(yè)務(wù)邏輯時,上位機(jī)軟件發(fā)送UDP重構(gòu)命令,F(xiàn)PGA收到命令后重構(gòu)為遠(yuǎn)程更新邏輯,并實(shí)現(xiàn)用戶業(yè)務(wù)邏輯更新。
圖5 嵌入式內(nèi)核程序流程圖
2.2.4 更新失敗處理
本文方法將Flash區(qū)域劃分為用戶業(yè)務(wù)邏輯區(qū)域和遠(yuǎn)程更新邏輯區(qū)域,其中后者起始地址為0,使FPGA上電默認(rèn)啟動區(qū)域。當(dāng)對用戶業(yè)務(wù)邏輯區(qū)域進(jìn)行更新時,系統(tǒng)出現(xiàn)斷電、斷網(wǎng)等突發(fā)情況,導(dǎo)致用戶業(yè)務(wù)邏輯更新失敗,此時并沒有操作遠(yuǎn)程更新邏輯區(qū)域的配置文件;當(dāng)系統(tǒng)重新上電時,F(xiàn)PGA默認(rèn)加載遠(yuǎn)程更新邏輯,可以繼續(xù)實(shí)現(xiàn)對用戶業(yè)務(wù)邏輯的更新,可見采用遠(yuǎn)程更新邏輯和用戶業(yè)務(wù)邏輯分離設(shè)計的方式有較高的可靠性。
為了驗(yàn)證本文方法,以一型導(dǎo)航雷達(dá)信號處理板卡為硬件平臺,該平臺采用Xilinx V6芯片,編寫了遠(yuǎn)程更新程序和雷達(dá)信號處理程序。由于系統(tǒng)的小型化,沒有采用DDR芯片,遠(yuǎn)程更新程序使用FPGA芯片內(nèi)部Block Ram作為MicroBlaze程序運(yùn)存,消耗17 203個寄存器、17 316個查找表以及296個RAMB36E1,其中使用的存儲資源約占整個芯片存儲資源的27%,而用戶業(yè)務(wù)程序中使用的重構(gòu)模塊僅使用了31個寄存器和70個查找表??梢钥闯觯疚姆椒ù蟠鬁p少了遠(yuǎn)程更新功能對用戶業(yè)務(wù)邏輯的占用。采用本文方法對15 MB大小的bin文件進(jìn)行遠(yuǎn)程更新僅需40 s,較采用JTAG下載線方式有明顯優(yōu)勢。由于采用TCP協(xié)議傳輸文件流時,協(xié)議本身具備校驗(yàn)和重發(fā)機(jī)制,因此本文方法可靠性較高,能為采用單片F(xiàn)PGA的小型化系統(tǒng)提供遠(yuǎn)程更新功能。
本文基于重構(gòu)的FPGA遠(yuǎn)程更新方法利用FPGA的MultiBoot功能,實(shí)現(xiàn)遠(yuǎn)程更新程序和用戶業(yè)務(wù)程序的分離式設(shè)計,減小遠(yuǎn)程更新功能對資源的占用,不需要設(shè)計額外微處理芯片電路進(jìn)行輔助,同時與用戶業(yè)務(wù)程序共用相同的網(wǎng)絡(luò)鏈路,利于設(shè)備小型化、低成本設(shè)計。目前該方法已應(yīng)用于雷達(dá)產(chǎn)品,為其提供了穩(wěn)定可靠的遠(yuǎn)程更新功能。