黃和悅,鄭志偉,白楊,黃國臣,高榮亮
(中國電子科技集團公司 第三十四研究所 數字光通信與光電子部, 桂林 541004)
基于GoAhead與JTAG的FPGA/CPLD/PROM遠程配置方法
黃和悅,鄭志偉,白楊,黃國臣,高榮亮
(中國電子科技集團公司 第三十四研究所 數字光通信與光電子部, 桂林 541004)
提出了一種基于GoAhead嵌入式web服務器和JTAG總線的FPGA/CPLD/PROM器件遠程配置方法。設計使用GoAhead嵌入式服務器接收來自以太網的XSVF文件,再由CPU解析并通過JTAG協(xié)議對FPGA/CPLD/PROM進行配置文件更新,技術人員可以通過局域網中的任意PC機對目標設備進行遠程操作,避免了繁瑣而不安全的設備開箱。本方法占用系統(tǒng)硬件資源極少,效果穩(wěn)定可靠,可作為各類通信設備中FPGA/CPLD/PROM器件的ISP方案,也可方便的用在舊設備的升級改造中。
通信設備;GoAhead嵌入式Web服務器;FPGA/CPLD/PROM遠程配置更新;XSVF文件
現場可編程門陣列(Field-Programmable Gate Array,FPGA)或者復雜可編程邏輯器件(Complex Programmable Logic Device,CPLD)常見的配置方法是通過JTAG接口下載,但對于各類設備尤其是大型通信設備而言,JTAG接口并不在設備面板上,這給設備的維護帶來了極大的不便。因此,利用以太網口來對FPGA/CPLD/PROM器件進行遠程配置更新得到了廣泛的關注。
當前的FPGA/CPLD/PROM器件遠程配置更新方法大多采用單片機作為更新核心,使用從串模式將其與FPGA/CPLD/PROM器件連接,再解析TCP/IP協(xié)議包分析以太網傳過來的數據,最終通過SPI總線將配置數據寫入FPGA/CPLD/PROM。此模式下,FPGA/CPLD/PROM必須等待單片機啟動后對其進行配置,對于要求FPGA/CPLD在系統(tǒng)啟動順序中靠前并執(zhí)行看門狗功能的設備不適用;系統(tǒng)中必須增加單片機和SPI電路,難以用在老設備的改造升級中;單片機運行不了Web服務器,因此接收數據容易出錯,交互界面簡陋。針對這些缺陷,本文提出了一種基于GoAhead嵌入式Web服務器及JTAG協(xié)議的FPGA/CPLD/PROM遠程配置方法,無需手動分析TCP/IP協(xié)議包,支持FPGA主串模式,效果穩(wěn)定可靠。
本方法的整體示意圖如圖1所示。
圖1 系統(tǒng)整體框圖
在CPU上引出4個通用數字I/O口(GPIO)并連接到JTAG總線上,分別控制TMS、TCK、TDI、TDO信號;待編程的FPGA/CPLD/PROM以菊花鏈的形式連接到JTAG總線上。
圖2 TAP狀態(tài)機示意圖
由于JTAG接口是各類FPGA/CPLD/PROM器件均支持的接口,無需額外的占用器件的功能引腳,因此本方法中,JTAG鏈上的某個FPGA和對它進行配置的PROM之間可以通過串行數據線連接,亦即FPGA的主串模式。在此模式下,上電后,FPGA的CCLK時鐘作為PROM的時鐘,在CCLK的上升沿,FPGA將配置文件數據從自己的DIN引腳讀入。與常見的單片機-FPGA配置方案中的從串模式相比,每次啟動時FPGA會主動從PROM中讀取配置文件,因此FPGA的啟動不再依賴CPU或者單片機,給整個系統(tǒng)的設計帶來了更大的靈活性。
2.1 JTAG協(xié)議介紹
JTAG協(xié)議是指IEEE Std 1149.1所規(guī)定的測試訪問口(Test Access Port,TAP)及邊界掃描協(xié)議,其基本原理是在器件的各個引腳及控制寄存器上定義一個邊界掃描寄存器(Boundary Scan Register,BSR),通過訪問BSR能實時操作各個寄存器或者讀取其狀態(tài),從而實現對器件的控制和測試。
JTAG協(xié)議最核心的部分是TAP狀態(tài)機。此狀態(tài)機的不同狀態(tài)對應著TMS、TCK、TDI、TDO4條數據線上電平的狀態(tài)。TAP狀態(tài)機包含指令寄存器和數據寄存器兩個子狀態(tài)機,例如,當狀態(tài)機進入SHIFT-IR/SHIFT-DR的時候,將目標寄存器連接到TDI和TDO之間,準備寫入的指令/數據從TDI口串行移位進入目標器件并從TDO輸出。TAP狀態(tài)機的示意圖如圖2所示。
2.2 SVF/XSVF文件格式
SVF文件是一種工業(yè)用調試文件格式,它將一個待燒寫的文件“翻譯”成JTAG指令的形式,因此我們無需關注器件的細節(jié),只需按照SVF文件的指令來對JTAG總線的狀態(tài)進行操作即可。例如,讀取設備ID操作:
SDR 32 TDI (00000000) TDO (f9604093) SMASK(ffffffff) TDO (f9604093) MASK (0fffffff);
為了更切合嵌入式系統(tǒng)的需要,XILINX推出了XSVF格式文件。主要特征是將SVF的ASCII語句壓縮成二進制的形式,極大地縮小了文件所占用的空間。XSVF文件格式使用0x00~0x17的數字概括了操作JTAG總線的各條指令,表1是部分指令[1]。XSVF文件的生成使用iMPACT軟件即可,首先將JTAG鏈上面的各個器件的位置掃描出來,然后選中需要下載的器件,選擇.jed文件(用于CPLD)或.mcs/exo文件(用于PROM)或.bit文件(用于FPGA),點擊“生成XSVF文件”按鈕。器件在菊花鏈上的位置十分重要, XSVF文件的指令開頭就包含了開啟適當的BYPASS(旁通)位,使得指令能到達預期編程的器件[2]。
表1 部分XSVF指令與二進制碼對照表
GoAhead嵌入式Web服務器支持ASP、嵌入式Javascript、標準CGI接口、內存中的CGI處理(GoForms)等強大的功能,只需簡單的修改源碼中的某些定義即可在VxWorks、Linux等多種操作系統(tǒng)中運行。GoAhead順利運行后,即可用典型的前端交互-后端數據處理模型來處理Web數據,而無需自己去解析TCP/IP數據包。
3.1 Web前端頁面
使用html中的form標簽設計一個上傳選擇框,并定義特定action便于GoAhead服務器接收處理。上傳的MIME編碼方式“enctype”需要設置成“multipart/form-data”格式以便上傳文件。代碼如下:
3.2 Web后端數據處理
GoAhead源碼本身不含文件上傳功能,需要根據上傳補丁來修改。本文使用的是2.18版本的GoAhead源碼和2.11版本的上傳補丁。補丁增加了bmemdupNoBalloc函數用于處理二進制數據流,并在webs.c文件中增加了關鍵的對于multipart form形式數據的支持,有關資料可以在GoAhead官網及CSDN等網站下載到。圖3是GoAhead服務器結構圖。
圖3 GoAhead服務器結構圖
在GoAhead Web服務器的main函數中注冊與html頁面請求的action所對應的函數:
websFormDefine(T("upldFormForXSVFRam"), upldFormForXSVFRam); // 注冊處理函數
則GoAhead服務器會自動將html頁面的訪問請求定位到upldFormForXSVFRam函數中。
GoAhead定義了cgiRec結構體用于處理CGI數據,定義了websRec結構體來表示每次收到的數據大小、長度、來源信息, 收到前端頁面的訪問請求后,GoAhead會將Web請求的數據指針信息wp傳入upldFormForXSVFRam函數中,只需在upldFormForXSVFRam函數中調用wp->postData指針即可得到html頁面發(fā)送過來的數據。
圖4 軟件整體流程圖
XSVF文件傳輸到GoAhead web服務器后,保存在上文中wp→postData指針指向的內存中。讀取XSVF數據并根據其中的指令編號來操作GPIO即可完成整個遠程配置流程,流程圖如圖4所示。
4.1 定義基本操作函數
定義4個引腳來控制JTAG的4根信號線,定義延時函數來調節(jié)時序的快慢,定義setPort函數來操作具體引腳的置高置低。
setPort函數的定義如下:
setPort(short p,short var);
對網絡上傳文件并配置FPGA/CPLD/PROM而言,關鍵在于定義readByte函數,以便讀取Web服務器接收到的數據。readByte函數如下:
void readByte(unsigned char *data){
*data = *pXsvfData++;
}
readByte函數在每一次解析XSVF文件的最開始,調用讀入1byte的XSVF文件數據,pXsvfData是一個全局變量,在解析開始前將pXsvfData定位到wp→postData。
4.2 解析XSVF文件
定義xsvf_pfDoCmd矩陣,將XSVF文件規(guī)定的所有命令包含進來,每一條對應一個子函數,這樣就可以將所有的XSVF文件命令對應到實際的操作;定義tagSXsvfInfo結構體,里面包含當前下載的XSVF文件的下載狀態(tài)及數據;使用var_len_byte結構體來解析命令語句后面跟的數據長度[3]。
xsvf_pfDoCmd矩陣部分定義如下[4]:
TXsvfDoCmdFuncPtr xsvf_pfDoCmd[]={
xsvfDoXCOMPLETE, /*0*/
xsvfDoXTDOMASK, /*1*/
xsvfDoXSIR, /*2*/
……
}
tagSXsvfInfo結構體的部分定義如下:
typedef struct tagSXsvfInfo{
/* XSVF status information */
unsigned char ucComplete; //0運行;1完成
unsigned char ucCommand; //當前 XSVF 命令
……
}
根據ucCommand是否置位來判斷下載是否結束,若沒有結束,則不斷讀取XSVF文件數據并作出相應的動作。TDO引腳在TAP狀態(tài)機的SHFIT-DR狀態(tài)會輸出寫入TDI引腳的數據[5],讀取TDO引腳數據與寫入數據對比來判斷數據是否寫入JTAG總線成功,寫入和校驗同步進行。
實際上,XILINX的xapp058 reference code對此給出了清晰的參考范例,本文的解析函數參考了上述方案。
最后,軟件流程整體打包到upldFormForXSVFRam 函數中:
int upldFormForXSVFRam(webs_t wp, char_t * path, char_t * query) {
char_t* part = wp->postData;
int errorcode;// for XSVF EXCUTEerrorcode;
a_assert(websValid(wp));
websHeader(wp);
errorcode=xsvfExecuteForXSVFFromRam(wp->postData);
//進行下載
switch(errorcode…)(此處省略對錯誤碼的判斷)
websFooter(wp);
websDone(wp, 200);
return errorcode ;
}
本文所述方案在占用硬件資源極少(只需4個GPIO口)的情況下實現了對FPGA/CPLD/PROM的遠程配置,尤其適合用在大型通信設備(本身自帶以太網口)的升級改造中。實測下載8.5 MB大小的XSVF文件到FPGA的配置PROM XCF32P用時在5.5 min左右,且加上干擾信號仍可穩(wěn)定下載。
[1] XILINX. XAPP503 SVF and XSVF File Formats for Xilinx Devices [EB/OL].[2017-03].https://china.xilinx.com/support/documentation/application_notes/xapp503.pdf.
[2] XILINX.XAPP058 Xilinx In-System Programming Using anEmbedded Microcontroller[EB/OL].[2017-03].https://china.xilinx.com/support/documentation/application_notes/xapp058.pdf.
[3] XILINX. XAPP058.zip[EB/OL].[2017-03].https://china.xilinx.com
[4] 李迪挺. VXWORKS_fpga [EB/OL].[2017-03].http://www.pudn.com/downloads149/sourcecode/others/detail 642 524.html.
[5] 周光海,李寧,黃志洲,等. 基于Linux的CPLD在線升級驅動程序設計[J].單片機與嵌入式系統(tǒng)應用,2013(8):33-34.
黃和悅(助理工程師)、鄭志偉(工程師),主要研究方向為嵌入式系統(tǒng)、光通信技術;白楊(工程師),主要研究方向為數字光通信及相關領域的FPGA設計實現。
FPGA/CPLD/PROM Remote Update Method Based on GoAhead and JTAG
Huang Heyue,Zheng Zhiwei,Bai Yang,Huang Guochen,Gao Rongliang
(Digital Optical Communication and Optoelectronics Department of The 34th Institute of China Electronics Technology Group Corporation,Guilin 541004,China)
In the paper,a method based on GoAhead embedded web server and JTAG bus is proposed.The design uses GoAhead embedded web server to receive XSVF files from Ethernet,then the CPU parsing them and makes a FPGA/CPLD/PROM update through the JTAG protocol.The engineers can carry on the remote operation to the target device through the PC in the local area network,it avoids the cumbersome and unsafe operation to open the equipment box.The method takes up little hardware resources of the system,and it is stable and reliable,and can be used as the ISP scheme of FPGA/CPLD/PROM devices in various communication devices,and can be conveniently used in the upgrading of the old equipment.
communication equipments;GoAhead embedded Web server;FPGA/CPLD/PROM device remote configuration;XSVF file
TP316.2
A
?迪娜
2017-03-30)