康志杰
摘要:現(xiàn)場可編程門陣列(FPGA)廣泛應(yīng)用在通信及信息處理等眾多領(lǐng)域,傳統(tǒng)的基于本地開發(fā)環(huán)境的FPGA升級方式無法滿足工程現(xiàn)場維護(hù)的需求,基于以太網(wǎng)傳輸方式設(shè)計(jì)了FPGA遠(yuǎn)程升級系統(tǒng)方案,實(shí)現(xiàn)對FPGA配置文件的更新,為產(chǎn)品的升級維護(hù)提供了便利。升級過程中的異常情況,通過分析數(shù)據(jù)處理流程和引發(fā)常見問題的異常情況,分別設(shè)計(jì)了不同的異常處理機(jī)制,解決了遠(yuǎn)程升級失敗的問題。對異常處理機(jī)制進(jìn)行了充分測試,驗(yàn)證了設(shè)計(jì)的可靠性。
關(guān)鍵詞:現(xiàn)場可編程門陣列;遠(yuǎn)程升級;可靠性
中圖分類號:TP393文獻(xiàn)標(biāo)志碼:A文章編號:1008-1739(2020)08-61-4

0引言
現(xiàn)場可編程門陣列(Field Programmable Gate Array,F(xiàn)PGA)具有并行處理架構(gòu),高速數(shù)據(jù)處理能力遠(yuǎn)優(yōu)于一般CPU,因而在航空航天、醫(yī)療設(shè)備、通信、汽車及工控等領(lǐng)域得到了廣泛應(yīng)用[1]。而FPGA的配置文件升級維護(hù),通常需要工程人員到現(xiàn)場利用JTAG進(jìn)行升級。當(dāng)待升級設(shè)備和技術(shù)人員處在不同地點(diǎn)時(shí),傳統(tǒng)的升級方式將造成時(shí)間和人力的浪費(fèi)。而遠(yuǎn)程在線升級技術(shù),可以利用以太網(wǎng)實(shí)現(xiàn)設(shè)備升級,不受人機(jī)地點(diǎn)的限制。此外,基于以太網(wǎng)的升級方式可以同時(shí)進(jìn)行大批量的設(shè)備升級。目前針對遠(yuǎn)程升級的方案,主要有利用FPGA內(nèi)部邏輯更新Flash[2-3]和利用CPU直接更新Flash[4]。通常情況下,遠(yuǎn)程升級成功的關(guān)鍵在于升級包數(shù)據(jù)準(zhǔn)確無誤地寫入Flash,在升級包數(shù)據(jù)傳輸過程中一旦發(fā)生斷電、傳輸錯(cuò)誤及CPU軟復(fù)位等異常,F(xiàn)lash中原有的配置文件完整性可能被破壞,這種情況下只能依賴JTAG重新下載配置文件。為規(guī)避這些異常帶來的風(fēng)險(xiǎn),本文針對CPU+FPGA架構(gòu)類型的板卡,提出了一種可靠的FPGA遠(yuǎn)程升級方案,已成功應(yīng)用在通信系統(tǒng)上。
1遠(yuǎn)程升級關(guān)鍵技術(shù)
對于CPU+FPGA架構(gòu)類型的板卡,在遠(yuǎn)程升級過程中需要解決CPU軟復(fù)位、板卡意外斷電及數(shù)據(jù)傳輸錯(cuò)誤等關(guān)鍵問題。
如果不做特殊處理,升級失敗就會導(dǎo)致FPGA無法加載,產(chǎn)生災(zāi)難性后果。一旦發(fā)生,只能拆開設(shè)備通過JTAG重新下載程序。針對這些問題,分別設(shè)計(jì)了不同的處理技術(shù)以實(shí)現(xiàn)升級的穩(wěn)定可靠。
1.1握手幀和傳輸狀態(tài)機(jī)技術(shù)
升級過程中,CPU可能在任意時(shí)刻軟復(fù)位,從而導(dǎo)致數(shù)據(jù)傳輸中斷。針對該情況,設(shè)計(jì)了CPU和FPGA握手幀格式,如圖1所示。

FPGA處理升級包的狀態(tài)機(jī),如圖2所示。

上述狀態(tài)機(jī)中設(shè)計(jì)了超時(shí)計(jì)數(shù)狀態(tài),用來處理CPU因復(fù)位導(dǎo)致的意外停發(fā)。在幀頭標(biāo)志字接收、配置地址長度字接收、rbf文件接收下發(fā)及校驗(yàn)結(jié)果接收等狀態(tài)時(shí),若在限定時(shí)間內(nèi)未接收到CPU的數(shù)據(jù),該狀態(tài)機(jī)將強(qiáng)制回到空閑狀態(tài),以等待下次升級。
1.2 Flash狀態(tài)字保護(hù)技術(shù)
意外斷電發(fā)生在FPGA訪問Flash期間,會對系統(tǒng)產(chǎn)生影響,其他時(shí)間斷電不會對系統(tǒng)產(chǎn)生任何影響,只需重新上電,系統(tǒng)即可恢復(fù)到升級前狀態(tài)。因此,需要對訪問Flash期間的意外斷電進(jìn)行保護(hù),升級過程中FPGA訪問Flash流程,如圖3所示。

在FPGA訪問Flash時(shí),首先擦除狀態(tài)字節(jié)(地址0x7FFFF),待訪問完畢后,重新在狀態(tài)字打上0xA5標(biāo)志,這樣任何時(shí)刻在訪問Flash時(shí)發(fā)生斷電,再次上電時(shí),因不滿足由出廠配置跳轉(zhuǎn)到用戶配置的條件,系統(tǒng)只停留在出廠配置運(yùn)行。出廠配置中包含升級功能,可重新啟動升級過程,該方法能有效避免斷電帶來的“災(zāi)難性”影響。
1.3數(shù)據(jù)傳輸保護(hù)技術(shù)
升級過程中,升級包字節(jié)傳輸錯(cuò)誤同樣會導(dǎo)致不可預(yù)知的程序功能異常,為保證整個(gè)鏈路數(shù)據(jù)正確傳輸,整個(gè)升級過程共包含3次校驗(yàn),有效保證了數(shù)據(jù)的正確傳輸。
第1次校驗(yàn):升級包由PC機(jī)下發(fā)到板卡的CPU,升級包內(nèi)包含MD5校驗(yàn)字節(jié),CPU在收到升級包后,同樣會進(jìn)行MD5值計(jì)算,計(jì)算所得結(jié)果與升級包內(nèi)MD5校驗(yàn)字節(jié)進(jìn)行比對,若一致,則認(rèn)為升級包正常接收,否則會提示升級失敗。該次校驗(yàn)保證了數(shù)據(jù)包從PC機(jī)到板卡CPU的正確傳輸。
第2次校驗(yàn):CPU與FPGA的握手幀CRC校驗(yàn),主要為了保證握手幀中用戶配置地址和升級包長度接收無誤。如果該部分字節(jié)錯(cuò)誤,可能造成Flash內(nèi)原始固化的出廠文件損壞或?qū)懭脲e(cuò)誤的用戶配置,這種情況下可能造成系統(tǒng)“變磚”。借助CRC校驗(yàn),有效避免了這種情況的發(fā)生。
第3次校驗(yàn):CPU下發(fā)的升級包和FPGA從Flash回讀的升級包進(jìn)行對比,完全一致后,CPU向上位機(jī)和FPGA分別發(fā)送升級成功標(biāo)志,這樣保證了要升級的程序正確寫到了Flash內(nèi)部,避免升級完成后程序功能出現(xiàn)異常。
2遠(yuǎn)程升級系統(tǒng)方案
2.1系統(tǒng)架構(gòu)
遠(yuǎn)程升級系統(tǒng)架構(gòu)如圖4所示。

升級文件經(jīng)由PC機(jī)、網(wǎng)線、CPU及FPGA傳輸?shù)紽lash配置芯片[5]。
2.2 CPU端處理框圖
PC機(jī)通過以太網(wǎng)與CPU進(jìn)行數(shù)據(jù)交互,CPU內(nèi)模塊處理流程圖,如圖5所示。

PC端上位機(jī)下發(fā)的升級包包含rbf文件(依賴于FPGA綜合工具生成)和隨路MD5校驗(yàn)值兩部分。CPU接收到升級包后提取rbf文件,計(jì)算MD5,與隨路MD5校驗(yàn)值比較,如果二者一致,則認(rèn)為CPU正確地接收了升級包。然后CPU與FPGA握手,提取rbf文件下發(fā)到FPGA中,等待FPGA從Flash回讀rbf文件進(jìn)行校驗(yàn),最后下發(fā)校驗(yàn)結(jié)果到FPGA并且上報(bào)到PC端。
2.3 FPGA端處理流程圖
FPGA端處理框圖如圖6所示。

各個(gè)模塊的功能如下:
①Flash管理模塊:負(fù)責(zé)接收升級數(shù)據(jù)包、升級完成后向上發(fā)送回讀數(shù)據(jù)包及升級完成后指導(dǎo)配置切換模塊切換配置文件。
②配置切換模塊:負(fù)責(zé)用戶配置和出廠配置的切換。
③用戶邏輯:為用戶自定義功能邏輯塊。
④UART_ASMI模塊:工作在50 MHz時(shí)鐘下,負(fù)責(zé)從串口接收數(shù)據(jù),串行轉(zhuǎn)并行后發(fā)送到ASMI_FIFO中,接收UART_FIFO發(fā)送過來的數(shù)據(jù)并行轉(zhuǎn)串行向上發(fā)送。
⑤ASMI_FIFO,UART_FIFO模塊:負(fù)責(zé)進(jìn)行時(shí)鐘域的轉(zhuǎn)換,UART_ASMI與FIFO交互時(shí)鐘為50 MHz,ASMI_CONTROL模塊與FIFO交互時(shí)鐘為10 MHz。
⑥ASMI_CONTROL:負(fù)責(zé)控制ASMI_UPDATE(ASMI_PARALLEL)核,向外部串行Flash寫入升級數(shù)據(jù),從Flash讀取升級數(shù)據(jù)包,擦除Flash等。
⑦ASMI_UPDATE_IP:訪問外部Flash的IP,該IP核直接控制Flash的讀寫。
⑧RU_CB及REMOTE_ UPDATE_IP:負(fù)責(zé)出廠配置文件和用戶配置文件的切換。
FPGA遠(yuǎn)程升級程序流程圖如圖7所示。

3 Flash地址空間及配置文件跳轉(zhuǎn)
FPGA升級完成后,能正常運(yùn)行的條件是:①Flash內(nèi)部按預(yù)設(shè)的地址空間存儲著正確的配置文件;②由出廠配置向用戶配置的跳轉(zhuǎn)關(guān)系成立。
3.1 Flash地址空間分配
Flash芯片內(nèi)部地址空間如圖8所示。

出廠配置文件(FAC)存儲在Flash存儲空間的前半部分,F(xiàn)AC內(nèi)包含升級功能及用戶基本功能。而用戶配置文件存放在0x40000~0x7FFFE的地址空間。0x7FFFF地址用來存儲狀態(tài)字,用來標(biāo)識用戶配置文件是否正確完好。
3.2配置文件跳轉(zhuǎn)
Flash內(nèi)配置文件跳轉(zhuǎn)關(guān)系如圖9所示。

板卡出廠情況下,F(xiàn)lash內(nèi)要固化出廠配置和用戶配置文件。板卡上電后,系統(tǒng)應(yīng)能正確檢測出用戶配置文件的正確與否,然后決定是否由出廠配置文件跳轉(zhuǎn)到用戶配置文件去執(zhí)行。
一旦Flash內(nèi)部存儲的出廠配置文件、用戶配置文件被破壞,配置文件將無法正常執(zhí)行,這種情況下只能依賴JTAG重新下載出廠配置文件。升級過程中的意外斷電和CPU軟復(fù)位,將會造成用戶配置文件被破壞。而數(shù)據(jù)傳輸錯(cuò)誤可能造成出廠配置文件、用戶配置文件被破壞。在用戶配置文件被破壞的條件下,仍然需要依賴出廠配置文件重新遠(yuǎn)程升級,實(shí)現(xiàn)新的用戶配置文件的寫入。因此,遠(yuǎn)程升級的關(guān)鍵技術(shù)在于:在意外斷電、數(shù)據(jù)傳輸錯(cuò)誤和CPU軟復(fù)位情況發(fā)生后,系統(tǒng)仍然能夠再次遠(yuǎn)程升級,而不是通過JTAG去下載。
4測試結(jié)果及分析
4.1測試環(huán)境
測試硬件環(huán)境為通信系統(tǒng)板卡,板載CPU是NXP的SOC芯片,F(xiàn)PGA是ALTERA的EP4C,上位機(jī)軟件是自研管理軟件。上位機(jī)能獲取FPGA正在運(yùn)行的配置文件版本號,從而能夠驗(yàn)證升級成功與否[6]。FPGA出廠配置文件版本號為V01,初始用戶配置文件版本號為V02,升級后的用戶配置文件版本號為V03。
4.2測試用例及結(jié)果
測試1:CPU意外軟復(fù)位對升級的影響
設(shè)計(jì)了4個(gè)時(shí)刻插入CPU軟復(fù)位,測試結(jié)果如表1所示。

通過測試,在CPU異常軟復(fù)位后,系統(tǒng)均能重新利用網(wǎng)絡(luò)進(jìn)行升級。其中,在測試用例4的測試情況下,板卡重上電后,由于用戶配置已被擦除,故只能執(zhí)行出廠配置。在出廠配置運(yùn)行時(shí),可以重新進(jìn)行升級。上述測試用例每個(gè)進(jìn)行100次測試,最終能100%升級成功。
測試2:板卡意外斷電對升級的影響
設(shè)計(jì)了2個(gè)測試用例測試升級過程中意外斷電的影響,測試結(jié)果如表2所示。

每個(gè)測試用例均測試100次,最終100%升級成功。測試結(jié)果表明,在系統(tǒng)升級過程中,因異常斷電導(dǎo)致的系統(tǒng)升級失敗,在重新上電后,能重新利用網(wǎng)絡(luò)進(jìn)行再次升級。
測試3:數(shù)據(jù)傳輸錯(cuò)誤對升級的影響
為測試對抗數(shù)據(jù)傳輸錯(cuò)誤的能力,對數(shù)據(jù)傳輸鏈路上部分字節(jié)進(jìn)行修改后,測試結(jié)果如表3所示。

當(dāng)握手幀出現(xiàn)錯(cuò)誤字節(jié)后,均無法成功握手。此外,故意修改FPGA從Flash回讀的配置文件,當(dāng)送到CPU校驗(yàn)時(shí),無法通過校驗(yàn)。測試結(jié)果表明,設(shè)計(jì)方案能應(yīng)對數(shù)據(jù)傳輸中出現(xiàn)的錯(cuò)誤。
5結(jié)束語
通過工程實(shí)際測試,該遠(yuǎn)程升級方法實(shí)現(xiàn)簡單、穩(wěn)定可靠,不會導(dǎo)致系統(tǒng)“變磚”,不需要修改硬件,易于移植。適用于大批量、非易接觸設(shè)備的板卡升級,已在多種板卡上應(yīng)用。
參考文獻(xiàn)
[1]劉永恩,王俊芳.FPGA遠(yuǎn)程升級技術(shù)的分析與實(shí)現(xiàn)[J].無線電工程,2012,42(9):48-50,60.
[2]閆雙山,胡學(xué)龍,季靜,等.串口更新FPGA配置文件的一種實(shí)現(xiàn)方法[J].國外電子測量技術(shù),2019,38(10):79-83.
[3]丁丁,湯曉斌,陳立德,等.基于μClinux的FPGA遠(yuǎn)程更新系統(tǒng)的實(shí)現(xiàn)[J].電子技術(shù)應(yīng)用,2014,40(3):6-8.
[4]姚遠(yuǎn).基于JTAG接口實(shí)現(xiàn)ARM對FPGA的Firmware遠(yuǎn)程配置[D].沈陽:沈陽航空航天大學(xué),2011.
[5]李強(qiáng),羅超,夏威,等.FPGA遠(yuǎn)程更新系統(tǒng)[J].儀表技術(shù)與傳感器,2014(7):72-74.
[6]周瓊,周鵬.單核FPGA系統(tǒng)的可靠性遠(yuǎn)程升級設(shè)計(jì)[J].中國新通信,2018,20(2):47-49.