提高航天遥测产品FPGA软件质量设计方法
2020-02-05王伟伟修展苏峰马瑞任昌健
王伟伟 修展 苏峰 马瑞 任昌健
(北京航天长征飞行器研究所 北京市 100076)
1 引言
随着航天技术的发展,新技术、新产品层出不穷。众所周知,航天产品的质量对成败影响巨大,小到一个螺丝钉,大到整个系统,每个环节紧紧相扣,密不可分。随着硬件产品的逐渐成熟,软件产品的问题越来越凸显,软件来定义产品是大势所趋。尤其是大规模FPGA、SOC、SOPC 等芯片的产生,给设计提供了开阔的空间来定义和设计产品,以满足高密度、复杂的航天系统工程需要。
对于遥测系统来说,各系统都希望在一次试验中可以拿到更多的数据,而不同的系统数据量和接口形式不同,这就导致遥测系统的对外接口种类繁多,包括光口、RapidIO 接口、网口、LVDS 接口、RS422 接口、I2C 接口、SPI 接口等,速率从9600bps 到2.5Gbps 不等。对于这些接口,硬件电路的成熟,需要通过软件设计来保证数据的可靠记录,必要时对一些重要数据进行冗余和备份,通过记忆重发或备份重传的方式提高数据接收的可靠性。在遥测系统中,这些接口的实现几乎全部使用FPGA,因此FPGA 软件可靠性设计成为影响成败的关键因素,软件质量复查也成为产品乃至系统出厂前必不可少的一个环节。
本文针对遥测系统常用的FPGA 产品的软件设计方法进行了阐述,提出了提高可靠性的设计方法和建议,供大家在设计过程中参考。
2 统一FPGA软件设计平台
2.1 硬件电路选择
根据不同的应用场合,目前遥测系统单机产品使用的FPGA 芯片类型繁多不统一,大部分使用Xilinx 公司的芯片。例如有适用于存储器的小封装的Spartan-3E 系列的XC3S500E-4CP132I,也有应用于多接口、高速率接口控制器的Kintex-7 系列的XQ7K325T-2FFG676,不完全统计,使用到的FPGA 芯片种类不下十余种,这给设计带来一定的困扰,很多成熟设计不能直接使用,还需要进行移植,中间还会带来很多不常见的问题,开发周期都快赶上重新设计周期了。因此根据当前需求,结合国产化要求,当务之急要统一硬件平台,开发成熟设计,节约成本,提高设计效率。通过研究和讨论,最终选定了三款应用于不同场合的FPGA 芯片类型和一款CPLD 芯片,FPGA 分别对应于Xilinx 的Virtex4、Virtex5 和Kintex-7 系列FPGA,CPLD 使用Altera 公司的EPM2210F256I5N。硬件平台选择情况见表1 所示。
通过统一遥测系统FPGA 芯片的类型,可以方便地将成熟的、经过飞行试验验证的硬件电路和软件设计快速移植到新的系统设计中,避免因为选择新的设计平台导致的软硬件缺陷和未认识到的错误,从而提高了设计效率,增强了系统的可靠性。
2.2 开发工具选择及设置
图1:两时钟输入PLL 设计框图
针对2.1 节中提到的硬件电路,选择相应的开发工具。由于国产器件开发兼容国外器件,且使用同一套开发工具,目前暂时使用国外的软件开发工具,除非有特殊的国产化要求。针对Xilinx的FPGA 选择ISE 和Vivado 工具开发,ISE14.7 为ISE 的最终版本,Vivado 版本在不断更新。目前推荐使用的版本为ISE14.7 和Vivado2017.4,开发工具成熟稳定。若同时使用到SPI Flash 和Virtex5 器件,建议使用ISE12.4 及以下版本,12.4 以上版本针对Virtex5 对SPI Flash 支持不好,烧写程序有问题。而对于Altera 的CPLD 器件,使用QuartusII 9.0 进行开发。本章节将对开发工具中涉及到提高软件可靠性的设计方法进行描述。
2.2.1 IO 管脚配置
选定好软件开发工具,开发完程序后,首先需要进行IO 管脚配置。配置时根据需求及硬件电路,对IO 的位置、电平标准及驱动能力进行准确的配置。IO 的位置根据硬件电路来设置;电平标准需要根据连接的块区电压以及与其连接的外设电平共同决定,一般GPIO 设置为LVCMOS33(3.3V LVCMOS 电平);IO 驱动能力根据需求适当调整,一般为设置为10mA 以上。IO 管脚配置影响速率和高低电平的判别标准,设置时要根据通信双方采用的机制进行合理配置,设置不当会带来通信错误和不必要的麻烦。
2.2.2 时序约束
FPGA 设计的关键是时序设计,而时序约束对设计可靠性有重要作用,合理的时序约束能够增强设计的可靠性,错误的时序约束会导致软件异常错误,时钟余量不足,导致功能在某个环境中出现错误。对于一般应用而言,在无特殊时序要求的情况下,只需要对输入时钟进行约束即可。ISE 中在“User Constraints”工具下“Create Timing Constraints”界面中“Clock Domains”,对“Unconstrained Clocks”中列出的时钟信号进行约束,其中包括全局时钟输入,同步信号时钟输入等,每个时钟信号都要根据硬件电路进行正确设置,否则工具会根据默认时钟进行布局布线,最终会影响软件性能甚至导致功能错误。对于高速并行信号或有时序要求的同步时钟和数据信号,必要时需要增加输入输出延时,新建一个期望频率的“虚拟时钟”,在此基础上进行延迟约束,保证足够的建立和保持时间,数据能够正确传输。
表1:遥测系统统一硬件平台
表2:指令发送格式
图2:不合理时序约束下的时序不满足路径报告
以Quartus II 软件为例,使用TimeQuest 工具或Tcl 脚本文件进行时序约束。在TimeQuest 中使用图形文件向导创建时钟约束和其他必要的时序约束。可以分析复杂路径下的时序余量情况以及通过约束关键路径来实现软件功能。一般情况下,通过TimeQuest 中的“Create Clock”工具来创建全局时钟约束,使用到锁相环(PLL)时使用“Derive PLL Clocks”工具根据PLL 设置自动派生出其他时钟约束,再使用“Derive Clock Uncertainty”来约束时钟的不确定性,即可满足工程需要。当系统涉及到多个输入时钟时,以Quartus II 软件为例,设计时采用如图1 所示时钟输入电路时,需要对输入设计时序进行合理约束,否则会存现时序错误报告,对功能和性能造成不良影响。
如图1 所示,PLL(Phase Locked Loop)锁相环采用双时钟输入,可以通过判断两个时钟的有无,自动切换实现时钟的输入。两个时钟输入频率均为50MHz,PLL 的输出为FPGA 软件设计中使用到的不同时钟频率:80MHz(clk_80MHz)、240MHz(clk_240MHz)、50MHz(clk_50M)和20MHz(clk_20M)。针对上述应用,设计时若对时钟不约束或只对GCLK0 或GCLK1 时钟输入进行约束,其他采用默认方式。布局布线完成后,查看TimeQuest 中的Report Timing 的时序报告,会发现如图2 所示的时序不满足路径。
观察图2 中的时序报告,发现不满足路径上的信号都经历了两个Launch Clock(开始时钟),分别为PLL 的clk[0](clk_80M)和clk[0]~1,clk[0]~1 为开发工具根据PLL 自动产生的一个时钟,该时钟为不存在的虚拟时钟,不该作为时序约束进行分析报告。针对该问题,设计时需要对PLL 的产生时钟进行如下约束:
create_generated_clock -name {clk_80} -source [get_ports {GCLK0}]-multiply_by 8 -divide_by 5 -master_clock {clkin} [get_pins {inst6|altpll_component|auto_generated|pll1|clk[0]}]
create_generated_clock -name {clk_240} -source [get_ports {GCLK0}]-multiply_by 24 -divide_by 5 -master_clock {clkin} [get_pins {inst6|altpll_component|auto_generated|pll1|clk[1]}]
create_generated_clock -name {clk_20} -source [get_ports {GCLK0}]-multiply_by 2 -divide_by 5 -master_clock {clkin} [get_pins {inst6|altpll_component|auto_generated|pll1|clk[3]}]
图3:正确约束后的时序分析报告
图4:起飞信号设计流程图
图5:通过I2C 通信方式实现健康管理数据传输示意图
约束完成后,在进行布局布线,观察时序报告,如图3 所示。
时序约束对于一个复杂的设计来说很关键,直接影响功能的实现,因此设计时需要根据时钟和关键路径进行合理约束,从而最大限度保证建立和保持时间,增强软件的可靠性。
图6:典型的在线升级系统设计框图
3 软件可靠性设计方法
FPGA 软件设计是系统可靠性设计的重点。由于FPGA 设计语言的多样性和灵活性,且每个设计师的设计风格和设计习惯不同,一个功能的实现可以有多种方法。但一个好的设计需要未雨绸缪,在实现功能的前提下,综合考虑可靠性及安全性,最大限度地针对能想到的各种异常分支,给出可靠的设计策略和方法,保证在异常情况下,软件也可以按照设计的流程进行,而不是出现“死机”“不响应”等情况,最大可能地减少异常情况带来的影响,至少能挽救的功能一定要保住。下面就几个关键电路给出可靠性设计建议。
3.1 起飞接口设计
起飞电路是遥测系统乃至整个系统中重点考虑的因素。为保障可靠性,该接口硬件上会使用双点双线输入,使用三路光耦同时接收起飞信号,光耦的输出连接到FPGA 的三个IO 管脚上。在进行FPGA 软件处理时,首先对三路信号使用FPGA 系统时钟进行滤波处理,去除N 个系统时钟周期内的高频干扰信号,N 根据系统时钟进行合适选择,若系统时钟为20MHz,N 一般设置为3~5,可以滤除150ns~250ns 的毛刺。一旦检测到起飞信号的上升沿,开始计数来对起飞信号进行合适的脉宽判断。通常遥测系统脉宽判断时间为20ms,不同系统根据对实时性的要求按照实际需求设定判宽时间。脉宽判断完成后,再对三路信号进行“三判二”处理,三路中有两路信号满足起飞信号判断标准即认为起飞信号到来,一旦满足判断条件即封锁该信号,直到飞行结束。起飞信号的软件设计流程如图4 所示。
通过采用上述方法对起飞信号进行处理,确保可靠接收到起飞信号,作为后续的时序控制和数据处理的时间零点。
3.2 指令冗余设计
对于一些关键的指令信号,软件需要在保证正确接收的情况下,避免误指令动作。需要对指令发送格式进行规定。通常地,在遥测系统中,指令种类和形式不是很多,大部分为数据传输,不需要判断。为了减少响应时间,指令长度一般设计为简单的两个字节。但为了保证指令可靠接收,使用三判二的方式处理。表2 中以串口RS422接口为例,列出了简单指令的发送格式,其中0xB8 为帧头,CMD为命令区分字。发送端先发高字节帧头再发低字节指令,每个指令字之间有一定的时间间隔,时间间隔可根据使用到的波特率进行合理设置,这样接收端可根据间隔区分目前传输的指令和下一条传输的指令,同时也避免了因连续发送造成的字节错乱的情况发生。接收端接收串口指令并进行超时判断,然后对接收到的三条指令进行三判二处理,满足两个指令正确即认为收到有效指令,执行相应操作。
该指令冗余设计方法为遥测系统常用设计方法,简单可靠。该方法只使用于传送指令,对于一个接口即要传输指令又要传输数据,则需要根据实际需求情况增加帧长度,用于区分指令和数据,收发双方按照协议进行处理,保证数据可靠接收。
3.3 健康管理设计
随着FPGA 规模增大以及SOC 技术的发展,FPGA 集成的IP功能越来越丰富。为了实时地监测FPGA 芯片内部的电压及温度,以及一些重要参数,设计时需要增加健康管理功能。可以通过遥测数据周期性的查看FPGA 的工作状态,出现问题时可以快速定位,提高调试效率,简化排故流程。Xilinx 的一些FPGA 芯片自带系统监测(SYSTEM MONITOR)功能,设计时需要将IP 核加入工程中进行设置和读取内部环境参数。若FPGA 不带有该功能,需要外置传感器和AD 采集芯片,对环境参数进行采集,然后插入到遥测数据帧结构中,发送给地面设备进行监测。
通常,多个FPGA 设备之间采用简单的通信总线形式,比如I2C、RS485、CAN 等进行健康管理数据通信。以I2C 总线为例,如图5 所示。设置时采用两条I2C 进行通信,实现热备份冗余设计。首先作为主控Master 在I2C 通道1 上每个T 周期查询一次结果,每隔T1 周期以此查询从设备Slave1、从设备Slave2 和从设备Slave3的状态,若某个从设备未响应,连续重试2 次,依旧无响应,则切换到I2C 通道2 上进行3 次重试,有一次成功则在这条总线进行其他操作,直到遇到问题,切换到I2C 通道1 上,以此类推,保证通信可靠性。
3.4 在线升级设计
FPGA 软件的一个重要特性是它具有重构性,可以远程实现配置数据的更新,更改软件,实现新的功能。该功能解决了产品在总装后无法在不拆卸的情况下更新FPGA 软件的难题,缩短了时间,大大节省了人力财力,提高了效率。针对遥测系统不断变化的需求,软件更新频率很高,因此该功能逐渐变为软件设计的基本要求,增强了产品的安全性和可靠性,大大提高了设计效率。典型的在线升级系统如图6 所示。
如图6 所示,一般地,目标系统和地面系统进行通信采用UART、1553B、Ethernet 等接口形式中的一种或多种,实现弹地数据之间的传输。这样就可以将地面系统中更改后的新的FPGA 配置文件通过上述接口传输到目标系统上的FPGA 控制器,接着FPGA控制flash 读写将配置文件正确写入到Flash 固定位置,从而实现数据流的更新。
在远程更新的时候,需要两个以上的多镜像来保护设计的稳定性和安全性。Xilinx 给出的方案为Multiboot 启动策略。Multiboot中至少两个镜像,分别为G 镜像(Golden)和M 镜像(Multiboot),G 镜像烧写后不再改变。两个镜像同时存在于flash 中,更新的时候只更新M 镜像,更新后直接使用M 镜像。当M 镜像更新出现错误的时候,则启动G 镜像。通过G 镜像中的设计来重新更新Flash中M 镜像部分,从而避免了因错误操作或异常断电等因素导致FPGA 彻底无法启动问题,能够保证在线升级程序的有效运行,可以再次进行软件升级操作。
4 结束语
本文针对航天遥测系统中设计到的FPGA 软件产品,提出了几点提高质量的可靠性设计方法和建议,主要包括设计平台的统一,对软件工程中设计到的IO 管脚配置和时序约束给出合理性设置和约束的建议;同时针对系统中常用到的起飞接口和指令传输设计给出了具体的设计方法,最后对提高可靠性的健康管理和在线升级设计给出了设计方法和建议,通过以上措施,可以有效提高FPGA 软件质量,增强系统可靠性。