通过MCU实现Altera FPGA在线升级

2023-05-16

一.问题背景 
在实际工程应用中,我们时常会遇到为解决某个老产品的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结束。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过MCU实现Altera FPGA在线升级 的相关文章

  • Windows 11 系统下载安装 教程

    关 注 郑州行疆户外 订阅号 xff0c 回复 win11 xff0c 获取win11系统下载链接 xff0c 安装教程 说明 Windows11系统安装教程 xff0c 这里使用VM虚拟机演示具体安装教程 xff0c 如果是新手 xff0
  • Windows 11 TPM2.0问题及解决方法

    关注 郑州行疆户外 订阅号 回复 win11 xff0c 下载 windows11系统 回复 问题 xff0c 查看 windows11安装过程中遇到的问题及其解决方法 随着2021年6月24日 xff0c 微软正式发布会上确定windon
  • linux的dma驱动

    硬件平台 xff1a TI的3530 内核 xff1a linux 2 6 36 功能 xff1a 将fpga的数据从内存的一个地方复制到内存另一个地方 初学dma感到很是吃力 xff0c 编写的内核驱动代码仔细看了一个星期 xff0c 才
  • linux内核的并发与竞态

    并发与竞态是指多个任务单元同时访问同一个资源 xff0c 就会出现并发 xff0c 竞态的现象 其中多个任务单元包括中断 xff0c 进程 线程 xff0c 甚至多个多处理器 xff1b 同一资源既包含硬件资源 xff0c 也包括软件数据
  • UDP通信

    头文件 xff1a 1 pragma once 2 3 include lt stdio h gt 4 include lt unistd h gt 5 include lt string h gt 6 include lt stdlib
  • 交叉编译找不到stdio.h头文件,make menuconfig问题解决办法

    今天测试交叉编译器总出现问题 xff0c fatal error stdio h No such file or directory 后来根据指导使用编译命令 xff1a arm linux gcc src c I 头文件路径 能编译通过
  • 原子上下文,进程上下文,中断上下文的详细解析

    内核空间和用户空间是现代操作系统的两种工作模式 xff0c 内核模块运行在内核空间 xff0c 而用户态应用程序运行在用户空间 它们代表不同的级别 xff0c 而对系统资源具有不同的访问权限 内核模块运行在最高级别 xff08 内核态 xf
  • server,gtk,tslib

    一 首先先说下framebuffer xserver tslib gtk和桌面这五者之间的联系 xff0c 1 framebuffer 即linux系统的一块内存区域 xff0c 往这块区域写东西屏幕就会有所显示 对应的设备文件是dev f
  • 修改启动logo,禁止光标

    linux内核下使用的图片文件类型是pnm和PPm格式的 xff0c 所以在开始介绍修改linux内核启动LOGO之前 xff0c 1 先需要介绍一下怎么样设计自己开始logo的ppm图片 xff0c 首先选择一张png格式的图片 xff0
  • 移植gtk,这个配置有点早,可以了解一下他的工作流程

    最近一直GTK xff0c 感觉好晕 整整耗了我近三天才勉强在网络资料和他人帮助情况下完成 所以记录一下 xff0c 不然我记性太差 xff0c 很可能下班之前就忘了 xff01 以后也好有个参考 首先注意一个问题 xff1a GTK在编译
  • error: ISO C90 forbids mixed declarations and code [-Werror=declaration-after-statement]

    这个错误多为编写linux驱动程序时出现的错误 xff0c 正常情况下是以警告出现的 xff0c 一般有两种情况 xff1a 1 在函数体内 xff0c 定义变量代码前边出现非定义的变量 此变量在其他地方已经定义了 xff0c 编译时就会出
  • 用户空间的虚拟地址如何转换得到实际的物理地址

    思路 xff1a 进程号是一个进程在用户空间的唯一标示 xff0c 所以 xff0c 根据pid可以从内核中得到一个进程的所有信息 xff0c 另外就是知道虚拟地址就可以通过内核物理地址映射到虚拟地址的逆运算就可以还原他的实际物理地址 以上
  • ubuntu系统下的minicom串口/usb转串口配置

    1 安装minicom串口软件 sudo apt get install minicom 2 配置串口 minicom默认配置是tty8 如果你直接使用的就是串口 xff0c 那么安装好之后就可以直接使用了 如果你是用usb转串口 xff0
  • Install ncurses (ncurses-devel) and try again.

    主要就是终端图形配置时最容易出现的问题 xff0c 比如最常见的make menuconfig xff0c 解决方法 xff1a sudo apt get install ncurses devel 屏幕弹出 xff1a 找不到这个软件 x
  • ioremap/mmap的几个测试结论

    环境 xff1a pc机 xff0c ubuntu 14 04 64位 xff0c 物理机 arm板 omap3530 xff0c 1G内存 xff0c 内核linux 2 6 32 1 mmap在pc机上测试映射大小 xff0c 可以将文
  • Freertos的钩子函数

    何谓钩子函数 xff1f 大多数操作系统 xff0c 如 xff1a windows linux ucos freertos 其实都有钩子函数 xff0c 能干什么呢 xff1f 其实就是操作系统留给开发者的一个回调函数 xff0c 具体有
  • fopen :invalid argument错误

    今天使用文件操作函数 xff1a fopen fread fwrite fclose时 xff0c 编译正常通过了 xff0c 但是运行时就爆出了invalid argument错误 FILE fp 61 fopen 34 a txt 34
  • jiffies:内核中的时间观念

    jiffies在内核中是一个全局变量 xff0c 声明包含在 include lt linux jiffies h gt 中 xff0c 几个内核中常用的的概念 xff1a 1 HZ 内核常量 ARM架构HZ 61 100 X86架构HZ
  • git 学习之一

    注 xff1a 这篇博文是本人在学习git软件时 xff0c 自己整理出来的 xff0c 对于git软件的知识点层次分明 xff0c 举例实用 xff0c 最主要的是自己的亲身学习经历 xff0c 还可以作为工具手册 xff0c 哪一点不清
  • git 学习之二

    1 git创建版本库 创建一个版本库非常简单 xff0c 首先 xff0c 选择一个合适的地方 xff0c 创建一个空目录 xff1a mkdir learngit cd learngit pwd Users michael learngi

随机推荐

  • linux环境的sd卡格式化,分区

    环境 xff1a ubuntu xff0c 大sd卡 我们买过来的sd卡 xff0c 插到电脑上 xff0c 安装好sd卡的驱动之后 xff0c 就会在我的电脑里面开到可移动磁盘 xff0c 实际上我们看到的这个可移动磁盘可用空间就是sd卡
  • 详解:tslib移植arm全过程

    环境 xff1a Ubuntu xff0c 交叉编译器 xff0c tslib 1 4 移植步骤 xff1a 第一步 xff1a 获取tslib的源码 使用git获取tslib源码 xff1a git clone https github
  • 根文件系统的制作,busybox编译以及中间遇到的问题

    软件环境 xff1a Ubuntu 14 10 busybox 1 10 编译配置 xff1a ARCH 61 arm CROSS COMPILE 61 arm linux make defconfig 或者 make menuconfig
  • selected device is not a touchscreen I understand

    具体tslib的移植在上一篇博客中已经做了详细的说明 xff1a http blog csdn net hpu11 article details 53105947 最近两天一直在做tslib移植触摸屏校准问题 xff0c 在经过tslib
  • error while loading shared libraries : libts-0.0.so.0:cannot open shared object file: No such file o

    这是我在运行自己写的qt程序时 xff0c 爆出的错误 xff0c 从错误的地方来看 xff0c 是我们的库中缺少一个libts 0 0 so 0的动态库 xff0c 如果开发经验比较丰富的人都会知道这个库是tslib的一个库 xff0c
  • ldd 查看可执行文件所依赖的库有哪些

    ldd是linux下的一个脚本命令 xff0c 我们可以通过各种途径去查找它 xff0c 作用 xff1a 打印可执行文件依赖的库 举个实用的例子 xff1a ehome是我自己写的一个只能家具的程序 xff0c 然后经过交叉编译得到的一个
  • FreeRTOS源码下载及源码文件夹介绍

    FreeRTOS源码下载及源码文件夹介绍 1 FreeRTOS源码下载 去官网或其他途径找到下载程序 xff0c 在这里 xff0c 我直接使用了正点原子提供的下载程序 xff1a 双击上图程序后 xff0c 选择存放路径 xff0c 下载
  • Linux如何手动挂载/卸载u盘

    1 首先你得保证你的U盘的格式是fat格式 先进入 mnt 目录新建一个usb目录 cd mnt mkidr usb 2 先fdisk l xff0c 然后插上U盘 xff0c fdisk l 查看是否有新的硬盘添加上来了 xff1f 最好
  • 写一个简单脚本文件判断文件的存在性

    实现代码一 1 2 3 4 5 6 7 8 9 10 1
  • 触摸屏与usb鼠标同时支持

    最近 xff0c 做系统移植 xff0c 根文件系统自己做的 xff0c 移植好tslib xff0c 也可以触摸屏校准 xff0c 触摸屏也可以正常使用 xff0c 但是插上usb鼠标时 xff0c 系统能枚举出usb的信息 xff0c
  • 内核裁剪和部分选项的意义

    嵌入式驱动开发 xff0c 内核开发 xff0c 都避免不了的和Linux打交道 xff0c 尤其是做系统移植 xff0c 在编译内核的时候 xff0c 我们都需要把没用的内核模块给删除掉 xff0c 以减少内核的文件大小 xff0c 这当
  • printk打印级别输出

    内核的打印函数和用户空间的打印函数是相同的 xff0c 只是关键字不太一样 xff0c 内核是printk xff0c 而用户空间则是printf 在内核空间只不过有一个打印级别的设置 xff0c 所谓的打印级别不过是几个宏定义 print
  • 结构体,联合的位域定义方法,以及结构体大小的计算

    结构体有一种定义方式叫做位域定义方式 xff0c 如下 struct ctl register int a 16 char c 4 这种定义方法 xff0c 一般常用在嵌入式开发的内核层的代码中经常出现 int a 16 代表a只占int的
  • c语言中__attribute__的意义

    微信搜索关注公众号 郑州行疆户外 了解软件工程师的业余户外生活 我们在进行定义数据结构计算数据结构大小的时候 xff0c 或者进行网络通讯的socket发送数据的时候 xff0c 都会遇到一个共同的问题 xff1a 数据对齐问题 这个问题是
  • linux播放音乐,录音命令-----arecord,aplay

    微信搜索关注公众号 郑州行疆户外 了解软件工程师的业余户外生活 用了这么长时间的Linux系统 xff0c 是不是还没有用Linux听过音乐 xff0c 一般使用Linux系统的人都是纯属办公需要或者自己对软件开发玩的 xff0c 很少是做
  • Unix或Linux中&、jobs、fg、bg等命令的使用方法

    fg bg jobs amp ctrl 43 z都是跟系统任务有关的 xff0c 虽然现在基本上不怎么需要用到这些命令 xff0c 但学会了也是很实用的 一 amp 最经常被用到 这个用在一个命令的最后 xff0c 可以把这个命令放到后台执
  • linux tftp服务器搭建与测试

    1 安装tftp服务器 sudo apt get install tftp hpa tftpd hpa tftp hpa是客户端 tftpd hpa是服务器端 2 配置tftp服务器 sudo vim etc default tftpd h
  • FreeRTOS基础知识

    FreeRTOS任务特性 xff1a 简单 xff1b 没有使用限制 xff1b 支持抢占 xff1b 支持优先级 xff1b 每个任务都有堆栈 xff0c 但也导致了RAM使用量增大 xff1b 如果使用强化在哪的话必须仔细考虑重入的问题
  • makeinfo 安装

    环境 ubuntu sudo apt get install texinfo 就OK 今天在打包的时候有个包需要 makeinfo 当时就各种搜结果就没有 makeinfo 这个软件包 xff0c 最后看到有人说其实就是 texinfo 这
  • 通过MCU实现Altera FPGA在线升级

    一 xff0e 问题背景 在实际工程应用中 xff0c 我们时常会遇到为解决某个老产品的BUG xff0c 需要在工程现场更新设备的FPGA代码 xff0c 或者参加电信测试时需要现场升级设备FPGA程序以便于调试 公司现阶段所用的Alte