李 霄,徐思遠(yuǎn),胡瑾賢
(中國船舶集團(tuán)有限公司第七二三研究所,江蘇 揚(yáng)州 225101)
現(xiàn)場可編程門陣列(FPGA)以其優(yōu)越的性能在電子對抗裝備中廣泛應(yīng)用,尤其在多通道數(shù)字接收機(jī)、波束合成陣列等復(fù)雜設(shè)備中,FPGA芯片的個(gè)數(shù)通常達(dá)數(shù)十甚至上百個(gè)。隨著高質(zhì)量發(fā)展理念的不斷推進(jìn),對FPGA進(jìn)行升級和維護(hù)的頻率越來越高[1-2]。使用現(xiàn)有Platform Cable USB調(diào)試器通過JTAG接口進(jìn)行現(xiàn)場升級的調(diào)試方式,僅升級1片F(xiàn)PGA就需要0.5 h左右,故更新維護(hù)具有大量FPGA的設(shè)備通常以天計(jì)算,非常耗時(shí)[3]。不僅如此,當(dāng)產(chǎn)品已經(jīng)列裝于集成大系統(tǒng)中時(shí),通常需要先進(jìn)行拆解,定位調(diào)試接口,再配合不同的轉(zhuǎn)接頭,通過多次拔插調(diào)試器的方式對每片F(xiàn)PGA依次完成升級,耗費(fèi)大量人力物力;并且,當(dāng)設(shè)備被極端溫度或震動(dòng)環(huán)境等因素影響時(shí),長時(shí)間的配置過程會(huì)導(dǎo)致配置失敗的概率升高,降低其升級可靠性[4]。
為了提高調(diào)試和試驗(yàn)效率,降低升級維護(hù)成本,提高系統(tǒng)維護(hù)的可靠性,本文基于FPGA的配置原理,研究了遠(yuǎn)程在線升級Multiboot的方法,提出了FLASH配置區(qū)域的自定義分區(qū)規(guī)劃方法。該方法不需要多次現(xiàn)場拔插JTAG調(diào)試接口,僅通過1根網(wǎng)線就能實(shí)現(xiàn)基于千兆以太網(wǎng)的所有FPGA設(shè)備的遠(yuǎn)程在線快速升級,降低了FPGA分批多次配置的復(fù)雜度,大量節(jié)省FPGA升級配置時(shí)間及成本。該方法同時(shí)具有出錯(cuò)后及時(shí)回退機(jī)制,提高了FPGA升級配置的安全性。
整個(gè)系統(tǒng)框圖如圖1所示,電腦端Multiboot升級平臺與各FPGA通過網(wǎng)絡(luò)交換機(jī)相連,通過不同的IP實(shí)現(xiàn)遠(yuǎn)程在線升級Multiboot的功能。其中FLASH以串行外固設(shè)備接口(SPI)配置模式與FPGA相連,FPGA收到網(wǎng)絡(luò)數(shù)據(jù)包后解析給Microblaze。Microblaze基于lwip協(xié)議棧,每塊FPGA為獨(dú)立的IP,可對多個(gè)不同的IP匹配不同的配置文件。lwip協(xié)議棧是一個(gè)輕量級開源TCP/IP協(xié)議棧,FPGA片內(nèi)資源占用約1 kB隨機(jī)存取存儲器(RAM)和40 kB 只讀存儲器(ROM),無需操作系統(tǒng)支持,適用于各類主流FPGA平臺。在PC端依次將鏡像通過不同的IP地址發(fā)出,各FPGA分別解析對應(yīng)IP的配置文件,就可以通過1根網(wǎng)線遠(yuǎn)程完成對所有在線FPGA的一鍵配置升級工作。尤其針對任意一片F(xiàn)PGA,其配置操作通過網(wǎng)絡(luò)直接實(shí)現(xiàn),而不是Platform Cable USB調(diào)試器,這種機(jī)制大大簡化了配置鏈路,實(shí)測1塊FPGA的升級配置只需數(shù)分鐘,配置速度大幅提升。
圖1 硬件系統(tǒng)框圖
整體流程如圖2所示,FLASH分為5個(gè)部分:Golden區(qū)、定時(shí)器1、Update區(qū)、定時(shí)器2、版本號區(qū),用Tcl腳本把這4個(gè)部分整合到1個(gè)mcs文件里。FLASH里該5個(gè)區(qū)的各個(gè)地址排布如表1所示。
表1 地址排布
圖2 Multiboot、回退機(jī)制、FLASH存儲結(jié)構(gòu)、配置步驟示意圖
Golden區(qū):只包含基礎(chǔ)的遠(yuǎn)程升級功能,當(dāng)Update區(qū)數(shù)據(jù)出錯(cuò)時(shí),FPGA加載此區(qū)鏡像保證系統(tǒng)安全。
定時(shí)器1:設(shè)置尋找Update鏡像SYNC字的最長時(shí)間。如果在定時(shí)器1計(jì)時(shí)內(nèi)找到完整的Update鏡像,則Update鏡像正常加載。否則,觸發(fā)回退機(jī)制,FPGA加載Golden鏡像。
Update區(qū):具有完整功能并帶遠(yuǎn)程升級功能的鏡像,每次升級系統(tǒng)時(shí)對當(dāng)前區(qū)進(jìn)行更新數(shù)據(jù)。
定時(shí)器2:設(shè)置加載完整Update鏡像的最長時(shí)間。如果在定時(shí)器2計(jì)時(shí)內(nèi)加載了一個(gè)完整的Update鏡像,則忽略;否則定時(shí)器2觸發(fā)回退機(jī)制,FPGA加載Golden鏡像。
版本號區(qū):存放當(dāng)前程序的版本號,用于版本控制。
第1次燒寫用JTAG接口將上述5個(gè)部分全部寫入,后續(xù)通過網(wǎng)口更新Update區(qū),其中其他FLASH地址均被保護(hù)。
在golden工程的xdc約束文件由以下語句使能Multiboot功能:
set_property BITSTREAM.CONFIG.NEXT_CONFIG_ADDR 0x009FFC00 [current_design]
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
set_property BITSTREAM.CONFIG.CONFIGFALLBACK ENABLE [current_design]
在update工程的xdc約束文件由以下語句使能Multiboot功能:
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
set_property BITSTREAM.CONFIG.CONFIGFALLBACK ENABLE [current_design]
一個(gè)內(nèi)部產(chǎn)生的脈沖(IPROG)由NEXT_CONFIG_ADDR觸發(fā),它設(shè)置了配置跳轉(zhuǎn)到update鏡像,該鏡像的地址保存在golden鏡像的WBSTAR(Warm Boot Start Address)寄存器。其中0x009FFC00是本設(shè)計(jì)的定時(shí)器1的地址,也就是WBSTAR寄存器值,可根據(jù)實(shí)際情況設(shè)置。
首先生成Golden鏡像,它只包括最基礎(chǔ)的遠(yuǎn)程升級功能。然后根據(jù)項(xiàng)目的功能需求生成Update鏡像,用Xilinx的腳本工具生成Timer1和Timer2鏡像,在VIVADO里用TCL命令生成最終的mcs文件,然后用JTAG燒錄,具體命令如下:
write_cfgmem -force -format mcs -interface SPIX4 -size 64 -loadbit "up 0x00000000 golden.bit up 0x009FFBFF update.bit"-loaddata “up 0x009FFC00 timer1.bin up 0x009FFFFF version.bin up 0x02C00000 timer2.bin” golden_update_full.mcs
具體流程如下:
(1) PFGA在flash地址0處加載Golden鏡像,內(nèi)含的IPROG指令使得跳轉(zhuǎn)到儲存在WBSTAR寄存器里的地址,也就是定時(shí)器1的地址。
(2) 定時(shí)器1在較短一段時(shí)間內(nèi)開始計(jì)時(shí),尋找Update鏡像的SYNC字。
(3) 如果在定時(shí)器1計(jì)時(shí)內(nèi)找到完整的Update鏡像,則Update鏡像正常加載;如果發(fā)現(xiàn)出錯(cuò)的或丟失的數(shù)據(jù),例如Update鏡像的起始處沒有SYNC字(AA995566),FPGA忽略數(shù)據(jù)或命令,開始一直往后面的FLASH尋找有效的SYNC字,直到定時(shí)器1超時(shí),此時(shí)觸發(fā)回退機(jī)制,FPGA加載Golden鏡像。
(4) 如果在定時(shí)器2計(jì)時(shí)內(nèi)加載了一個(gè)完整的Update鏡像,則忽略;如果在定時(shí)器2計(jì)時(shí)內(nèi)發(fā)現(xiàn)Update區(qū)的鏡像的中間或最后的數(shù)據(jù)出現(xiàn)破損,這種情況下FPGA沒有完整加載Update鏡像,定時(shí)器2觸發(fā)回退機(jī)制,FPGA加載Golden鏡像。
如圖3所示,上位機(jī)升級軟件通過用戶數(shù)據(jù)協(xié)議(UDP)與FPGA通訊。流程如圖4所示,上位機(jī)發(fā)送FPGA擦除幀,當(dāng)FPGA執(zhí)行命令擦除FLASH成功后,回復(fù)上位機(jī)擦除成功確認(rèn)幀,上位機(jī)開始下發(fā)要升級的數(shù)據(jù)幀,數(shù)據(jù)長度默認(rèn)1024字節(jié)。FPGA收到數(shù)據(jù)幀后首先檢查序列號,判斷是否有丟包、循環(huán)冗余校驗(yàn)(CRC)校驗(yàn)錯(cuò)誤等問題,然后回復(fù)上位機(jī)數(shù)據(jù)確認(rèn)幀。如果數(shù)據(jù)有誤,上位機(jī)就重發(fā)這幀數(shù)據(jù),否則上位機(jī)繼續(xù)發(fā)下一幀。如果連續(xù)丟包3次,說明系統(tǒng)工作異常,則終止本次升級。當(dāng)FPGA正常接收數(shù)據(jù)后會(huì)把數(shù)據(jù)寫進(jìn)FLASH,并對數(shù)據(jù)進(jìn)行回讀,確保寫入數(shù)據(jù)的正確性。當(dāng)把所有要升級的數(shù)據(jù)完整無誤寫入FLASH后,FPGA給上位機(jī)上報(bào)升級成功確認(rèn)幀,升級結(jié)束。
圖3 Multiboot升級平臺
圖4 上位機(jī)流程圖
使用不同大小的mcs可執(zhí)行文件,對1片型號為xc7vx690tffg1926的Xilinx Virtex-7系列FPGA開發(fā)板進(jìn)行升級速度測試,FLASH類型為mx25u6435f。常規(guī)方法升級時(shí)間與本文的升級方法速度對比結(jié)果繪制在圖5中。
圖5 常規(guī)方法升級時(shí)間與本文的升級方法速度對比
配置大小為10 MB的文件,使用本文方法需要6 min,而常規(guī)方法需要20 min;配置大小為30 MB的文件,使用本文方法只需要12 min,而常規(guī)方法需要接近43 min。本文的遠(yuǎn)程快速升級方式比常規(guī)Platform Cable USB調(diào)試器配置方法升級速度提高了3倍以上。
考慮實(shí)際升級過程,常規(guī)方法在FPGA板卡集成大系統(tǒng)時(shí),對其進(jìn)行拆解、JTAG接口定位、更換調(diào)試轉(zhuǎn)接頭和拔插Platform Cable USB調(diào)試器等操作的時(shí)間,本文方法亦可為設(shè)備維護(hù)人員提供更高效的遠(yuǎn)程在線升級環(huán)境,大大提高了FPGA的升級速度。
系統(tǒng)通過讀取BOOT_STATUS寄存器各狀態(tài)位的狀態(tài)值判定升級狀態(tài)是否正常。圖6中以ERROR結(jié)尾的狀態(tài)位值均為0,且STATUS_VALID和INTERNAL_PROG值為1,表明成功跳轉(zhuǎn)到Update鏡像,配置正確。
若發(fā)生錯(cuò)誤,錯(cuò)誤類型對應(yīng)ERROR結(jié)尾的狀態(tài)位被拉高,觸發(fā)回退機(jī)制。觸發(fā)回退機(jī)制的錯(cuò)誤主要有:IDCODE錯(cuò)誤、CRC錯(cuò)誤、看門狗定時(shí)器超時(shí)錯(cuò)誤等,下面對其測試方法進(jìn)行說明。
(1) IDCODE錯(cuò)誤
在生成的可執(zhí)行文件中找到配置數(shù)據(jù)字0x30018001,0x30018001為IDCODE寄存器指令,后接的數(shù)據(jù)字為IDCODE,將Update鏡像中的IDCODE修改成錯(cuò)誤的數(shù)據(jù),用網(wǎng)絡(luò)加載損壞的Update鏡像。
(2) CRC錯(cuò)誤
在重設(shè)CRC指令和CRC指令之間手動(dòng)修改數(shù)據(jù),制造CRC錯(cuò)誤,驗(yàn)證配置的正確性,用網(wǎng)絡(luò)加載損壞的Update鏡像。
(3) 看門狗定時(shí)器超時(shí)錯(cuò)誤
將Update鏡像起始的一個(gè)扇區(qū)的FLASH擦除,導(dǎo)致FPGA找不到Update鏡像,產(chǎn)生看門狗定時(shí)器超時(shí),用網(wǎng)絡(luò)加載損壞的Update鏡像。
下面模擬看門狗定時(shí)器超時(shí)錯(cuò)誤,測試驗(yàn)證回退機(jī)制。
配置錯(cuò)誤發(fā)生后,PC端BOOT_STATUS寄存器的狀態(tài)如圖7所示。與圖6對比分析:FALLBACK為1表明Update鏡像出錯(cuò),觸發(fā)了回退機(jī)制;WATCHDOG_TIMEOUT_ERROR值為1指明錯(cuò)誤原因?yàn)榭撮T狗定時(shí)器超時(shí)錯(cuò)誤;STATUS_VALID和INTERNAL_PROG為1表明回退機(jī)制成功啟動(dòng)并配置了Golden安全鏡像,配置文件回退成功,FPGA以升級前的安全版本繼續(xù)運(yùn)行。
圖7 Multiboot回退到Golden鏡像
另外,在2.3節(jié)圖3中,通過上位機(jī)軟件中的版本號查詢,可直接獲取當(dāng)前的程序版本。
本文基于FPGA可執(zhí)行文件,通過Multiboot技術(shù),對FLASH芯片進(jìn)行自定義分區(qū)規(guī)劃,并分別存放Golden、Timer1、Update以及Timer2。其中,Timer1和Timer2是看門狗,保證燒寫途中斷電或CRC校驗(yàn)錯(cuò)誤導(dǎo)致加載失敗后能返回Golden,用戶能夠重新升級,Golden是具有最基礎(chǔ)的遠(yuǎn)程升級功能的鏡像,Update是用戶根據(jù)項(xiàng)目需求生成的鏡像且具有遠(yuǎn)程升級功能。電腦端Multiboot升級平臺在升級下載時(shí)與FPGA同時(shí)檢查序列號,判斷是否有丟包、CRC校驗(yàn)錯(cuò)誤等問題。本文方法采用雙備份方式,安全可靠,確保寫入數(shù)據(jù)的正確性。
本文為復(fù)雜電子對抗系統(tǒng)維護(hù)過程中大量FPGA的批量升級需求提供了一種解決方法。該方法不需要多次現(xiàn)場拔插設(shè)備JTAG調(diào)試接口,利用設(shè)備自身通信接口進(jìn)行遠(yuǎn)程在線快速升級,從FPGA配置機(jī)制上降低了配置復(fù)雜度,具備出錯(cuò)后及時(shí)回退機(jī)制。本文方法能夠節(jié)省FPGA升級配置時(shí)間及成本,降低FPGA分批多次配置的復(fù)雜度,提高FPGA升級配置的安全性,可為平日或戰(zhàn)時(shí)設(shè)備維護(hù)升級爭取大量寶貴時(shí)間,亦對通用硬件架構(gòu)的軟件可重定義提供了快速實(shí)現(xiàn)途徑,具有一定的工程實(shí)用價(jià)值。