【论文精选】一种基于FPGA的在线程序升级方案
张永乐,王永勇,郑 炜
(北京航天万源科技有限公司,北京100176)
摘 要: 介绍了一种基于XILINX FPGA的在线程序升级方案,该方案不需要额外增加器件,在不改变硬件状态的前提下,实现产品的软件功能升级。由于对配置芯片(PROM)的所有操作均由FPGA的内部逻辑实现,故此方案具有良好的移植性和扩展性。
关键词: FPGA;在线升级;JTAG
中图分类号: TN791
文献标识码: A
DOI:10.16157/j.issn.0258-7998.2017.03.011
中文引用格式: 张永乐,王永勇,郑炜. 一种基于FPGA的在线程序升级方案[J].电子技术应用,2017,43(3):48-50,54.
英文引用格式: Zhang Yongle,Wang Yongyong,Zheng Wei. Scheme of a in-system program updating based on FPGA[J].Application of Electronic Technique,2017,43(3):48-50,54.
0 引言
本文的研究课题是基于一种已应用在某型号上的弹载测试设备,因总体要求有变,需要对出厂后的产品功能进行升级。由于此类产品在出厂前都需要进行特殊的工艺处理,产品交付后不具备开盖重复烧录程序的条件,且根据型号研制要求,弹上设备在完成系统匹配试验和综合试验后禁止拆卸维修,因为设备拆卸后,状态遭到破坏,前期进行的各项试验需要重新评估,影响到型号研制进度。为解决这个难题,本文提出了一种在线程序升级方案,在不破坏产品硬件状态的前提下,利用FPGA灵活的内部逻辑资源实现自身的软件功能升级。
1 应用背景
随着内部资源的日趋丰富以及可重复配置的优势,FPGA在测试设备中担任了重要的角色,实现的功能也日趋复杂化和多样化,对产品功能实现重配置的应用需求也在日益加大。产品功能重配置是在不改动设备硬件状态的前提下,通过更新FPGA的程序文件,达到产品功能更改及升级的方法。目前主流的应用方案是使用MCU(或DSP)+存储芯片的架构[1],MCU负责存储芯片的读写,存储芯片作为FPGA的程序代码存储器,产品上电后,MCU将存储芯片中的数据读出,并按照特定时序(FPGA加载时序)发送到FPGA,此过程即为FPGA的数据加载流程[2]。此方案不适用于本文的研究课题,原因有二:首先,此方案需额外增加MCU和存储芯片两个芯片,印制板的布局难度加大,尤其对于本设备印制板上器件已经很多并无多余空间的情况更加明显;其次,软件的数量增多,增加了MCU软件后,出故障的概率也随之加大,由于MCU不仅需要对存储芯片进行读写操作,还需要对FPGA的上电加载过程进行模拟,如果加载不成功,不仅产品的升级功能失败,产品的基本功能也随之失效,考虑到本产品的特殊应用场合,此方案风险较大,不宜采用。
本文采用的方案是在FPGA的内部构建功能模块,由该模块完成PROM芯片烧写所需要的相关操作。在对产品进行软件升级时,该模块执行升级工作,不需要进行升级时,模块闲置,不发挥作用。该模块与产品的原功能模块独立运行,互不干涉。设备上电时,FPGA的程序加载流程仍由自带的PROM配置芯片自动完成。该方案既没有额外增加芯片,也没有额外增加软件个数,大大降低了出错的风险。
2 功能实现
设备的系统连接框图如图1所示,设备通过RS-422接口与地面测控台连接,地面测控台通过网络通信接口与计算机连接。测试设备的主控芯片FPGA为XILINX公司的Virtex-4系列XC4VSX35芯片,PROM配置芯片型号为XCF32PFSG48C,存储容量32 Mbit[3]。
计算机通过网络接口将烧写文件发送到测控台,测控台通过RS-422接口将烧写数据发送到设备,设备通过RS-422接口向测控台反馈状态信息。下面分别从烧写文件的生成、测控台与设备的通信协议、FPGA与PROM的连接、FPGA软件设计4个方面进行阐述。
2.1 烧写文件生成
XILINX设计工具(PROMGen)可生成多种格式的配置数据文件,这些数据文件可以存储在PROM中,也可以存储在其他非易失性存储芯片中[4]。配置文件的常用格式见表1。
FPGA程序编写完成,经过ISE(ISE Design Suite 14.2)开发环境综合实现后直接生成.bit编程文件,该文件可由IMPACT工具通过编程器烧写到PROM中。.bit格式文件是二级制配置数据文件,包含了头文件数据,头文件数据中包含PROM的相关信息,用于控制PROM烧写过程,该格式文件适用于使用编程器烧写。.hex文件为ASCII码PROM文件格式,仅包含配置数据,不包含头文件等信息,可使用PROMGen或iMPACT工具生成,.hex文件为本文采用的文件格式。
2.2 设备通信协议
测控台与设备通过RS-422连接,采用异步串行通信,波特率为921.6 kb/s,8 bit数据位,1 bit奇校验,1 bit停止位。对于RS-422的物理层通信,采用无校验的方式。发送与接收采取数据帧传输,表2以测控台发送的数据帧为例说明。
表2中,0xFD、0x55为帧头;指令类型0x02表示该指令为数据传送指令,其他指令类型在此不赘述;数据长度表示该帧数据的数据区中包含的数据字节个数,数据区字节个数可变,数据长度0x00~0xFF表示数据区中实际数据个数0~255个;校验和为数据区中所有数据(0~255个)的累加和。
由于传送的文件为“.hex”纯数据文件,文件中仅包含A~F、a~f、0~9等三类字符,对应十六进制数据分别为0x41~0x46,0x61~0x66,0x30~0x39,可确保帧头数据0xFD、0x55在整个数据帧中的唯一性,接收方可依此作为判断每帧数据起始的依据。
2.3 接口实现
FPGA和PROM、JTAG的具体连接关系见图2。
图2中,JTAG1下载口用于对FPGA进行在线调试和仿真,JTAG2下载口用于对PROM进行程序烧写。 FPGA的4个I/O口连接到JTAG2链,在对PROM芯片进行程序烧写时,I/O 1~I/O 4为高阻态,编程器通过JTAG2口对PROM进行程序烧写。烧写完成后,FPGA执行程序,此程序中嵌入了对PROM的在线升级功能,在需要对PROM芯片进行在线升级时,I/O 1~I/O 4则分别模拟TCK、TMS、TDI、TDO管脚,由FPGA内部逻辑实现JTAG时序控制功能,对PROM进行擦除、编程、校验等操作,完成PROM的程序升级。
2.4 模块组成
FPGA内部由3个模块组成,分别为422通信模块、中心控制模块、JTAG时序控制模块,组成图见图3。
422模块与测控台进行数据交互,接收测控台发送的程序数据,并回复相应的状态信息到测控台。JTAG模块用于生成边界扫描控制时序,对PROM进行擦除、编程和校验等相关操作。控制模块用于对422模块和JTAG模块进行协调控制,对422模块接收到的数据进行校验,并判断JTAG模块当前的运行状态后,按照自定义的握手协议将数据发送到JTAG模块,同时将JTAG模块回复的信息反馈到422模块。
2.5 模块通信时序设计
控制模块与JTAG模块的连接见图4。
图4中,重要信号说明如下:
EPV_CTRL:启动擦除、编程、校验操作;
RDY:准备好信号,JTAG模块准备好接收数据;
LOAD:握手信号,收到RDY为高将LOAD置高表示数据已就绪。
以上信号均为高有效,通信时序见图5。
图5中,控制模块将EPV_CTRL信号置高,等待RDY信号有效,当检测到RDY信号为高后,将LOAD信号置高,同时将数据放在DATA线上,下一个CLK周期检测到RDY变为低,则延迟一个周期,在下下个周期将LOAD信号置低,LOAD信号和DATA线上数据至少保持2个CLK周期(注:DATA数据线上传送的第一个字节为CRC校验值,相关说明见2.8节)。
2.6 JTAG模块设计
下面重点介绍JTAG模块的实现原理。
该模块的主要功能是对PROM器件进行擦除、编程和校验操作,每个步骤都是一些必要的指令序列去控制PROM执行相应的动作。例如对PROM进行擦除操作,需要首先发送指令将PROM置为ISP模式,然后发送擦除指令,指定需要擦除的块(BLOCK),擦除开始后,监测是否有错误发生,直到擦除结束。
JTAG模块发送特定的指令去控制PROM,实现不同的操作。指令的发送时序遵循IEEE1194.1边界扫描协议。边界扫描协议最初是用于对芯片进行测试的,通过在芯片内部定义一个测试访问口(Test Access Port,TAP),以及专用的JTAG测试工具对内部节点进行测试,JTAG测试允许将多个器件串联在一起,形成一个JTAG链,实现对各个器件的分别测试。现今,JTAG接口也常用于实现在线编程(In-System Programming,ISP),对Flash等器件进行编程。
完整的JTAG处理链由JTAG寄存器和TAP控制器组成[5]。JTAG寄存器包含了边界扫描需要的所有指令。TAP控制器主要包含一个状态机,对控制PROM编程需要的每个必要的步骤进行编码, TCK上升沿时刻TMS的状态值决定状态机的跳转流程,包括数据入数据寄存器的流程和指令入指令寄存器的流程。相关的状态转换原理可参阅参考文献[5],此不赘述。
2.7 编程操作
对PROM的编程包含擦除、编程、校验3个步骤。
(1)擦除: 控制模块将EPV_CTRL置高, JTAG模块擦除整片PROM,并读取PROM的状态,检查完成状态或错误状态,完成擦除后,在下一个CLK时钟上升沿将RDY置高,并进入编程流程。如擦除过程中有错误发生,ERROR被置高,控制模块必须通过RST复位JTAG模块,并将EPV_CTRL置高,再次尝试擦除操作。
(2)编程:擦除操作成功后,JTAG模块将RDY置高,表示该模块已经准备好接收编程数据,控制模块将LOAD置高,同时把数据送到DATA线上,同一个时钟的下降沿,JTAG模块锁存数据,下一个时钟上升沿,JTAG模块将RDY置低,再下一个时钟上升沿,控制模块将LOAD置低。因JTAG模块需要将数据按位串行移到PROM,所以控制模块发完数据后,至少需要等8个周期才能发送下一字节数据,发送新的数据前需要首先监控RDY信号的状态。
控制模块每发送完256 bit的数据后,PROM对这些数据进行Flash编程,约需15 μs,控制模块需要延迟等待。在编程期间,模块监测PROM的状态查看是否有问题发生,控制模块发送完所有的数据到JTAG模块后,将EPV_CTRL置低,JTAG模块将最后256 bit的数据传送到PROM,若没有错误,进入校验操作。
(3)校验:控制模块将EPV_CTRL置低后,JTAG模块将最后一批数据发送到PROM,开始进入校验流程,JTAG模块读取PROM中的所有数据对数据进行8 bit CRC校验,并与.hex文件的CRC校验值进行比较,如果不相等,将ERROR置高,DONE保持低,如果相等,则DONE置高,所有连接到JTAG口的I/O管脚高阻态,校验结束。
2.8 数据校验
为保证烧写过程的可靠性及抗干扰性,必须对烧写数据进行校验,校验措施如下:
(1)在设备与地面测控台的422通信帧尾加入校验字,对每帧数据进行累加和校验,保证帧数据的完整性及正确性;
(2)由于生成的.hex文件为纯配置数据,不包含文件的校验信息,为保证烧写过程的完整性,对整个文件进行数据校验,在.hex文件头插入该数据文件所有字节的CRC8校验值,在烧写完成后,将PROM中的数据全部读出并进行CRC8校验运算,若与文件头的CRC8校验值相等,则表明烧写操作成功。
3 设计注意要点
图2中FPGA的I/O口与PROM在同一个JTAG链,在进行程序升级时,此JTAG链(JTAG2)不能连接编程器。
本方案中对PROM的内容进行更新是从地址0顺序进行的,此更新并不改变PROM内部的设置寄存器(setup registers)的值,仅改变PROM中数据区的内容。
4 结论
本文基于FPGA灵活的重配置功能,提出了一种对PROM进行程序升级的方案,该方案简单高效,所有功能均在FPGA内部实现,硬件上仅需要使用FPGA的4个I/O口去模拟JTAG接口时序,实现对PROM内部的数据更新。另外,通信过程中的帧校验及CRC校验,确保了数据的正确性及高可靠性。目前该方案已成功应用到系列产品上。
参考文献
[1] Mike Peattie.Using a microprocessor to configure Xilinx FPGAs via slave serial or select MAP mode[EB/OL].[2009-8-24].www.xilinx.com/support/documentation/application_notes/xapp502.pdf.
[2] 陈岚,李纪云,朱人杰.基于Kintex7和SPI Flash实现FPGA的多重加载[J].电子技术应用,2014,40(6):24-26.
[3] XILINX.Platform flash in-system programmable configuration PROMS data sheet[EB/OL].[2006-05-09].http:www.xilinx.com/support/documentation/data_sheets/ds123.pdf.
[4] XILINX.Virtex-4 FPGA configuration user guide[EB/OL].[2009-06-09].http:www.xilinx.com/support/documentation/user_guides/ug071.pdf.
[5] Randal Kuramoto.Updating a platform Flash PROM design revision in-system using SVF[EB/OL].[2009-09-15].http:www.xilinx.com/support/documentation/application_notes/xapp972.pdf.