网站开发的项目,平邑县住房和城乡建设局网站,wordpress资源下载插件,昆明网站seo服务缩略词索引#xff1a; K7:Kintex 7V7:Vertex 7A7:Artix 7 上一篇中介绍了FPGA的启动步骤#xff0c;如图0 所示#xff0c;今天这篇文章就要在上一篇文章基础上进行分支细化#xff0c;首先我们先了解FPGA 启动加载的几种方式。同时对于我们设计中常见的几个问题将在文章最… 缩略词索引 K7:Kintex 7V7:Vertex 7A7:Artix 7 上一篇中介绍了FPGA的启动步骤如图0 所示今天这篇文章就要在上一篇文章基础上进行分支细化首先我们先了解FPGA 启动加载的几种方式。同时对于我们设计中常见的几个问题将在文章最后详细讨论比如HEX、BIN、MCS区别在生成MCS时候Bit Swap什么作用Bitstream 压缩到底在压缩什么等问题进行详细探讨。 图07系列FPGA启动步骤-参考UG470 配置文件框架 在图0中上一篇没有细致讨论的配置文件载入我们这篇文章详细讨论下因为后续我们会使用这其中的一两个寄存器我们就先看下配置文件架构。 7 系列 FPGA 配置文件以帧的形式排列。帧是 7 系列 FPGA 配置内存空间中最小的可寻址段因此所有操作都必须作用于整个配置帧。每帧由 101 个 32 位组成。根据比特流选项配置比特流中存在额外开销。确切的比特流长度可在 rawbits 文件 (RBT) 中找到。比特流长度字大致等于配置数组大小字加上配置开销字。比特流长度位大致等于比特流长度字乘以 32。 配置包 所有 7 系列 FPGA 比特流命令都是通过读取或写入配置寄存器来执行的。 数据包类型 FPGA 比特流由两种数据包类型组成 Type 1 和 Type 2。 Type 1数据包 Type 1 数据包用于寄存器读写。7 系列 FPGA 中仅使用 14 个寄存器中的 5 个。报头部分是 32 位字。 Type 1数据报头之后是Type 1数据部分。 图1Type 1 数据包头格式-参考UG470 上图中的OPCODE类型如图2所示。 图2OPCODE格式-参考UG470 Type 2数据包 Type 2 数据包必须跟在Type 1 数据包后面用于写入长块。因为它使用Type 1 数据包地址所以这里没有显示地址。报头部分同样是 32 位字。 Type 2 数据包头之后是Type 2 数据部分。 图3Type 2 数据包头格式-参考UG470 上图中的OPCODE类型如图4所示。 图4OPCODE格式-参考UG470 CRC Register00000 CRC寄存器写入此寄存器用于对比特流数据执行 CRC 校验。如果写入的值与当前计算的 CRC 匹配则清除 CRC_ERROR 标志并允许启动。 Frame Address Register00001 帧地址寄存器7 系列FPGA分为两半顶部和底部。7 系列FPGA中的所有帧都具有固定的相同长度即 3,232 位101 个 32 位字。 帧地址寄存器 (FAR) 分为五个字段块类型、顶部/底部位、行地址、列地址和次要地址。地址可以直接写入也可以在每帧结束时自动递增。典型的比特流从地址 0 开始并自动递增到最终值。 Command Register00100 命令寄存器 (CMD) 用于指示配置控制逻辑选通全局信号并执行其他配置功能。每次将新值加载到 FAR 寄存器时都会执行 CMD 寄存器中的命令。 MFWR Register (01010) 该寄存器由比特流压缩选项使用。 IDCODE Register(01100) IDCODE 寄存器读取该寄存器可返回设备 IDCODE。提供的 IDCODE 必须与设备的 IDCODE 匹配。 Warm Boot Start Address Register (10000) 热启动起始地址寄存器 (WBSTAR) 指定应用 IPROG 命令时要使用的 MultiBoot 地址信息。图5中描述了相关寄存器。 图5WBSTAR寄存器描述-参考UG470 Watchdog Timer Register (10001) 看门狗定时器在回退比特流时自动禁用。图6中描述了相关寄存器。 图6WTR寄存器描述-参考UG470 Boot History Status Register (10110) 启动历史状态寄存器 (BOOTSTS)是用来指示启动过程中错误的类型图7中描述了相关寄存器。 图7BOOTSTS寄存器描述-参考UG470 上面的相关参数大部分都可以通过JTAG读取到图8中展示了读取到的BOOTSTS寄存器。 图8通过JTAG读取BOOTSTS寄存器描述 FPGA 启动加载方式 对于7系列FPGA来说有多种方式启动包括正常上电自启动Program_B复位加载等方式下面详细介绍几种启动方式。 上电自动加载 这个方式就不多说了FPGA按照上电时序正常上电后由FPGA主动从外部存储器读取位流此时CCLK为输出或者由其它主控制器通过SELETMAP将位流写入到FPGA中此时CCLK为输入从而完成上电自动加载。 Program_B复位加载 7 系列FPGA提供了一种通过外部引脚来重新配置FPGA的方式这个引脚就是Program_B通过拉低Program_B管脚重新配置FPGA后续等INIT_B释放拉高后就和上面步骤一样了。7系列FPGA通过Program_B复位加载时序如图9所示。 图9Program_B复位加载时序图 - 来源UG470 Boot加载 Program_B复位加载是通过外部引脚进行重加载过程AMD-Xilinx还提供一种指令加载方式就是-Boot加载。Boot加载过程实际上是通过JTAG发送JProgram指令实现FPGA加载功能。JTAG发出JProgram指令后等到待INIT_B释放拉高后就和上电自动加载后续过程一样。其功能和拉低Program_b功能相似Boot加载操作如图10所示。 图10Boot加载操作 IPROG指令加载 这个加载过程就和MultiBoot息息相关了IPROG指令的作用跟外部Program_B管脚的作用类似都是对FPGA芯片进行复位操作该复位操作对FPGA内部的应用程序进行复位同时IPROG指令不能复位专用重配置逻辑如WBSTAR寄存器、TIMER寄存器、BSPI寄存器和BOOTSTS寄存器。IPROG指令能够触发FPGA开启初始化流程同时拉低INIT和Done信号。完成复位操作后将默认的加载地址用热启动地址寄存器(Warm Boot Start AddressWB-STAR)中的新地址替换。 IPROG指令可以通过ICAPE2原语和嵌入到位流中实现相关操作。 ICAPE2原语操作 ICAP目前为止有三个版本包括ICAPICAPE2以及ICAPE3。UltraScale系列对应ICAPE37系列对应ICAPE27系列之前的对应ICAP。 ICAPE2原语通过更改WBSTAR寄存器来实现多重加载。ICAPE2原语发出的指令序列如下图所示箭头所示就是IPROG指令 图11ICAPE2原语发出的指令序列 首先写入同步头 32’hAA995566, 然后将需要跳转到的bit文件的起始地址写入WBSTAR寄存器最后写入IPROGinternal PROGRAM_B指令。 1对于BPI模式来说可以通过RS[1:0]外部引脚来控制具体位流的读取也可以通过STAT_ADDR[28:0]地址来控制具体位流的读取。 2对于SPI模式来说只有STAT_ADDR[23:0]地址来表征FLASH器件的地址当使用32位地址的SPI容量大于等于256Mb时需要将实际存储的高24地址赋值给STAT_ADDR[23:0]。因此在位流存储的起始地址早于255时这就要求位流中的dummy数目要大于256个否则就会出现易失部分有效位流读取导致加载失败。为了安全起见在使用大于等于256Mb的FLASH时可以适当在位流头前加入Dummy。 详细如下图所示 图12BPI和SPI加载地址控制信号 位流操作 上面ICAPE2原语操作使用过例化原语指令事项相关操作我们同样可以通过将IPROG指令嵌入到位流中这个时候WBSTAR寄存器值也同样嵌入到位流中也实现相同的操作上面的过程就是通常使用XDC约束来实现Multiboot功能的应用场景这种应用场景一般都是主加载SPI模式或主加载BPI模式。 图13IPROG指令嵌入到位流中操作示意图 具体的操作和详细说明我们后续再详解。接下来我们讲解几个后续要使用的概念。 BIT、RBT、BIN、MCS和HEX区别 7系列的FPGA配置数据文件格式有五种文件格式BIT、RBT、BIN、MCS和HEX。对于FPGA开发工作者来说使用最多的应该是四种格式的文件BIT、BIN、MCS和HEX。那么这几个格式有啥区别呢 在UG470中给了这几个格式的区别如下图所示 图14BIT、RBT、BIN、MCS和HEX区别 上-来源UG470 下-翻译 bit文件比较好理解是用来调试的通过JTAG进行在线烧录调试。BIN和MCS用于固化生成存储于flash的固化文件。对于HEX,一般用于远程更新比如通过网络、PCIe接口方式远程升级时候。当然上面只是推荐的使用方面也可以按照自己需求使用我们接下来说一下这几个文件的区别。 mcs文件和bin文件的区别 这两个文件都是我们进行固化时候常见的文件格式其中MCS文件时包含BIN文件内容的只是内容MCS文件的每行有地址信息最后一个byte时CRC校验信息。所以mcs文件要比bin文件大。 烧录器烧录的时候MCS文件只会烧写包含bin文件的那部分信息不会将地址和crc信息烧录到flash中。 我们在做MultiBoot和FallBack时候只能使用MCS因为MCS包含了地址信息烧录器在烧写的时候知道golden image放在哪里multiboot image放在哪里。 bit文件和bin文件的区别 bin文件不包含头部信息bit为bin头部信息工程名称以及时间等信息。 所以BIN文件时核心其他文件是在BIN文件基础上增加了不同的信息。 图15Vivado生成BIN设置 Bit Swapping什么作用 在生成固化文件时候有个选项如下图所示 图16Bit Swapping设置 那么这个选项的作用是什么 Bit Swapping是指字节内位的交换。除非使用 PROMGen -spi 选项或 SPI 配置模式的 write_cfgmem -interface spi1|spi2|spi4 选项否则 MCS PROM 文件格式始终是Bit Swapping。HEX 文件格式是可选的具体取决于用户选项。位流文件 (BIT、RBT、BIN) 则不会进行Bit Swapping。 对于 Xilinx 配置硬件每个字节的 MSB 对应于 D0而不是 D7但是在处理位流文件时候可能会出现相反的操作所以这一步是在进行纠正后续的操作。 Vivado中生成 MCS、EXO、TEK 文件或 HEX 文件时D0 引脚对应于每个字节的 LSB。因此这些文件被称为“字节交换”文件。默认情况下HEX 文件是位交换的但可以禁用此功能。 当禁用此选项时D0 引脚对应于每个字节的 MSB并且该文件是“非字节交换”文件。 BitGen 生成的 BIT 和 RBT 文件是“非交换字节”文件。 对于所有 FPGA 并行模式Express、同步/异步外设、主/从并行、SelectMAP都是如此。Xilinx 软件根据总线排序的一般规则生成字节交换文件。 通常当使用“字节交换”时MSB最左边的位对应于总线的最大数量D0 。 使用处理器或逻辑设备时必须纠正这些差异。 处理器、FPGA 等生成“字节交换”的文件便可以在配置期间把每个字节的 MSB 对应于 D0。如果使用 BIT、RBT 或“非字节交换”的 HEX 文件进行下载时则处理器的 MSB 必须与 FPGA 的 D0 相对应。 图16Bit Swapping示意图 - 来源UG470 需要注意的是无论数据的方向如何每个字节的MSB都将进入D0引脚: 在“字节交换”的版本中进入D0的位是最右边的位在“非字节交换”中进入D0的位是最左边的位。 FPGA比特流内容 7系列FPGA比特流包括三个部分总线宽度自动检测、同步字和FPGA配置。 总线宽度自动检测模式插入在每个比特流的开始。它用于并行配置模式以自动检测配置总线宽度。因为它出现在Sync字之前串行配置模式会忽略它。总线宽度自动检测对大多数用户来说是透明的因为Xilinx工具生成的所有配置位流BIT或RBT文件都包括总线宽度自动探测模式。如果模式引脚设置为主串行、从串行、JTAG或SPI模式配置逻辑将忽略这些模式。 图17K7 FPGA Bit 示例 - 来源UG470 下图为一个bit文件图中阴影部分就与上述中的总线宽度模式以及同步字等一一对应同步字之后才是FPGA设计功能的配置内容。 图18实际 Bit 示例 - 来源知乎小灰灰的FPGA Bitstream 压缩到底在压缩什么 最后就是BIT压缩我们在设计中都会加入下面脚本 set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design] 这句话大家都知道是吧我们生成的位流文件进行压缩压缩比还是很可观的那么我们进行Bitstream 压缩到底在压缩什么会不会影响我的功能 压缩前后会对程序里的功能有影响吗 答 肯定没得影响. 影响功能的话就没法用了。 压缩的原理是什么压缩了哪些部分 答: 使用length encoding算法来减少配置数据的大小。 烧写的时候还需要解压缩吗 答: 下载时FPGA会识别并处理解压缩的流程 有没有相关文档可以参考 答: 可以参考UG908 程序固化后不能启动的排查思路 这个在新板子加工回来后第一次调试常出现的问题这个问题一般分为两个方向1、硬件问题2、FPGA设计问题。 图19程序固化后不能启动的排查思路 总结 今天文章内容比较杂是一些常见的问题和疑惑内容还是以官方文档UG470为主受篇幅限制后面有几个问题并没有挖到底层这个后面会出几个专题进行详细解析。 下一篇会进入正题进行MultiBoot解析。