APP下载

基于GoAhead与JTAG的FPGA/CPLD/PROM远程配置方法

2017-09-03黄和悦郑志伟白杨黄国臣高荣亮

单片机与嵌入式系统应用 2017年8期
关键词:状态机嵌入式器件

黄和悦,郑志伟,白杨,黄国臣,高荣亮

(中国电子科技集团公司 第三十四研究所 数字光通信与光电子部, 桂林 541004)

基于GoAhead与JTAG的FPGA/CPLD/PROM远程配置方法

黄和悦,郑志伟,白杨,黄国臣,高荣亮

(中国电子科技集团公司 第三十四研究所 数字光通信与光电子部, 桂林 541004)

提出了一种基于GoAhead嵌入式web服务器和JTAG总线的FPGA/CPLD/PROM器件远程配置方法。设计使用GoAhead嵌入式服务器接收来自以太网的XSVF文件,再由CPU解析并通过JTAG协议对FPGA/CPLD/PROM进行配置文件更新,技术人员可以通过局域网中的任意PC机对目标设备进行远程操作,避免了繁琐而不安全的设备开箱。本方法占用系统硬件资源极少,效果稳定可靠,可作为各类通信设备中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协议包分析以太网传过来的数据,最终通过SPI总线将配置数据写入FPGA/CPLD/PROM。此模式下,FPGA/CPLD/PROM必须等待单片机启动后对其进行配置,对于要求FPGA/CPLD在系统启动顺序中靠前并执行看门狗功能的设备不适用;系统中必须增加单片机和SPI电路,难以用在老设备的改造升级中;单片机运行不了Web服务器,因此接收数据容易出错,交互界面简陋。针对这些缺陷,本文提出了一种基于GoAhead嵌入式Web服务器及JTAG协议的FPGA/CPLD/PROM远程配置方法,无需手动分析TCP/IP协议包,支持FPGA主串模式,效果稳定可靠。

1 系统整体设计

本方法的整体示意图如图1所示。

图1 系统整体框图

在CPU上引出4个通用数字I/O口(GPIO)并连接到JTAG总线上,分别控制TMS、TCK、TDI、TDO信号;待编程的FPGA/CPLD/PROM以菊花链的形式连接到JTAG总线上。

图2 TAP状态机示意图

由于JTAG接口是各类FPGA/CPLD/PROM器件均支持的接口,无需额外的占用器件的功能引脚,因此本方法中,JTAG链上的某个FPGA和对它进行配置的PROM之间可以通过串行数据线连接,亦即FPGA的主串模式。在此模式下,上电后,FPGA的CCLK时钟作为PROM的时钟,在CCLK的上升沿,FPGA将配置文件数据从自己的DIN引脚读入。与常见的单片机-FPGA配置方案中的从串模式相比,每次启动时FPGA会主动从PROM中读取配置文件,因此FPGA的启动不再依赖CPU或者单片机,给整个系统的设计带来了更大的灵活性。

2 JTAG协议及XSVF文件

2.1 JTAG协议介绍

JTAG协议是指IEEE Std 1149.1所规定的测试访问口(Test Access Port,TAP)及边界扫描协议,其基本原理是在器件的各个引脚及控制寄存器上定义一个边界扫描寄存器(Boundary Scan Register,BSR),通过访问BSR能实时操作各个寄存器或者读取其状态,从而实现对器件的控制和测试。

JTAG协议最核心的部分是TAP状态机。此状态机的不同状态对应着TMS、TCK、TDI、TDO4条数据线上电平的状态。TAP状态机包含指令寄存器和数据寄存器两个子状态机,例如,当状态机进入SHIFT-IR/SHIFT-DR的时候,将目标寄存器连接到TDI和TDO之间,准备写入的指令/数据从TDI口串行移位进入目标器件并从TDO输出。TAP状态机的示意图如图2所示。

2.2 SVF/XSVF文件格式

SVF文件是一种工业用调试文件格式,它将一个待烧写的文件“翻译”成JTAG指令的形式,因此我们无需关注器件的细节,只需按照SVF文件的指令来对JTAG总线的状态进行操作即可。例如,读取设备ID操作:

SDR 32 TDI (00000000) TDO (f9604093) SMASK(ffffffff) TDO (f9604093) MASK (0fffffff);

为了更切合嵌入式系统的需要,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指令与二进制码对照表

3 嵌入式Web服务器实现配置文件远程上传

GoAhead嵌入式Web服务器支持ASP、嵌入式Javascript、标准CGI接口、内存中的CGI处理(GoForms)等强大的功能,只需简单的修改源码中的某些定义即可在VxWorks、Linux等多种操作系统中运行。GoAhead顺利运行后,即可用典型的前端交互-后端数据处理模型来处理Web数据,而无需自己去解析TCP/IP数据包。

3.1 Web前端页面

使用html中的form标签设计一个上传选择框,并定义特定action便于GoAhead服务器接收处理。上传的MIME编码方式“enctype”需要设置成“multipart/form-data”格式以便上传文件。代码如下:

Select file:

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页面发送过来的数据。

4 解析XSVF文件并将数据发送到GPIO

图4 软件整体流程图

XSVF文件传输到GoAhead web服务器后,保存在上文中wp→postData指针指向的内存中。读取XSVF数据并根据其中的指令编号来操作GPIO即可完成整个远程配置流程,流程图如图4所示。

4.1 定义基本操作函数

定义4个引脚来控制JTAG的4根信号线,定义延时函数来调节时序的快慢,定义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文件规定的所有命令包含进来,每一条对应一个子函数,这样就可以将所有的XSVF文件命令对应到实际的操作;定义tagSXsvfInfo结构体,里面包含当前下载的XSVF文件的下载状态及数据;使用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状态机的SHFIT-DR状态会输出写入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左右,且加上干扰信号仍可稳定下载。

[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].单片机与嵌入式系统应用,2013(8):33-34.

黄和悦(助理工程师)、郑志伟(工程师),主要研究方向为嵌入式系统、光通信技术;白杨(工程师),主要研究方向为数字光通信及相关领域的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)

猜你喜欢

状态机嵌入式器件
基于有限状态机的交会对接飞行任务规划方法
搭建基于Qt的嵌入式开发平台
嵌入式软PLC在电镀生产流程控制系统中的应用
旋涂-蒸镀工艺制备红光量子点器件
面向高速应用的GaN基HEMT器件
一种加载集总器件的可调三维周期结构
高分辨率遥感相机CCD器件精密热控制
Altera加入嵌入式视觉联盟
倍福 CX8091嵌入式控制器
FPGA设计中状态机安全性研究