官 劍,錢雪磊,韓留軍,薛 培,邵春偉
(1.無錫華普微電子有限公司,江蘇 無錫 214000;2.中科芯集成電路有限公司,江蘇 無錫 214000)
在工控領域,PLC 系統(tǒng)配套的遠程在線調試技術已經非常成熟[1],而以FPGA 為核心的系統(tǒng),市面上還未出現(xiàn)成熟的可遠程在線調試的產品。當FPGA 系統(tǒng)出現(xiàn)故障時,依然需要工程師到現(xiàn)場分析與調試。而FPGA 動態(tài)可重構技術是實現(xiàn)遠程升級和調試的一種可行方法。
FPGA 動態(tài)可重構指FPGA 內時序邏輯的發(fā)生不是通過調用芯片內不同區(qū)域和不同邏輯的資源組合實現(xiàn)的,而是通過對FPGA 全局或局部邏輯進行動態(tài)重構實現(xiàn)的[2],其主要分為全局動態(tài)可重構技術和部分動態(tài)可重構技術。
FPGA 動態(tài)可重構技術,有如下方法可實現(xiàn):
(1)采用外圍芯片,如ARM 或CPU,通過JTAG 或者selectMAP 接口對FPGA 進行動態(tài)重構[3]。該方法較靈活,但是系統(tǒng)中存在使用一個主控芯片,對成本、尺寸和功耗均有影響。
(2)采用FPGA 內置的MicroBlaze 或者ZYNQ 系列的ARM 對FPGA 進行全局動態(tài)重構[4]。該方法較靈活,成本較低,但是該方法為全局重構方式[5],對Flash 大小有限制,同時全局重構方式是采用存儲于Flash update 空間中的bin 文件來完成FPGA 更新功能,該bin 文件所對應的待更新FPGA 程序為正式版程序,不適合遠程調試時而使用的中間版調試程序。
(3)在特殊領域中,采用部分局部可重構技術,可實現(xiàn)FPGA 內SRAM 區(qū)域動態(tài)重構[6],以避免特殊環(huán)境中FPGA 可能發(fā)生的單粒子翻轉而影響到FPGA 核心功能,但是其應用領域較狹窄,不適合本研究所處的工控領域[7]。
基于以上三種方法的優(yōu)缺點,本文設計了基于以太網(wǎng)方式的FPGA 遠程調試系統(tǒng),實現(xiàn)了服務器端的遠程調試和遠程升級重構,成本較低,適用于網(wǎng)絡中的FPGA設備。
本系統(tǒng)中的設備是以Xilinx 7 系列FPGA 為硬件平臺,整體架構如圖1 所示。
圖1 FPGA 遠程調試系統(tǒng)架構
在圖1 中,系統(tǒng)由FPGA、PHY 芯 片、Flash 芯片及DDR3 芯片組成。其中PHY 實現(xiàn)TCP/IP 以太網(wǎng)的物理層功能、DDR3 為FPGA 緩存芯 片、Flash 芯片為FPGA 程序存放的位置。FPGA 系統(tǒng)通過Internet 與工作服務器和遠程服務器建立連接。
用戶正常使用時,設備只與工作服務器保持連接通信;當用戶需要廠家對設備維護而進行遠程調試時,設備與遠程服務器建立通信連接,并實現(xiàn)以下三個功能:
(1)遠程重構數(shù)據(jù)注入:遠程服務器通過Internet 下發(fā)部分動態(tài)可重構的bin 文件數(shù)據(jù)注入到FPGA ICAP(Internal Configuration Access Port)中,F(xiàn)PGA 部分模 塊實時執(zhí)行重構后的功能;
(2)調試數(shù)據(jù)上傳:設備向服務器上傳實時狀態(tài)以便廠家調試設備,分析設備問題;
(3)遠程升級:當廠家解決設備問題后,將最終版本的升級程序bin 文件通過Internet 下發(fā)到FPGA,F(xiàn)PGA 將文件更新到Flash 芯片中。
實現(xiàn)以上功能,則完成了一次完整的設備遠程調試與維護的流程。
FPGA 主要由靜態(tài)和動態(tài)兩類模塊組成,模塊之間的通信通過AXI4 總線和同步接口來進行。圖1 中的部分可重構模塊即為動態(tài)模塊,在遠程調試和升級時可重構;除部分可重構模塊外的FPGA 其他模塊為靜態(tài)模塊,在遠程調試和升級時不可重構。
FPGA 內部的子模塊如圖2 所示。子模塊功能如表1 所示。
圖2 FPGA 內部模塊圖
表1 FPGA 子模塊功能表
使用Vivado 的Partial Reconfiguration Wizard 工具可將兩個或多個具有同樣模塊名稱的HDL 文件在同一工程中實現(xiàn)[8],該工具所設定的HDL 文件即為動態(tài)模塊,其內部可包含多個子模塊。不同的動態(tài)模塊在同一個工程中編譯后會生成多個不同的下載bit 文件,這類bit只會對動態(tài)模塊重構,對靜態(tài)模塊無影響。
在實際系統(tǒng)中,動態(tài)模塊的區(qū)域約束是廠家通過預估動態(tài)模塊所需要的LUT、寄存器、管腳、RAM 和DSP等資源大小來綜合設定的。
工程編譯完成后,將生成兩類比特流:多個部分重配置(Partial Reconfiguration,PR)比特流和全功能(full)比特流。其中PR 比特流文件轉換后的PR bin 文件即為本系統(tǒng)中用于動態(tài)模塊重構的更新文件。full 比特流轉換后的full bin 文件即用于全局模塊重構的更新文件。
動態(tài)模塊含用戶模塊和同步接口模塊。其中用戶模塊的核心功能設計在此文中不涉及,而由于模塊動態(tài)重構的特殊性,需要考慮動態(tài)模塊與靜態(tài)模塊之間的同步。因此系統(tǒng)設計了一個專門的同步模塊以處理該問題。動態(tài)模塊的接口框圖如圖3 所示。
圖3 動態(tài)模塊接口框圖
用戶模塊與靜態(tài)模塊的接口包含兩種接口:(1)與MicroBlaze 軟核之間數(shù)據(jù)交互的AXI4 接口,主要用于接收遠程注入指令和本地調試信息上傳;(2)與靜態(tài)模塊數(shù)據(jù)交互的其他邏輯接口。在遠程重構動態(tài)模塊時,HDL文件的代碼修改,動態(tài)模塊的輸入輸出信號不能有任何的改變。
動態(tài)模塊重構后,其邏輯會重新復位,此時系統(tǒng)設計了同步模塊,以確保靜態(tài)模塊可以輸出同步觸發(fā)信號給動態(tài)模塊,實現(xiàn)兩個模塊之間時間上的一致。其接口時序設計如圖4 所示。
圖4 同步邏輯模塊時序
clk 信號為時鐘信號,由靜態(tài)模塊提供,無論在更新PR bin 文件前、中、后的過程中,該信號狀態(tài)均能穩(wěn)定保持。
reset 信號為復位信號,與靜態(tài)模塊的主復位信號保持一致。
static_sync 信號為靜態(tài)模式輸出給動態(tài)模塊的同步信號,該信號為周期信號,每隔8 個clk 信號輸出1 個高電平。在更新PR bin 文件前、中、后的過程中,該信號狀態(tài)均能穩(wěn)定保持。
dynamic_sync 信號為動態(tài)模塊輸出給靜態(tài)模塊的同步信號,該信號與static_sync 一致,也為周期信號,其信號在static_sync 延后2 個周期。由于動態(tài)模塊在重構過程中該信號處于未定態(tài),如圖4 所示,“啟動動態(tài)模塊可重構”到“動態(tài)可重構文件ICAP 更新成功”的時間內,該信號為0。該信號使靜態(tài)模塊可以獲取動態(tài)模塊的實時狀態(tài)。
trigger 信號為靜態(tài)模塊輸出給用戶模塊的觸發(fā)信號,其信號只有當完成動態(tài)模塊重構流程后,獲取static_sync 后才會拉高,此刻用于觸發(fā)用戶模塊時間同步開始。
基于以上設計的同步模塊,可實現(xiàn)動態(tài)模塊與靜態(tài)模塊之間的同步,確保用戶模塊的時間上保持一致。
靜態(tài)模塊是為實現(xiàn)動態(tài)模塊重構、全局模塊重構和TCP/IP 以太網(wǎng)通信等功能而設計的確定性邏輯,含MicroBlaze、ddr3_ctrl 模塊、icap_ctrl 模塊、flash_ctrl 模塊等模塊。其中MicroBlaze 處理器實現(xiàn)各個模塊與TCP/IP以太網(wǎng)數(shù)據(jù)的交互;ddr3_ctrl 模塊為DDR3 讀寫緩存模塊;icap_ctrl 模塊為遠程調試時PR bin 文件寫入ICAP 的控制模塊;flash_ctrl 模塊為遠程升級時full bin 寫入到Flash 芯片的控制模塊。
2.3.1 MicroBlaze 處理器
MicroBlaze 實現(xiàn)LwIP 協(xié)議棧,此協(xié)議棧在保持了TCP/IP 協(xié)議主要功能的基礎上減少了對資源的占用[9]。FPGA 的動態(tài)重構和全局重構,均是遠程服務器通過TCP/IP 將待更新的PR bin 文件和full bin 文件下發(fā)給FPGA 內部的MicroBlaze 軟核,MicroBlaze 解析TCP/IP包后,按照包內計數(shù)器的順序,解析出有效的數(shù)據(jù),通過AXI4 總線把數(shù)據(jù)寫入ddr3_ctrl 模塊的DDR3 地址中,在確認MicroBlaze 收到最后一個PR bin 或者full bin 數(shù)據(jù)后,啟動重構文件的下載。
2.3.2 ddr3_ctrl 控制模塊
ddr3_ctrl 模塊采用XILINX 提供的MIG IP,接口為AXI4 接口,通過AXI4-interconnect 互聯(lián)模塊實現(xiàn)與MicroBlaze 處理器連接。其實現(xiàn)的功能為:
(1)從以太網(wǎng)中接收的以太網(wǎng)包中解析出PR 數(shù)據(jù)bin 或full bin 文件,寫入到DDR3 顆粒;
(2)從劃分好的動態(tài)重構DDR3 地址讀出動態(tài)模塊重構bin 文件,按時序寫入到icap_ctrl 模塊;
(3)從劃分好的全局重構DDR3 地址讀出全局模塊重構bin 文件,按時序寫入到flash_ctrl 模塊。
2.3.3 icap_ctrl 控制模塊
動態(tài)模塊的重構是通過部分動態(tài)可重構技術實現(xiàn)的。該技術采用CAP 原語的方式。
在Xilinx7 系列中,ICAP 即為實現(xiàn)該技術的原語,其功能與Selectmap、JTAG 等方式類似[10],區(qū)別在于ICAP是可以通過HDL 代碼直接代碼,方便集成到工程中。
ICAP 原語框圖如圖5 所示。
圖5 ICAP 原語框圖
其信號如下:
(1) O:配置數(shù)據(jù)的輸出;
(2) CSIB:使能信號,低電平有效;
(3) CLK:時鐘信號;
(4) I:原語配置數(shù)據(jù)的輸入信號;
(5) RDWRB:讀寫使能信號,低電平有效。
icap_ctrl 設計為AXI4-lite 接口方式,其基地址為0x80000000??刂屏鞒虨椋?/p>
(1) MicroBlaze 向地址0x80000000 寫1 為啟動ICAP動態(tài)模塊更新;
(2) MicroBlaze 向地址0x80000004 寫PR bin 文件數(shù)據(jù)(32bit);
(3) 寫完所有的PR bin 文件內容;
(4) MicroBlaze 向地址0x80000008 寫1 為bin 文件傳輸結束標志。此時MicroBlaze 完成了一次動態(tài)模塊的重構。
2.3.4 flash_ctrl 控制模塊
flash_ctrl 模塊為當完成遠程調試、進行遠程升級時所使用的全局重構控制模塊。本系統(tǒng)采用SPI Flash 存FPGA 全局重構文件。FPGA 的程序加載運行是通過讀取Flash 中的數(shù)據(jù)進行的,F(xiàn)lash 包括3 個部分:Header、initial bitstream area 和update bitstream area。
全局重構的full bin 文件即通過該模塊寫入到update bitstream area 空間。該技術在此不詳述,可參考文獻[11]。
MicroBlaze 處理器的軟件流程圖如圖6 所示。當設備進入到遠程調試模式時,與MicroBlaze 遠程服務器通過以太網(wǎng)建立起TCP/IP 連接。
圖6 MicroBlaze 軟核流程圖
默認狀態(tài)下,MicroBlaze 發(fā)送狀態(tài)包(含動態(tài)模塊的實時狀態(tài))到服務器端,服務器端顯示設備的狀態(tài),并進行遠程調試。
當設備端MicroBlaze 接收到服務器端動態(tài)模塊更新啟動指令后,進入到動態(tài)模塊更新模式并接收PR bin 文件。MicroBlaze 接收到動態(tài)模塊更新停止指令,接收完成,并從ddr3_ctrl 模塊中讀出存入的bin 文件,并發(fā)給icap_ctrl 模塊,實現(xiàn)ICAP 的更新,更新完成后返回到默認狀態(tài)。
當設備端MicroBlaze 接收到服務器端全局模塊更新啟動指令后,進入到全局模塊更新模式并接收full bin 文件。MicroBlaze 接收到全局模塊更新停止指令,接收完成,從ddr3_ctrl 模塊中讀出存入的bin 文件,并發(fā)給flash_ctrl 模塊,實現(xiàn)Flash 存儲內容的更新,更新完成后,控制FPGA 的PROGRAM 管腳,實現(xiàn)設備遠程重啟。
完 成PR bin 文件存DDR3 后,MicroBlaze 需要將 存在DDR3 中的bin 數(shù)據(jù)完整地通過icap_ctrl 模塊下載到ICAP 中。該過程的軟件流程圖如圖7 所示。
圖7 動態(tài)模塊更新流程圖
MicroBlaze 通過讀取DDR3 地址中的bin 數(shù)據(jù),通過AXI4-lite 接口寫入到icap_ctrl 模塊。icap_ctrl 模塊輸入為AXI4-lite slave 接口,輸出為ICAP 接口信號。
首先MicroBlaze 從DDR3 讀出首地址中的數(shù)據(jù),由于DDR3 中單地址讀出的數(shù)據(jù)為128 bit,而ICAP 接口最大為32 bit 位寬,因此首地址的數(shù)據(jù)分4 次寫入到ICAP 接口。完成后,響應ACK。MicroBlaze 繼續(xù)完成后續(xù)DDR3 地址數(shù)據(jù)的讀出。直到最后一個地址,即實現(xiàn)部分動態(tài)可重構bin 文件的更新。
在完成full bin 存DDR3 的操作后,MicroBlaze 需要將存在DDR3 中的bin 數(shù)據(jù)通過flash_ctrl 下載到Flash存儲芯片中的update 區(qū)域。該過程的實現(xiàn)如圖8 所示。
圖8 全局模塊更新流程圖
與icap_ctrl 軟件控制流程類似,其差別在于完成bin數(shù)據(jù)更新后,MicroBlaze 需要重啟FPGA,實現(xiàn)遠程升級文件的生效。
遠程服務器運行于帶Internet 互聯(lián)網(wǎng)的PC 或者服務器上,采用C++語言開發(fā),其集成了服務器端的TCP/IP協(xié)議、自定義的數(shù)據(jù)收發(fā)和控制協(xié)議,通過Internet 網(wǎng)絡,與FPGA 進行數(shù)據(jù)交互,實現(xiàn)遠程調試,同時上位機集成有可導入PR bin、full bin 兩種文件的控件,實現(xiàn)將文件通過網(wǎng)絡傳輸?shù)皆O備以完成FPGA 遠程調試與升級。
當FPGA 系統(tǒng)接入網(wǎng)絡時,連接上后的服務器頁面如圖9 所示。頁面上顯示的是IP 為172.16.1.10、端口號為5001 的FPGA 設備連上后的狀態(tài)。
圖9 遠程服務器操作界面
當用戶選擇進行,選擇更新界面,并選擇更新的文件后點擊升級按鍵,如圖10 所示。
圖10 設備遠程更新過程中
服務器通過網(wǎng)絡開始以包的形式下發(fā)bin 數(shù)據(jù)給設備,成功后,軟核反饋更新后的狀態(tài)給遠程服務器,并顯示到上位機。升級完畢后的頁面如圖11 所示。
圖11 遠程升級成功
遠程調試頁面顯示為設備的狀態(tài)信息,與設備的功能有關聯(lián),在此不展示。
本文以Xilinx 公司7 系列FPGA 為研究對象,采用MicroBlaze 軟核處理器,搭建了基于LwIP 的TCP/IP 協(xié)議棧,作為動態(tài)和全局可重構數(shù)據(jù)傳輸?shù)耐ㄐ欧绞?。該方式不需要任何硬件狀態(tài)的改變,只改變遠程更新模塊的功能,更新后立即生效并反饋到升級后的動態(tài)模塊和全局模塊實時的狀態(tài),方便地進行遠程調試和遠程升級[12]。
基于以上技術的遠程調試系統(tǒng)可靠性高,可實現(xiàn)FPGA 資源的時分復用、動態(tài)調制[12],在人員無法流動的情況下,可方便地實現(xiàn)系統(tǒng)設備的遠程維護。