一.问题背景 
在实际工程应用中,我们时常会遇到为解决某个老产品的BUG,需要在工程现场更新设备的FPGA代码,或者参加电信测试时需要现场升级设备FPGA程序以便于调试。公司现阶段所用的Altera FPGA程序代码一般存放于芯片配套的FLASH存储器中,而常见的对印制板上FLASH编程有几种方法,原始的方法是使用编程器,这种方法需要要将芯片取下,十分不便,或者通过JTAG接口连接到PC机上,但需要专用下载软件(一般由芯片生产厂商提供)。在测试现场或调测机房现场,要找到FPGA的专用下载线是比较困难的,且Altera FPGA的专用下载软件并不是每个PC设备上都有的。有时仅为了更新一个FPGA的程序就需要研发或客服人员亲自到现场去烧写程序,这既不便捷,也使得设备维护成本大大增加。 
经过可行性与成本的考虑,我们找到一种既方便实用又低成本的方法来实现FPGA程序的在线现升级。即在MCU中(单片机或ARM均可)用软件来模拟XModem协议,将程序文件传输到FPGA的FLASH中。这种方法使用WINDOWS自带的超级终端软件来传送文件,无需安装专用软件,硬件支持仅需要一根通用串口线,只要在目标板MCU上增加一段实现XModem协议传输的代码,就可以方便的实现FPGA程序下载了。这种特点不仅方便了客服人员,也给研发和生产人员在现场调试和软件升级、修改中带来极大方便。 
二.XModem协议简介 
XModem协议是一种在串口通信中广泛用到的异步文件传输协议。协议以128字节块的形式传输数据,每个块都使用一个校验过程来进行错误检测。标准XModem协议帧格式如图1 所示: 
________________________________________________________________ |  |   |     |   |   | |  SOH | 信息包序号 |   信息包序号的补码 |  数据区段  |   校验   | |_______ |___________ |___________________ |___________ |___________ | 
图1  标准XModem协议帧格式 
XModem协议传输逻辑: 
对于标准XModem协议来说,如果传送的文件不是128的整数倍,那么最后一个数据包的有效内容肯定小于帧长,不足的部分需要用CTRL-Z来填充。 
传输由接收方启动,方法是向发送方发送"C"或者NAK(注:这里提到的NAK是用来启动传输的)。XModem协议支持2种校验,接收方发送NAK信号表示接收方打算用累加和校验,发送字符"C"则表示接收方想打算使用CRC校验。当接收方发送的第一个"C"或者NAK到达发送方,发送方认为可以发送第一个数据包,传输已经启动。发送方接着应该将数据以每次128字节的数据加上包头,包序号,包序号补码,末尾加上校验和,打包成帧格式传送。 
发送方发了第一包后就等待接收方的确认字节ACK,收到接收方传来的ACK确认,就认为数据包被接收方正确接收,并且接收方要求发送方继续发送下一个包。接收方首先确认数据包序号的完整性,通过对数据包序号取补,然后和数据包序号的补码异或,结果为0表示正确,结果不为0则发送NAK请求重传(注:这里NAK用来告诉发送方重传,而不是用来启动传输)。接收方确认数据包序号正确后,然后检查是否期望的序号。如果不是期望得到的数据包序号,说明发生严重错误,则发送一个CAN来无条件中止传输。如果接收到的数据包的包序号和前一包相同,那么接收方会忽略这个重复包,向发送方发出ACK,准备接收下一个包。接收方确认了信息包序号的完整性和是正确期望的后,只对128字节的数据区段进行算术和校验,结果与帧中最后一个字节比较,相同发送ACK,不同发送 NAK。

如果发送方正常传输完全部数据,需要结束传输,正常结束需要发送方发送EOT字节通知接收方,接收方回以ACK进行确认。虽然数据包是以SOH来标志一个信息包的起始的,但在SOH位置上如果出现EOT则表示数据传输结束,再也没有数据传过来。当然接收方也可强制停止传输,当接收方发送CAN字节给发送方,表示接收方想无条件停止传输,发送方收到CAN后,不需要再发送EOT确认。XModem协议相关控制字符含义详见附录1。

三.Altera FPGA在线升级的硬件实现 
Altera FPGA用JTAG在AS模式下的程序烧写,是先将程序文件*.pof下载到芯片的FLASH中存储起来,每次重新上电后,程序文件会重新由FLASH载入到FPGA芯片中。Altera FPGA常用FLASH芯片为EPCS1和EPCS4,这两个FLASH芯片除了容量不一样,其他方面几乎完全相同,在引脚上也完全兼容。 
 
图2  FPGA  AS模式烧写硬件连接图 
图2所示为FPGA用JTAG在AS模式下烧写程序文件的硬件连接图。我们需要用MCU模拟AS模式的硬件操作方式,通过XModem协议,将FPGA代码文件传输到FLASH中。

AS模式烧写FPGA时,与7个信号相关,其中DATA、DCLK、nCS、ASDI是FLASH的四个SPI信号,分别代表FLASH的数据输出、读写时钟、片选、数据输入。MCU也需要通过这四个引脚,将数据传输到FLASH中去。另外三个信号CONF_DONE、nCONFIG、nCE分别是烧写FLASH时,需对FPGA进行控制的三个信号。 
nCE为FPGA的芯片使能信号,nCONFIG为低电平时复位FPGA的信号,CONF_DONE为FLASH载入到FPGA完成信号。在AS烧写模式,nCONFIG=0, FPGA复位,nCE=1,使FPGA芯片不被选中,CONF_DONE=0,下载开始;下载结束时,nCONFIG=1,nCE=0,进入代码由FLASH到FPGA的载入过程,当载入完毕后,CONF_DONE=1。 
在对FLASH读写时,需要注意的是,EPCS1/EPCS4区别于一般的FLASH,有其自身对应的操作码,不同的操作码代表对FLASH进行不同的操作。如表1所示,有写使能、写禁止、读芯片状态、读字节、读芯片ID、写芯片状态、写字节、擦除整片、擦除片区这几个操作码。对EPCS1/EPCS4进行任何操作,都需在片选变低后,首先写入对应的操作码,然后是地址和数据。此外,在写字节、写状态、片区擦除、整片擦除之前必须要先进行写使能操作。上电、写字节、写状态、片区擦除、整片擦除完成后需要进行写禁止操作。 
表1  EPCS1/EPCS4操作码 
 
四.MCU中的软件实现 
1. 软件流程 
在MCU软件实现FPGA在线升级的过程中,除了对FLASH的读写,最主要的部分是通过模拟XModem协议,将文件传输到FLASH中。整个传输过程需同时遵循XModem传输逻辑以及EPCS1/EPCS4的读写规则。软件流程如图3所示:

(1)将*.pof文件用UltraEdit编译软件打开,如图4所示,在QuartusⅡ生成的*.pof烧写文件中,最前面一段是Quartus的版本等与代码无关的信息,可将图4中红色方框部分删除,直到第一行全‘FF’开始之前,将第一行全‘FF’为代码的起始行。 
 
 
图4  *.pof烧写文件起始 
(2)如图5所示,*.pof文件中,可用代码结束后,是大片的全‘FF’无用代码。可将这些全‘FF’保留15~20行,以保证XModem传输128字节的完整性,将其余多余的全‘FF’全部删除。 
 
图5  *.pof烧写文件结束 
(3)将无效代码删除后,可将新文件按自定义命名,‘另存为’后缀*.bin的文件即可。

3. 反相传输 
我们通常的读写习惯或SPI的读写大多是由字节的MSB开始,LSB结束。按照此种方式对Altera FPGA的FLASH进行XModem传输,传输成功后,FPGA确并没有启动。通过将用JTAG烧写到FLASH的代码用编程器读出,我们发现了问题所在。 
图6、图7所示为同一序列段代码的截取,图6为QuartusⅡ生成的*.pof烧写文件的代码,图7为通过烧片器从FLASH中读出的代码。通过观察,我们不难发现,这两段代码中的每一个字节均是互为反向的,即MSB与LSB的位置是相反的。

在将FLASH进行XModem的传输中改为由LSB开始传输,传输完成后,FPGA运行正常。因此,我们需要注意,在对EPCS1/EPCS4进行XModem传输时,应先从LSB开始,MSB结束。

通过MCU实现Altera FPGA在线升级相关推荐

  1. fpga在线升级 linux_Xilinx FPGA程序升级

    Xilixn FPGA提供了一种在线升级的方式,可以通过ICAP指令实现.ICAP(Internal Configuration Access Port) 指的是内部配置访问端口,其主要作用是通过内部 ...

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

    0 引言 近些年来,由于其灵活可配置性及成本的降低,现场可编程门阵列(Field Programmable Gate Array,FPGA)在嵌入式系统中应用越来越广泛,不论产品的初期研发或是后期维护 ...

  3. fpga在线升级 linux_仅5000行Verilog代码、可在FPGA上跑轻量级Linux系统的RISC-V内核

    本文发布于www.hackster.io,由东京理工大学的计算机学院开发,专用于教学与加速用(苏老师也一直认为这是RISC-V当前的主要方向). 目前市场上开源的RISC-V内核已经很多,但很少有公开 ...

  4. fpga在线升级 linux_2011/12/16 linux主机名 用户密码、静态IP设置及通过SPI实现FPGA的在线升级...

    代码量不大,而且有参考,但是这段代码有几点需要提醒注意一下:对于指针的认识应该清楚,指针p加1指向的地址空间到底是加了1字节还是4字节,是由指针类型和平台决定的,不同类型指针的转换也要熟悉:大端小端存 ...

  5. 基于FPGA的在线升级

    基于FPGA的在线升级 在线升级的意义 在线升级的策略 整体框架 总结 参考文献 结束语 在线升级的意义 首先什么是FPGA的在线升级? 所谓FPGA的在线升级其实就是不对FPGA进行常规意义下的下载 ...

  6. ALTERA系列的FPGA通过RS232串口在线升级

    ARM系列的芯片(例如STM32系列)可以通过YMODEM协议实现在线升级,在芯片中写入BOOT程序.APP程序就可以实现.那FPGA可以这样做吗,答案是可以的.要想搞清楚流程就必须了解FPGA的启动 ...

  7. FPGA远程更新-在线升级

    title: FPGA远程更新/在线升级 date: 2021-03-03 22:00:00 tags: FPGA ALTERA 远程更新/在线升级 categories: FPGA 1.摘要 对最近 ...

  8. FPGA远程固件在线升级

    FPGA远程固件在线升级 1.摘要 对最近做的FPGA远程更新/在线升级做一个总结.一般在代码开发阶段,我们使用JTAG烧写代码,但当产品投入到实际使用过程中,难以再用JTAG进行固件更新.所以需要开 ...

  9. NB-IOT开发|nbiot开发教程《五》nbiot(移远BC26)电信物联网平台实现MCU固件在线升级(STM32L051+BC26)

    嵌入式开发中我们要时刻保持代码的高效与整洁看之前,先点赞 好习惯,要养成 一.前言 嵌入式开发中我们要时刻保持代码的高效与整洁.为什么要有在线升级和为什么要进行在线升级,在这不多说,产品的开发中,在线 ...

最新文章

  1. Facade Pattern
  2. 怎样从10亿查询词找出出现频率最高的10个
  3. (二)微服务分布式云架构 - spring cloud整合企业架构的技术点
  4. 水木-机器学习推荐论文和书籍
  5. Sql 最简单的Sqlserver连接
  6. 年终将至,回顾我们一起走过的 2020
  7. atoll找不到标识符c语言,C/C++编程笔记:C++中的atol,atoll和atof函数
  8. sql语句分组mysql_以数据库字段分组显示数据的sql语句(详细介绍)
  9. 亿级大表在线不锁表变更字段与索引
  10. SQL Server 设计开发系列(文章索引)
  11. 2011总结与2012展望
  12. React Router 全部
  13. linux find命令按文件内容查找,linux下的find文件查找命令与grep文件内容查找命令...
  14. Python爬虫,爬取2020年软科中国大学排名并进行数据清洗与可视化输出
  15. 360全景拍摄用鱼眼镜头还是广角镜头?有什么区别?
  16. 心跳重连机制(登录)
  17. Linux的DNS设置
  18. 第二眼美女、IEO 和区分 FIND
  19. 水至清则无鱼,人至察则无徒
  20. 博弈论——非合作博弈 什么是纳什均衡

热门文章

  1. 微软必应词典客户端 案例分析
  2. FL Studio12中Fruity Blood Overdrive插件使用教程
  3. 运维工程师新人培训材料(zz)
  4. Google首席工程师Joshua Bloch谈如何设计优秀的API
  5. 第六章 Arm 微架构「System」
  6. Android 沉浸式模式
  7. 地面无人系统人机交互关键技术
  8. 图论 物联网_物联网工程题目 物联网在医疗领域的应用
  9. 亮亮自己制作的搜狗输入法皮肤
  10. 【编程题】【Scratch一级】2021.06 打篮球