一种基于FPGA的在线升级方案

第35卷第5期2020年10月
成都信息工程大学学报
JOURNAL OF CHENGDU UNIVERSITY OF INFORMATION TECHNOLOGY
Vol.35No.5Oct.2020
文章编号:2096-
1618(2020)05-0493-06一种基于FPGA 的在线升级方案
垚,李
(成都信息工程大学通信工程学院,四川成都610225)
摘要:一般对FPGA 程序升级,
需要使用下载器通过JTAG 接口与FPGA 连接,在一些不方便开盖的环境下,此种升级方案非常困难。基于XILINX 公司的XC6SLX9芯片,利用FPGA 的MultiBoot 将多个配置文件下载入Flash 中的特性,介绍一种基于Flash 、
FPGA 和RS232串行通信的在线升级方案。FPGA 通过SPI 总线配置Flash ,ICAP 接口使FPGA 跳转到Flash 的对应地址读取烧写到Flash 中的.bin 文件。方案可在不增加额外器件且不开盖的情况下仅通过一个RS232通信接口,上位机软件就能完成对用户设计的功能程序或产品程序的升级,对程序存储芯片Flash 的操作均由FPGA 内部逻辑实现。结果表明,该方法有效且具有很好的移植性和可扩展性。
词:SPI ;Flash ;RS232串行通信;ICAP ;MultiBoot
中图分类号:TP332.1
文献标志码:A
doi :10.16836/j.cnki.jcuit.2020.05.002
收稿日期:2019-11-26基金项目:国家自然科学基金资助项目(61601065)
0引言
如今,电子产品的复杂度和集成度越来越高,产品
的迭代速度也在变快。FPGA 以其低时延、速度快和
可重配置的优势已经被应用在通信、工业控制和图像
处理等领域。这些领域的程序算法为适应产品需求的提升也在不断更新。因此对FPGA 能进行在线升级从而快速更新产品功能的需求被提出。
传统的对FPGA 配置的方案需要对设备进行拆卸,使用JTAG 接口对FPGA 进行重配置进而对程序进行升级。由于JTAG 模式是将程序配置到FPGA 的SRAM ,掉电丢失。Flash 作为非易失的存储器,可以用来存储程序,不过需用相应的开发工具将FPGA 硬件综合生成的比特流文件转换为.msc 文件然后再烧写到Flash 中。这种做法需要对产品进行拆卸且需要专业技术人员进行操作,升级成本大。为实现便捷地对FPGA 相应产品的程序进行升级,提出一种用上位机软件的人机交互界面,将二进制格式的程序文件通过SPI 总线固化到Flash 中完成对FPGA 进行在线升级的方法。此方法操作简单,只需厂家提供对应程序的二进制格式的升级包,用户自身就能完成对FPGA 程序的升级,且掉电程序
不丢失。此方案操作简单,用户自身即可完成,大大降低了升级成本。龙芯一体机
1系统方案设计
采用Spartan-6系列的XC6SLX9[1]
芯片,该芯片有
144个引脚,Flash 又称闪存,属于一种数据非易失的
存储器,在掉电的情况下Flash 内部数据可以得到保存,因此可以用其作为FPGA 的配置芯片。SPI 总线可作为FPGA 与Flash 芯片通信的桥梁[2],连接如图1所示。SPI 总线时序的模式有两种,如图2所示
图1FPGA 与Flash 连
线示意图
图2SPI 模式
SPI 总线由4根信号线构成[3],分别为cs_n 片选
信号线,该信号线拉低表示FPGA 选中对应的器件、
Sck 为时钟信号线,SPI 总线就是根据此时钟传输数据。Sdi 和Sdo 都为数据信号线,数据在此数据信号线上进行串行传输,在Sdi 信号线上数据从FPGA 芯片
传输到Flash 中,
Flash 中的数据传输到FPGA 中则是通过Sdo 信号线。两根数据线上串行数据的切换和锁存由Sck 时钟线控制。
选用的Flash 芯片为M25p16。M25p16属于意法半导体公司生产的Flash 芯片,其最大的时钟频率为50MHz 。设计进行擦除时采用12.5MHz 的时钟,即sck 的时钟频率为12.5MHz 。该款Flash 芯片的存储空间为16Mbit ,每个地址内存储1byte (8bit )的数据,
共2M 的存储深度,其地址分为32扇区(sector )、每个扇区包含256页(page )、每一页包含256字节(byte ),
因此该Flash 芯片需要用到21位地址线,加上扩展的3bit 地址线,一共用到24bit 地址线。系统包括上
位机软件、串口、FPGA 、Flash 芯片和LED 灯,图3为系统框图。在图3中,当FPGA 板卡接通电源,自动加载Flash 中的程序开始配置FPGA ,同
时LED 灯亮,
LED 灯点亮期间若UART 接口接收到用户通过PC 端的上位机软件发送的.bin 文件,即可完成
对Flash 中程序的在线升级。当FPGA 板卡上电后,自动加载Flash 中的程序开始配置FPGA ,同时LED 灯
亮,
LED 灯点亮期间若UART 接口接收到用户通过PC 端的上位机软件发送的.bin 文件,即可完成对Flash 中程序的在线升级
图3
系统框图
2FPGA 内部模块设计
FPGA 的顶层文件包括10个模块,图4为FPGA
内部构成框图,复位信号可对FPGA 全局进行复位,时
钟的控制有PLL 模块,
FPGA 通过SPI 总线发来的数据由串口接收模块进行串并转换后缓存到FIFO 中。Flash 控制模块对来自串口接收模块的数据按照指定的数据包协议进行解析,使FPGA 跳转到对应的擦除读写模块从而对外部的Flash 进行擦除读写操作。程序升级计时配置模块预留给用户20秒的升级时间,在20秒内若检测到串口接收模块的擦除指令,即对Flash 对应区域的程序进行擦除升级。重新上电板卡,20秒内不对程序进行升级,FPGA 启动ICAP 跳转,跳转到Flash 对应区域加载程序
图4
FPGA 内部构成框图
2.1Flash 擦除模块设计
对Flash 进行写入数据时,首先需要初始化Flash ,即对Flash 中已经存在的数据进行擦除。Flash 的擦除
分为扇区擦除(sector erase )和全擦除(bulk erase )[4]
扇区擦除又称为SE (sector erase ),在进行SE 之
前需要给出一个写使能指令(WREN )[5]
kawd-445,
然后再进行扇区擦除。首先需要将cs_n 置为低,然后产生12.5MHz 的时钟sck ,Flash 根据sck 的上升沿锁存sdi
的数据,因此给出的sdi 的每一位最好都能被sck 的上升沿采集到稳定的时刻,即sck 的上升沿对着sdi 每一
位数据的中心位置,
WREN 的指令为0x06。由于在WREN 状态下只需要发送8bit 数据,因此只需要产生8个可以锁存sdi 数据的sck 上升沿即可,在确定sdi 数据被锁存结束后,就可将cs_n 拉高。图5为Flash 扇区擦除仿真
波形图,可以看出当来了擦除标志后,首先进入WREN 状态,拉低cs_n 。在WREN 结束后,cs_n 需要被拉高,为了确保WREN 被Flash 存储,cs_n 拉高的时间至少需要100ns ,之后再次拉低cs_n 为发送SE 指令做准备。进行擦除设计时首先拉低cs_n 选中Flash ,然后发送SE 指令(0xd8)以及3个byte 的地址位,根据所发送的bit 个数给出对应数量的sck 上升沿,并确保每个sck 的上升沿都能采集到sdi 稳定的时刻。由于是扇区擦除,因此给出的地址位只有高8bit 有效,低16bit 无论是何值都对该扇区的擦除没有影响。在给出最后1byte 地址位后,确保被选中的扇区可
以被擦除,
cs_n 需要保持至少3秒高电平的状态
。图5Flash 扇区擦除的仿真波形
2.2Flash 写模块设计
Flash 页写功能,PP (page program )命令为
0x02[6]。同擦除指令一样,需要在发送PP 指令之前,执行Write EN 操作,当执行完PP 后Write EN 会自动
复位,所以每次PP 之前必须发送Write EN 操作。模块中首先给写入页起始地址,将要写入Flash 的一页数据缓存到FIFO 中,缓存完毕后根据给出写Flash 标志启动Flash 页写操作,该功能只支持单页写,多页写可以在本模块外增加额外控制缓存和页写标志pp_flag
494成都信息工程大学学报第35卷
实现
[7]
Flash 写控制器时序与擦除控制器类似,这里写入
Flash 的字节数是由PP 指令1字节、地址3字节和数据256字节组成,最后额外增加1bit 的cs_n 为低的冗余周期,一共是2081个比特周期。在执行页写PP 指令之前就把需要写入Flash 一页的256字节的数据缓存到FIFO 缓冲器中,当来了页写标志pp _flag 就从FIFO 缓冲器中读取一个字节数据通过SPI 总线发送
到Flash 中,直到一个页数据发送完毕。从FIFO 读取
的8位数据提前一拍读取并赋值给移位寄存器,最高位即输出到sdi 线中,其他7位需要按照pp_shift_flag 标志移位到最高位并输出到sdi 中。当8bit 数据都移位到sdi 数据线中的同时读取下一个8位数据,以此类推读取全部的FIFO 中缓冲的256字节数据。图6为Flash 写模块的仿真波形图
图6Flash 写模块的仿真波形图
2.3Flash 读模块设计
Read data byte 读数据字节指令,简称RDB 指令,
指令码为0x03[8]
读指令可以读取Flash 地址空间的任何一个字节数据,不受扇区和页的限制,而且可以连
续读取出所有数据,读数据首先要给出读命令码,然后紧跟24bit 的起始地址,之后会在sdo 行输出读出数据,直到cs_n 中断读出数据操作,否则地址在Flash 内部递增读出数据
[9]
只需给定读的起始地址和需要读取的数据的数量,读控制器就会自动从Flash 读出数据缓存到FIFO
中,以供其他模块读取调用。根据Flash 读时序可知
读操作无需前置Write EN 操作,只需要分频计数器和比特计数器即可完成设计。通过串口发送的字节数推导出计数器的最终计数值,把sdo 上的数据根据分频计数器和比特计数器进行移位锁存就可以实现串转并操作并完成FIFO 的数据写入。图7为Flash 读模块的仿真波形
图7Flash 读模块的仿真波形
2.4Flash 擦除读写控制器设计
完成了对Flash 擦除和读写模块的设计后,还需设计一个对Flash 的擦除和读写进行控制和仲裁的模
块。模块中串口给FPGA 发送指令,
FPGA 解析指令后,进而对Flash 进行对应的操作。由于要与上位机串口交互,模块中制定了一种包括3种数据包类型的协议,分别为擦除命令包、写命令
包和读命令包以及读数据返回包[10]
如表1 4所示。当串口传递的数据为0xcc 跳转到WRITE 状态,
WRITE 数据结束跳回IDLE 状态。当串口传递的数据为0xee 跳转到ERASE 状态,完成擦除后跳回IDLE 状
态。当串口传递的数据为0xdd 跳转READ 状态,完成
读取数据后跳回IDLE 状态,命令解析状态机[11]
如图8所示。
Flash 擦除读写控制器的功能框图如9所示,如何
把sck 、cs _n 、sdi 、sdo 从Flash 擦除(Flash _se )、读
(Flash_rd )和写(Flash_pp )模块中引入Flash 擦除读写控制模块(state_ctrl ),
并把这些信号在不同的时刻正确的路由到顶层接口与Flash 通信是关键。Flash 擦除模块和Flash 写模块中sck 信号在空闲无数据时间保持为0状态,而cs_n 空闲无数据状态保持为1,因此可以通过组合逻辑将两个信号输出到顶层。在state ==READ 状态下正在读可以直接把state
5
94第5期万
垚,等:一种基于FPGA 的在线升级方案
==READ作为Flash读模块路由到顶层的条件。sdo 信号只有Flash读模块用到所以直接路由到Flash读模块中。
经过串口调试助手验证,发送相应的指令能够完成对Flash的擦除和读、写操作。
表1擦除命令包
字节编号协议字段定义
00xee擦除包头
1Addr[23:16]擦除地址高字节
2Addr[15:8]擦除地址中字节
3Addr[7:0]擦除地址低字节
表2读命令包
字节编号协议字段定义
00xdd读包头
1Addr[23:16]读地址高字节
2Addr[15:8]读地址中字节
3Addr[7:0]读地址低字节
4Rd_len[15:8]读长度高字节
5Rd_led[7:0]读长度低字节
超低碳钢表3读数据返回包
字节编号协议字段定义
0Data0第一字节
1Data1第二字节
2 rd_len Data2 end第三字节至最后的字节
表4页写命令包
字节编号协议字段定义
00xcc写包头
假牙加工1Addr[23:16]写地址高字节
2Addr[15:8]写地址中字节
3Addr[7:0]写地址低字节
4 259W_data[7:0]写数据256
字节
图8命
令解析状态机
图9功能总体框图
2.5ICap在线升级MultiBoot
Multiboot start address是指通过ICAP接口使FP-
GA跳转到Flash的对应地址把程序的二进制文件烧
录到Flash中来配置FPGA[12]。当MultiBoot start ad-
dress读取.bin文件失败或跳转失败时,就回到Fall-
back start address,这个地址设置为0x000000,这样跳
转失败回到0地址继续加载,如图10所示。区域1中
0x000000为起始地址,FPGA上电自动从此地址加载
数据,区域1中的程序执行读写擦除Flash,因此区域1
中的程序就不能被擦除和升级,只对区域2的程序升
级。区域2的地址为0x100000。ICAP(the internal
configuration access port)即内部配置访问端口[13],如
图11所示
图10Flash
程序区域分布图
图11ICAP实例化原语
Device_id指的是器件的编号,需要根据不同的芯
片型号选择不同的ID[14]。BUSY和O属于输出,无需
管理。CE(输入)为ICAP使能信号,低有效,在整个
过程中需要保持为低;CLK(输入)时钟;I(输入)配置
的数据,,需要按照表5步骤传输数据,如图12所示。
其中opcode指的是器件read的命令(基于SPI的
Flash read命令为0x03)。在传输这些配置数据时,需
要将这些配置数据按照byte为单位,进行高低位互
694成都信息工程大学学报第35卷
换。按照ICAP 具体的操作指令指定相应的跳转地址,程序即可跳转到对应的存储空间[15]
表5
配置命令字
Configuration Data (hex )万维视频网
Explanation
FFFF Dummy Word AA99Sync Word 5566Sync Word
3261Type 1Write 1Words to GENERAL_1XXXX MultiBoot Start Address [15:0]3281Type 1Write 1Word to GENERAL2XXXX Opcode and MultiBoot Start Address [23:16]32A1Type 1Write 1Word to GENERAL3XXXX Fallback Start Address [15:0]32C1Type 1Write 1Word to GENERAL4XXXX Opcode and Fallback Start Address [23:16]30A1Type 1Write 1Word to CMD 000E IPROG Command 2000
Type 1NO OP
上电后自动加载区域1的程序,
此时开始计时,如果20秒内没有检测到串口发送的擦除指令,即用户没有执行升级操作,
ICAP 接口控制FPGA 跳转到Flash 的区域2中加载程序。如果希望再次升级的话必须重新给板卡上电使得程序回到区域1中。图12为ICAP 接口的跳转程序的状态机。其中在S_LOW_ADDR_BACK 状态下需给出区域1的起始低16位地址0x0000;在S_HIGH_ADDR_BACK 状态下给出8位读操作码和起始高8位地址0x0300;在S_LOW_ADDR状态下需给出区域2的16位地址0x0000,在S_HIGH _ADDR状态下需给出8位读操作码和高8位地址,这里为0x0310。其余部分对照手册配置即可
图12
ICAP 指令状态机
地锚机3实验结果
如图13上位机软件所示,
首先通过上位机软件的加载BIN 选项将Flash 读写擦除控制程序的.bin 文件选中,镜像地址选择0x000000及对应烧写到Flash 中地址为0x000000的区域,所有配置完成后点击下载bin 的按钮即开始往Flash 中下载程序,进度条实时显示下载进度。下载完成板卡重新上电后自动加载Flash 此地址区域的程序。在预留的可升级时间内把需要升级的用户程序以相同的操作通过上位机软件固化到Flash 的0x100000中,完成对Flash 中程序的升级,如图14所示。选用的Flash 芯片最大存储容量为16Mbit ,其中划分了8Mbit 的空间存储用户程序,所以.bin 文件最大支持8Mbit 。此区域可以灵活划分,只要预留出足够区域存储Flash 读写擦除控制程序即可。结果表明,板卡重新
上电后,待升级时间结束,FPGA 会自动加载升级后的程序。实验表明,该设计操作简单,能够便捷的完成对
FPGA 的在线升级工作
图13
固化Flash
擦除读写程序
图14固化升级程序
4
结论
提出一种用上位机软件的人机交互界面,将二进
7
94第5期万垚,等:一种基于FPGA 的在线升级方案

本文发布于:2024-09-24 16:25:04,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/278075.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   程序   擦除   进行   地址   升级
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议