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

时间:2025-09-17  作者:Diven  阅读:0

做了三年四个项目最近才第一次需要深入的搞一下FPGA 烧写。在这里简单一下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配置的

猜您喜欢

开口型扁圆头抽芯铆钉是常见的连接件,其设计和功能具有独特的特点。开口型铆钉的结构使其在安装过程中更加便捷,适合快速组装的场景。与传统铆钉相比,开口型设计能够有效...
2008-03-27 00:00:00

今天的设计人员已经在许多不同的领域中选择FPGA作为首选的解决方案。这些FPGA器件早已超越了原本作为原型设计工具的范畴,逐渐用于生产应用中,尤其是消费电子和汽...
2020-12-25 11:51:00

贴片电阻上的「12R0」标识代表其阻值为12欧姆。字母「R」在电阻值中表示小数点,因此「12R0」等同于「12.0Ω」。 这种标识方式常见于表面贴装器件(SMD...
2024-11-26 11:29:39

长期以来,苹果公司在相机传感器方面几乎完全依赖索尼供货,最新的 iPhone 16 系列也不例外。然而,这一局面或将迎来改变。有消息称,为苹果提供 OLED 面...
2025-01-03 19:49:00

在现代电子设备中,理想二极管/ORing控制器是非常重要的配件。根据不同的应用需求,这些控制器可以分为几种主要类型。基于MOSFET的理想二极管控制器是最常见的...
2008-02-10 00:00:00

贴片电阻上的150并非直接代表150欧姆。实际上是一种数字编码,需要进行解码才能得到真实的阻值。150代表的是15 x 10^0,也就是15欧姆。贴片电阻通常使...
2024-11-29 10:25:47

保险丝作为重要的安全保护元件,起着防止电路过载和短路的重要作用。PEC太平洋精工作为业内知名的保险丝制造企业,其产品以高品质和多样化的类型赢得了认可。本文将围绕...
2022-06-06 15:28:30

可调电容器是重要的电子元件。的作用多种多样,应用于各种电路中。本文将详细介绍可调电容器的主要作用。调整频率可调电容器可以用来调整电路的频率。通过改变电容值,电路...
2025-03-20 13:01:38


现代电子设备中,连接器扮演着非常重要的角色。CONN_7.62X10.12MM_TM是一种广泛应用的连接器,因其独特的设计和优越的性能,受到众多行业的青睐。本文...
2025-02-26 20:32:23