以Flash控制器为核心的FPGA在线更新功能实现设计流程介绍

0 引言
近些年来,由于其灵活可配置性及成本的降低,现场可编程门阵列(field programmable gate array,fpga)在嵌入式系统中应用越来越广泛,不论产品的初期研发或是后期维护都不可避免地需要频繁更新fpga程序。传统的jtag方式更新fpga程序的方式是通过开发软件将需固化的文件写入nor flash器件。当系统很复杂且需要更新的fpga数量较多时,jtag方式更新fpga程序则费时费力且还需拆结构。若在fpga内部通过逻辑代码搭建一flash控制器实现对flash器件的读写操作,即可并行实现系统内每片fpga对配置文件的在线更新,大大缩短程序固化时间。本文依托于xilinx公司的fpga和spasion公司的nor flash,详细介绍了flash控制器设计和在线加载功能的实现方法。
1 fpga配置方式
以xilinx virtex6 系列fpga为例,对配置文件的加载方式有串行flash、并行flash、jtag方式等,其中最常用的是并行flash方式(byte peripheral interface parallel flash mode,bpi),其配置模式如图1所示。
一种实际的fpga与nor flash硬线连接方式如图2所示。
无论是通过jtag方式还是通过软件操作实现程序更新,都是通过控制这些读写使能信号及地址线实现配置文件的写入,fpga掉电重启之后再从flash取出配置数据从而实现加载。本文提出的fpga在线更新程序的方式则是通过fpga控制逻辑驱动flash的数据和地址,从而为多块fpga并行更新程序的实现提供了前提。
2 flash控制器设计
flash器件的基本操作包括读、写、擦除等,这些操作都是通过向相应的命令寄存器写入特定的指令来实现的,这些指令的写入通过操作与fpga相连的片选信号(ce_n)、写使能信号(we_n)、读使能信号(oe_n)、地址总线(addr[23:0])和数据总线(dq[15:0])实现。
以目前市场上常用的spasion公司的s29gl-p系列nor flash为例,通过fpga实现的控制器外部接口如图3所示。
其中,start信号用于启动控制器模块对flash器件实现读写操作,在启动之前,须先告知flash配置文件大小和配置文件在flash存储空间的首地址;data_req、data_in和rd_data_count信号用于与一前端fifo实现数据交互,配置文件先缓存到fifo中,然后由控制器负责取出并写入flash器件;config_status信号用于指示程序更新是否完成。
该flash控制器按时间上的先后顺序分别实现了对flash器件的读id、擦除和写缓冲操作,下面将分别进行简要叙述。
每次对flash进行基本的读写操作之前,会对flash芯片进行读id操作以检验器件的好坏,读id涉及的主要操作为向特定寄存器写入相应的解锁指令,然后再进行多操作读出相应的寄存器值,其时序图及读结果如图4所示。
确认了芯片id无误,即可进行正确访问,首先对flash芯片进行擦除操作。flash芯片擦除可分为两种:整片擦除和扇区擦除。由于实际使用时并未用到整块flash存储空间,而是根据配置文件的大小选择合适的扇区大小存储配置文件,所以设计中采用的是扇区擦除方式,时序如图5所示。
当成功写入擦除操作指令之后,芯片会进入一个较长的周期等待擦除操作的完成,该期间无法对芯片进行复位之外的其他操作。
完成了擦除操作之后,即可向flash写入配置数据,其对应的写缓冲时序如图6所示。
擦除和读写的过程中,地址将进行自动累加且起始地址可变。flash的写操作可为单字写和缓冲写两种,由于缓冲写最大一次可向flash写入32个字,为了最大化写入速度,选择缓冲写方式;flash的读操作分为单字读和按页读两种,由于flash读数据速率较高且系统对读速率没有太高要求,本文选择单字读方式。
3 工程应用及性能测试
以一实际项目工程为例,系统中具有10块fpga进行程序更新,其在线加载功能系统架构如图7所示。
系统主控cpu运行在linux系统下,cpu通过以太网与远程计算机进行通信调试,同时通过pcie或srio高速总线向每块fpga下发配置数据,最后再由flash控制器完成数据的写入。如前文所述,一次写缓冲操作的数据量为32个字,而配置文件的大小有可能不是32个字的整数倍,所以还需要应用软件对配置文件进行补齐操作。单个fpga在线加载流程简要叙述如图8所示。
更新单块fpga程序时,以一实际测试的3.47 mb大小的配置文件为例,经fpga在线更新程序固化的时间和使用ise14.7软件jtag方式固化的时间如表1所示。
flash芯片手册中给出的典型擦除和写缓冲时间分别0.5 s和480 μs,则可计算出理论上3.47 mb大小的文件固化所需的典型时间约为41 s。由于器件等因素影响,实测时用时往往大于该时间,但总体来说,使用在线更新方式的耗时要比用jtag方式耗时更少。
而当更新系统中的10块fpga时,由于每块fpga均可同时进行在线更新操作,程序固化所消耗的时间与单块fpga程序更新时间开销大致相当,可见并行在线更新方式相较于传统jtag方式无疑可以大大缩短时间。
4 配置文件不断电加载和备份方法
每次更新完配置之后,通常做法是对fpga进行断电重启实现重新加载,但工程应用时断电可能会影响系统其他模块的正常工作。为使fpga在不断电的情况下自动加载更新完的配置程序,可通过配置fpga芯片的program_b信号来实现,bpi模式下的时序如图9所示。
考虑到若在配置过程中fpga发生断电等异常,则flash中的配置文件损坏,fpga将无法实现加载,需要重新使用jtag方式烧写配置文件。为防止该种情况发生,可分配flash的一块区域用于备份配置文件,发生fpga无法正常加载的异常时,可读取该备份配置文件实现fpga再次正常加载,但前提是该部分flash存储空间预先固化了带有fpga在线更新功能的程序。
5 结论
本文利用fpga逻辑设计了一款flash控制器,实现了fpga在线更新功能,由于fpga直接操作flash,因此相比传统fpga程序更新方法具有更新速度快、硬件电路精简、易于系统集成等优点,同时能够实现复杂系统多块fpga并行更新程序,大大节省了程序固化时间,便于项目前期开发及后期排故调试。
参考文献
[1] xilinx ug360,virtex-6 fpga configuration user guide[eb/ol]。[2015-11-18].http://www.xilinx.com.
[2] spansion.s29gl-p mirrorbit flash family datasheet[eb/ol]。[2009-11-20].http://www.spansion.com.
[3] 于乐,王嘉良。易于移植的fpga在线更新控制器设计[j]。航空电子技术,2015(4):47-50.
[4] 杨鹏。基于linux系统的fpga芯片在线加载的设计和实现[j]。电子设计工程,2015(6):161-164.

可控硅-向强电冲击的先锋
城际铁路与市域铁路过轨运行适应性分析
交流接触器的压敏电阻作用和选用
基于RFID技术的电子件烟箱系统解决方案
包揽七项葵花奖 参编多项标准 萤石领跑智能家居+物联网云平台行业
以Flash控制器为核心的FPGA在线更新功能实现设计流程介绍
DIY修理PCMCIA插槽挡板
一机难求也不要悲伤?小米mix2:98%屏占比,6千起售,两个利好消息!
直流电机如果老化了它将会出现哪些问题
许家印国内布局汽车产业 积极开拓生产制造及销售渠道市场
我国半导体产业公司聚能晶源将GaN外延材料项目投产8英寸GaN
变压器和稳压器
通信技术对于物联网应用的价值
浅析KUKA数学标准功能
利用土壤水势仪来提升农业灌溉科学化的效率
边缘分析如何补充云计算,为企业提供实时洞察和解决方案
【服务器数据恢复】5节点Lustre文件系统RAID5数据恢复案例
能源储存技术均化成本降低,缩小与抽蓄水电之间差距
牛津大学研究人员正在利用人工智能开发的新工具来预防心脏病
折叠屏是什么?FlexPai 2上市打破认知