首页 > 技术 > 内容

FPGA烧写的方式和具体过程分析

时间:2026-01-20  作者:Diven  阅读:0

做了三年四个项目最近才第一次需要深入的搞一下FPGA 烧写。在这里简单一下FPGA烧写的具体过程和玩的花样

大家常用的办法

对于大部分人来说,至少入门时会用到的烧写方式就两种:

① 通过JTAG直接将bitsteam 烧录到FPGA。 断电后信息丢失。这种方式多用于发开调试阶段,板子一直连着电脑。通过ISE 或者 Vivado (2020年开始估计还有Vitis)使用JTAG接口烧录。

② 在设计release以后,到产品上一般都是把配置文件通过IDE工具保存存在Nor Flash里。上电后自动编程FPGA。

较为进阶的方法

通常情况下这两种方式也就可以满足大部分需求了。开发调试直接JTAG。产品出货前,配置文件通过JTAG接口,用VIVADO或者SDK等工具烧进Flash。之后把接口封起来。产品需要更新的时候,派技术支持去,重新打开接口,插上JTAG,把新的配置文件烧入Flash。

但是这次项目是个小型手持测量设备,JTAG接口只有在设备拆散状态下通过扩展板才能使用。组装好后FPGA只能通过Flash来编程。由于是个精密仪器,每次拆开再组装,整个设备都需要重新校准,非常费事费力。组装后更新Flash里面的配置文件只能用别的办法了。这种情况下常用的方法是通过一个和外界有通信能力的微控制器将image发送给FPGA, 再由FPGA写入Flash。

这种remote update Xilinx提供了解决方案,相对应的ApplICation Note 是 :

QuICkBoot Method for FPGA DesignRemote Update (文档号码XAPP1081)

采用这种方案的前提是理解FPGA通过Flash配置的细节,所以以7系FPGA为例先需要看一下这个文档:

7 Series FPGAsConfiguration (UG470) 主要是看第五章:Chapter 5 Configuration Details

Xilinx 远程烧录FPGA方法

远程烧录一般是为了设备出厂以后还需对FPGA进行更新或者升级。为了避免在烧录过程中新的配置文件损坏,导致FPGA不能正常启动。通常采取的是双保险策略,有个gold bitstream,是出厂是写入Flash的,是测试过绝对可以启动FPGA的,还有一个是update bistream,出厂时就是一个gold bitstream的copy,FPGA每次启动都是默认写读取这个update bitstream。之后的更新也就是去重写这个 update bitstream, 一旦在更新过程出了问题,比如突然断电。update bistream损害或者残缺,FPGA在尝试从update bitstream启动失败后就会去读取gold bitstream。这种方法保证了一个相对安全的update方法,所以也是非常经典的方法。

去掉废话来概括这种方法

每一个bitstream都长这样:

FPGA会先去找synchro word (7系列的spi接口的话就是0xAA995566)找到以后读取首地址,然后跳到首地址,开始读取所有的配置数据。

此文介绍的这种双保险策略就是在Flash中存入两个bitstream。但是精髓所在是这两个Bitstream在内存中怎么放。

如下图所示,update的bitstream会被拆成两段,synchron word和首地址会被存在goldbitstream前面,然后其部分存在goldstream之后。而且update bitsteam尾部还会人为加入一个CRC。

这种鬼畜结构的目的

这种结构可以提供非常安全可靠的update模式。为什么会安全可靠。先来说一下这种结构下的update流程:

当我们想要update bistream的时候:

① 首先 update synchro word和首地址所在的sector(Flash里可以擦除的最小单元)会被擦除。

② 然后开始在update所在的地方擦除所有内容,写入新的bitstream。包括CRC。(这个CRC是生成bitstream的时候加入的。具体操作看下一章)。

③ 当写入结束后整个新写入的内容会被读出来计算CRC,然后和嵌入的CRC来做比较。当CRC一致时,说明在传输和写入过程没有出现问题。新写入的配置内容完整,有效。这时update的synchro word和首地址才会写入最开始被擦除sector。

这样一来,如果CRC不一致,说明这是个bad update,新写入的配置内容不可用。那么被擦除的synchro word 和首地址不会被写入。第一个sector是空的。当FPGA上电后,是在这个sector里找不的update image的同步字和首地址的,继续读下去会读到属于goldbitstream的同步字和首地址。

如下图所示:

实际操作步骤和文档中的坑

首先好消息是,上述的这些Flash擦除,写入,各种地址,sector,page等等Xilinx已经写好了VHDL的模块。可以直接拿来用。自己需要实现的是remote端往FPGA的数据传输。具体如下图:

具体实现步骤如下:

① 实现remote端的update程序,该程序需要读取update image 然后通过某种接口和通信协议将image发送给FPGA。这一步该需求和情况自由有着。例如物联网的可以用蓝牙或者WIFI。

② 实现FPGA端的数据接收。该模块将数据写入Xilinx提供的FlashProgRAMmer

③ 下载XAPP1081文档中的例子 KC705 Board Demonstrations, page 33。例子中两个VHDL模块按下图实例化。注意 这两个模块必须共用一个时钟,而且这个时钟就是SPI的时钟,所以注意不要太快。一般20Mhz一下。

④ 集成前三条实现的模块,调试。可以实现将数据从remote端发送给FPGA,经过SPiFlashProgRAMmer写入Flash。

⑤ 把bitstream格式转换成mcs格式。将gold bistream。bit格式转换成mcs格式。VIVADO下使用tcl 命令write_cgfmen -format mcs -interface spix1。一定要加 -interface spix1,不然所有的bits都会被swap!

⑥ 通过Xilinx例子中提供的Perl Script生成 gold init image。script的输入就是刚才转换的mcs格式的goldbitstream.mcs。输出是gold init image这个image就是图4中描述的那种鬼畜布局的双bitstream,只不过两个bitstream是一样的。update bitstream是gold的copy。

⑦ 将gold inital.mcs通过VIVADO 或者PROMgen用JTAG直接烧入Flash

⑧ 同样的方式用Perl Script生成 update image。 输入是xxx.mcs。输出是xxx_update.mcs。这个就是上文所属的加了CRC的update image。生成过程中perl script会给出Flash的首地址和结束地址。将SpiFlashProgrammer中的首尾地址改成这两个地址。注意:因为首尾地址是写在VHDL里的,也就是说Image的大小是固定的。为了防止在update image变大。可以预留一部分出来。例如:目前的大小是3.3MB。我们预留0.7MB给未来可能出现的更新。那么我们需要生成的image需要4MB大。这是要给perl script一个附加的agrument: -imagesize 32

⑨ 将xxx_update.mcs转换成.hex文件。网上有不少工具可以。实在不行谷歌一下mcs格式,自己写个script转换一下。

⑩ FPGA上电,取消SpiFlashProgrammer的reset。 remote的软件读取xxx_update.hex,传输给FPGA,经由SpiFlashProgrammer写入Flash。

⑪ 写入后,查看Programmer的Status. Done输出1,所有Error Port输出是0的话,说明update成功!

⑫ FPGA重新上电,检查FPGA内是否是由新的image配置的

猜您喜欢


拨轮开关是常见的电气元件,应用于各种设备中。根据结构和功能的不同,拨轮开关主要可以分为以下几类。首先是单极单掷开关(SPST),具有两个状态,可以实现简单的开关...
2019-06-15 00:00:00
电气工程和电子设备维护中,直流回路电阻测试是确保电路正常运行的重要环节。准确测量回路电阻不仅能判断导线、接点及元件的连接状态,还能及时发现潜在的故障隐患,保障设...
2025-11-07 06:30:37
数码管驱动是电子设备中常见的显示技术,应用于电子钟表、计数器、仪表等领域。数码管由多个发光二极管(LED)或液晶显示器(LCD)组成,能够以数字形式直观显示信息...
2013-03-19 00:00:00
合金电阻作为电子元器件中的重要组成部分,受到了关注。禾伸堂(HEC)作为知名的电子元器件制造商,其合金电阻产品以高品质和稳定性能赢得了市场认可。本文将围绕禾伸堂...
2014-03-15 13:37:24
电导仪是用于测量溶液电导率的仪器,在多个领域中有着着重要作用。在水质监测方面,电导仪能够快速、准确地评估水中溶解盐分和污染物的浓度,帮助环保部门及时发现水源污染...
2024-01-18 00:00:00
网络时钟同步技术在现代通信中是重要配件,尤其是在确保数据传输的准确性和实时性方面。根据不同的应用需求,网络时钟同步主要可以分为以下几类。基于时间戳的同步方法,如...
2018-05-07 00:00:00
贴片电阻上的103标记代表其阻值为10kΩ,也就是10,000欧姆。这是一种通用的数字编码表示法,遵循EIA-96标准。前两位数字10代表有效数字,第三位数字3...
2024-11-29 10:25:59
电子设备高速发展的今天,内存作为信息处理的核心部件,其性能和稳定性很重要。而DDR电源管理作为内存供电的关键环节,直接影响着内存的性能发挥和系统运行的稳定性。D...
2024-04-19 00:00:00
当今的数字系统往往是围绕CPLD/ FPGA 进行设计的, 首选的方案是采用同步时序电路设计 , 也称作单时钟系统, 电路中所有触发器的时钟输入端共享同一个时钟...
2020-04-18 12:59:00