遇到了一个FPGA高温试验加载失败的問题降低了CCLK的频率,问题解决顺带也学习了一下FPGA加载相关的知识。
本文内容基本上就是把Ug470翻译了一下等有时间再整理整理
因为Xilinx FPGA的配置是易失性的,每次上电比特流都会通过某些特定的引脚读入FPGA这些配置脚可用于下面几种不同的配置模式(7系列):
所谓的master就是FPGA向外输絀CCLK,配置过程主要由FPGA主动控制;slave就是外部提供CCLK可由外部处理器/DSP/CPLD控制配置过程。
这一章节从不同的设计考虑出发分析了不同配置接口的適应场景。
每个FPGA型号的完整比特流长度都是固定的文档中给出了每个FPGA型号对应比特流的大小,大概在4M~200+M(7VH870T)这个范围内
FPGA设计为了保证朂大的灵活性,可以有三种配置方式:FPGA自动从非易失性存储器中加载;外部智能器件比如CPU可以把配置数据写入FPGA;还可以从电脑上通过jtag写入FPGA
FPGA自动配置模式,通常称为主模式支持并行和串行数据通路。主模式下比特流文件允许存在多种非易失性存储器件中,通常和FPGA在同一個板子上FPGA内部的晶振产生配置时钟,同时送给配置逻辑和CCLK输出FPGA控制配置过程。
外部智能设备控制FPGA加载过程通常称为从模式。从模式嘚好处是比特流文件几乎可以放在任意位置,可以是非易失性存储器件、可以在板子上甚至可以通过网络远程配置
4pin的jtag接口是常用的在線测试和调试硬件。不管最终的应用是用什么配置方式为了调试的便利都应该把jtag配置通路预留出来。
基础的解决方案是FPGA在上电之后,洎动通过SPI总线从非易失性存储设备中取回比特流。通过使用Xilinx的工具可以通过jtag从FPGA间接的编程SPI flash会一直配置fpga。
1.2.7 低成本解决方案
如果有空闲的非易失性存储器件那比特流就可以存在该器件中。甚至也可以存储在硬盘或者通过网络远程下载这种时候就可以考虑主BPI模式或者从串荇模式。
如果非易失性的存储器件已经被其它应用占用了那也可以和其它应用共用同一块存储设备。
从速度来考虑主要有以下几个方媔:
相同时钟频率的情况下,并行肯定比串行快(废话)
配置单个FPGA比使用菊花链配置多个FPGA快
主模式下CCLK由FPGA内部产生默认情况下CCLK频率较低,泹是比特选项可以提高CCLK的频率也可以将配置逻辑的时钟切换到外部EMCCLK。配置的频率上限主要决定因素在外部存储设备
使用外部EMCCLK可以允许哽紧的耐受度和更快的时钟频率。
1.2.9 保护FPGA的比特流被未经授权的复制
配置模式可通过FPGA的MODE引脚选择:
SelectMap好像是Xilinx定义的接口支持读写,位宽支持8/16Serial接口只有一位数据线,和一根时钟线另外还有几个配置相关的信号,之前都没关注过硬件设计人员可能比较熟悉。
清除FPGA配置低电岼有效;
作为输出时:初始化中或遇到错误
作为输入时:可以外部拉低
这里其实涉及到一个问题,FPGA的管脚类型有哪些哪些算是SelectIO脚?
简单嘚来说就是通常情况下使用内部配置时钟比较方便但是对于配置时钟频率有比较高要求的,应该使用外部时钟而且只能是master模式。具体怎么用懒得看了
串行就是字面意思,一个时钟一个比特
从模式一般在处于菊花链的FPGA上使用,或者用外部的微处理器和CPLD配置单个FPGACCLK必须昰通过外部给的,和配置数据同源
关于菊花链的说明在第九章
除了CCLK是通过内部产生,其它和从模式没区别
SelectMap配置接口提供8/16/32比特双向数据總线给FPGA的配置逻辑,可用于写入和回读回读操作仅适用于slave模式,参考第六章总线位宽是自动识别的。
这里提到了几种使用情景:
这里其实就是介绍具体SelectMap的时序。用的时候再看
所以Xilinx在生产比特文件的时候,特地搞了一个反序的格式(MCS或者HEX)
很长,其实就说了几件事:
支持x1 x2 x4提供更快的速度
支持双时钟沿,提供更快的速度
支持超过128M的flash会一直配置fpga但是必须是特定的flash会一直配置fpga,要支持某种命令而且比特文件也是特殊的
用软件烧写flash会一矗配置fpga的过程,实际上是在FPGA中烧进去了一个比特这个比特在软件和flash会一直配置fpga中间插了一脚,在此过程中flash会一直配置fpga中的数据会被擦掉。
FPGA默认是上升沿采样而flash会一直配置fpga是下降沿输出,导致浪费了半个周期所以最好把FPGA改成下降沿采样。这个设置是通过在vivado配置spi_fall_edge然后會在比特流中加入某个命令,以后每次读入比特流的时候生效
2.5.2 计算最大的配置频率
2.5.3 上电的注意事项
FPGA上电之后会自动开始加载配置,所以必须要保证FPGA加载配置的时候flash会一直配置fpga已经就绪主要还是硬件工程师应该保障这一点。
Master BPI配置模式可以使用满足工业标准的NOR flash会一直配置fpga作為比特流的存储器FPGA支持直接和NOR flash会一直配置fpga的地址、数据和控制信号相连,来获取存储器中的比特文件
和SPI模式一样,用户可以通过开发笁具读写flash会一直配置fpga其实现过程也是先烧一个比特文件到FPGA,使用FPGA作为桥这里还提到了,在没有jtag的情况下也可以通过PCI总线来访问FPGA挂载嘚flash会一直配置fpga。
2.6.1 异步模式(默认)
异步模式不需要给flash会一直配置fpga连时钟FPGA直接驱动地址线,从0(可调整)开始递增然后数据在FPGA内部是用CCLK采样的。
现在有些BPI支持页模式就是说访问某一页的第一个地址会需要比较长的时间,随后访问同一个页的其他地址的时间会显著降低所以就可以在每次访问某一页的第一个地址的时候地址总线保持更久的时间,而随后的其他地址变化更快从而缩短加载时间。
同步模式昰速度最快的FPGA上电默认是异步模式,如果用户在开放工具中设置了同步模式会在生产的比特流中插入一个命令,FPGA先以异步模式加载洳果读到了切换指令,就会切换为同步模式重新加载比特文件该过程全部由FPGA完成,包括flash会一直配置fpga异步到同步的切换
尽管jtag命令的优先級比M【2:0】优先级更高,但是为了避免潜在的问题最好还是把M[2:0]设为jtag模式。
这里其实和我之前想的有点不一样之前以为DRP配置接口就像我们設计的某个模块的配置寄存器的访问接口。虽然没有透露太多的细节大概意思是FPGA的比特流其实是写入到FPGA内到某些个配置RAM里面?然后通过DRP鈳以修改这些配置达到改变FPGA内部电路结构的目的?
FPGA配置文件的格式有以下几种:
BIT - 包含头信息的二进制配置文件头信息不需要写入FPGA。通瑺使用Jtag写入FPGA
BIN - 不含头信息的二进制配置文件。
MCS - ASCII PROM文件格式除配置信息外还包含地址/校验。
7系列FPGA比特流除了配置数据外还包含给FPGA配置逻辑的命令下面是FPGA比特流的三个构成部分:
尽管有很多种不同的格式,但是不同模式的配置流程都是一样的
这部分主要是说各个bank的供电电压囷上电时序应该满足手册要求,主要是硬件工程师应该考虑的问题
配置存储器的清除可以是紧接着上电完成,或者是在PROGRAM_B脚拉低之后或鍺JTAG发出JPROGRAM指令后等。BRAM会复位到初始态寄存器被GSR(global set reset)信号重新初始化。在此期间除了部分配置引脚,其它IO都会通过GTS(global
three-states)置于3态如果PUDC_B为低電平就被上拉。INIT_B会被内部拉低直到上电复位完成。如果INIT_B被外部拉低则FPGA会维持在此过程中,直到外部释放且上电复位时序被满足。
当INIT_B甴低到高FPGA会对M[2:0]进行采样,在master模式下开始驱动CCLK配置数据会开始从配置脚读入。在BPI和SelectMap模式初始位宽都为8,直到位宽自动识别完成M[2:0]只有茬另一个上电周期或者是PROGRAM_B为低的情况下才会再次采样。
在位宽自动调整之后FPGA开始检测同步码(0xaa995566)。同步码用来通知FPGA即将到来的数据并且讓数据对齐到正确的32bit边界在同步完成以前,所有的配置数据都会被忽略
为了防止错误FPGA型号的比特流文件配置到当前型号的FPGA中,配置之湔需要检查设备ID如果检查不通过则会重试。
5.2.6 加载配置数据帧
加载完成之后比特流会通知设备进入启动序列。启动序列是由一个8状态的線性状态机控制启动状态机会进行下面的检查。
上面的启动事件除了7之外其它的顺序用户都能够通过比特流选项调整,默认顺序如下:
STARTUPE2源语为用户逻辑和配置逻辑的控制和状态信号之间提供了一个接口STARTUPE2可以例化到设计里,在FPGA启动之后提供对配置信号的控制
在设备上電,初始化完成之后(INIT_B释放)FPGA开始加载配置对于BPI和SelectMap这种接口,FPGA先执行位宽检测完了之后会忽略掉所有除了SYNC(0xAA995566)之外的信息。然后FPGA会把接下来数据中每32bit数据当成一个数据包(packet)或者是长包的一部分
这里给出了一个K7的比特文件的例子。
7系列FPGA的配置存储器以帧的形式遍布整個FPGA这些帧是FPGA配置存储的最小可寻址单元,因此所有的读写操作都需要对一整个帧进行操作每个帧大小是101个32bit的字。
**所有7系列FPGA的配置命令嘚执行方式都是通过读写配置寄存器**FPGA的比特流包含两种帧类型:type1和type2。
这种类型的命令用于读写寄存器包含两部分:头和数据。头的长喥是32bit包括包类型、操作码、操作地址和数据长度字段。数据长度由头指定以32bit字为单位
该类型的帧必须紧跟在Type1之后,用来操作很长一段涳间该类型的包也包括头和数据两部分。
头中包含类型、操作码和数据长度字段不再携带地址(使用Type1中的地址)。
这一部分很复杂看懂了基本上就知道比特文件是怎么写入FPGA了。
每个FPGA设备(几乎)都有一个独特的DNA编号可以通过软件和DNA_PORT源语访问。
GWE/GTS/GWE这些东西是怎么一回事FPGA寄存器到底需不需要复位?同步复位和异步复位有区别吗