目录
1.4配置流程
1.4.1 设备上电
编辑1.4.2 清除配置寄存器
1.4.3 采样模式引脚
1.4.4 同步
编辑1.4.5 检测设备ID
编辑1.4.6 加载配置数据
1.4.7 CRC校验
1.4.8 启动序列
1.4配置流程
对于所有配置模式,7系列的基本配置流程都是相同的,主要可以分为三个大块:设备启动,数据流加载,启动序列。
1.4.1 设备上电
配置流程的第一步自然是设备上电,这里也就解释了为何固化程序后需要下电再上电才能生效。配置涉及到的电源如下:
VCCO_0以及VCCO_14、VCCO_15在前文已经提及,其他的电源需要参照对应的数据手册推荐值进行配置,例如K7对应手册【DS182】:
FPGA在设备启动阶段的时序关系:
TPOR:Power-on Reset (POR);TICCK:CCLK Output Delay
FPGA上电启动后电压达到VCCO后在10~50ms后INIT_B信号拉高,初始化完成,FPGA开始加载配置工作。
上电后可以通过拉低将PROGRAM_B引脚切换为低电平来重新配置器件:
INIT_B在初始化期间被内部驱动为低电平,然后在上电情况下(第一次上电配置)在TPOR之后释放,在其他情况下(触发退回或者重配置等)在TPL之后释放。如果INIT_B引脚在外部保持低电平,则器件在初始化过程中的这一点等待,直到该引脚被释放,并且需要满足TPOR或TPL延迟。
FPGA上电第一次加载与PROGRAM_B没有关系,只要达到延迟时间,FPGA就会初始化完成,INIT_B信号拉高,直接进入配置数据过程。只有第二次重新配置才使用PROGRAM_B。
图中的时间参数可以在对应的FPGA数据手册中查看,如K7系列对应【DS182】:
1.4.2 清除配置寄存器
在器件上电后、PROGRAM_B引脚脉冲低电平后、使用JTAG JPROGRAM指令或IPROG命令后或在回退重试配置序列期间,配置存储器会顺序清除。在此期间:
Block RAM被重置为其初始状态,并且触发器通过全局设置重置(GSR)的断言重新初始化。除少数配置输出引脚外,I/O通过使用全局三态(GTS)置于High Z状态,如果PUDC_B为低电平,则内部上拉。
PUDC_B用于设置配置期间的上拉,低电平有效,电路上通过直连或者≤1kΩ连接到VCCO_14或GND,禁止悬空。
清除配置寄存器发生在INIT_B为低的这个阶段。通常这个时间为3ms。
3ms的时间来自于复旦微的手册中:JFM7K325T清除配置寄存器时间为20ms,而对标产品为3ms。在从模式中推荐等待INIT_B拉高再进行配置。
1.4.3 采样模式引脚
当INIT_B引脚转换为高电平时,器件对模式引脚M[2:0]进行采样并开始驱动CCLK(如果处于主模式)。此时,器件开始在配置时钟的上升沿对配置数据输入引脚进行采样。
对于BPI和SelectMAP模式,总线宽度最初为×8,可以在状态寄存器查看。在总线宽度检测序列之后,状态寄存器被更新。从串行、主串行、SPI和JTAG模式忽略总线宽度检测模式。
只有在通过电源循环或PROGRAM_B置位进行重新配置时,才会再次对模式引脚进行采样。
1.4.4 同步
FPGA正常数据加载前,需要做一个FPGA与配置方(如FLASH)之间的同步检查。方法是将一个特殊的32位同步字(0XAA995566)发送到FPGA。同步字会提醒FPGA即将到来的配置数据并将配置数据与内部配置逻辑对齐。
除“总线宽度自动检测”序列外,同步之前配置输入引脚上的任何数据都将被忽略。
Xilinx在生成的.bit文件中已经自动加入了这个同步字。可以进行查看:
表5-19说明了bit流的定义:
1.4.5 检测设备ID
设备同步后,必须通过设备ID检查才能加载配置数据帧。这可以防止配置具有针对不同设备格式化的比特流。如果在配置期间发生ID错误,设备会尝试执行回退重新配置。
设备ID检查内置于比特流中,器件ID检查是通过配置逻辑的比特流中的命令执行的,而不是通过 JTAG IDCODE 寄存器。ID可以在【UG470】的表1-1中查找到,例如7K325T对应3651093,可以在bit文件中查找到:
1.4.6 加载配置数据
在准备工作完成后,FPGA开始加载配置数据。在这个过程中,FPGA的所有可配置I/O根据HSWAPEN引脚的设置变为弱上拉(HSWAPE=1)或者高阻态(HSWAPE=0)。这个阶段的I/O引脚还没有变为用户需要的状态,也最有可能影响到其他外围电路的上电时序和运行。
设计硬件电路时要特别注意并采取必要措施,如加入上下拉电阻或改变器件加电顺序来尽量避免或减少FPGA配置时对电路其他器件的影响。
1.4.7 CRC校验
加载配置数据帧时,器件会根据配置数据包计算循环冗余校验(CRC)值。加载配置数据帧后,配置比特流可以向设备发出校验 CRC指令,然后是预期的CRC值。如果设备计算的 CRC 值与比特流中的预期CRC值不匹配,则设备将INIT_B拉低并中止配置,此时用户必须把PROG-B引脚拉低,才能进行重新配置。
默认情况下,CRC校验包含在配置比特流中,如果禁用CRC检查,则存在加载错误配置数据帧的风险,从而导致错误的设计行为或损坏器件。
1.4.8 启动序列
加载配置帧后,FPGA不会马上执行用户的逻辑,比特流指示设备进入启动序列。启动顺序由8阶段(阶段0-7)顺序状态机控制。用户可以选择每个启动事件的特定阶段(见【UG628】):
可以强制启动序列等待 MMCM 锁定或等待DCI与适当的选项匹配。这些选项通常设置为在MMCM锁定和/或DCI匹配之前防止DONE、GTS和GWE被断言(防止设备操作)。
默认情况下,启动顺序:
与启动相关的信号:
DONE信号可通过DONE引脚或7系列FPGA状态寄存器获取,其余只能通过7系列FPGA状态寄存器获取。对应的信号时序如下:
从上图可以看出:
FPGA最后的Startup过程有8个周期,其中DONE变高仅仅是第4个周期。因此,在DONE变高之后还需要再给3个CCLK。否则DONE虽然变高了,FPGA程序并没有正确运行。
ISE会在设计中搜索用户是否使用了DCI,如果是,FPGA会使用2个周期的Start UpPhase,等待DCI匹配上。即FPGA会在那儿等待,直到DCI匹配上。如果我们在上位机读取了配置文件,获得了文件大小,我们把它写到负责加载FPGA的Flash里,然后CCLK时钟就不给了。这就产生问题,因为DCI匹配需要时间,我们的问题就是,过了一段时间,DCI匹配完毕了,但是CCLK却没有了,因此FPGA一直处在Start UP的前2个Phase上,不会到DONE。导致无法配置成功。