Xilinx FPGA 通过 FLASH 加载程序的时序是什么?

发布: (2025年12月11日 GMT+8 16:47)
5 min read
原文: Dev.to

Source: Dev.to

1. Global power‑up & FPGA initialization

在加电后,所有 FPGA 电源会逐渐上升(VCCINT、VCCAUX、VCCO_0 等)。

在 POR / 配置重新启动时:

  • PROG_B 拉低 → FPGA 清除其配置存储器。
  • DONEINIT_B 被拉低。

当内部存储器清除完成后,INIT_B 在外部上拉电阻的作用下被释放为高电平,表示“准备接受位流”。在此上升沿,FPGA 采样模式引脚 M[2:0] 和变体引脚 VS/FS[2:0],以决定采用何种配置方式(SPI 还是 BPI、x1 还是 x4、使用哪个操作码等)。

在许多设计中,需要完整的“等待 POR + INIT_B 为高”过程。XAPP951 明确指出,如果 Flash 需要 > 2 ms 才能唤醒,你可以保持 INIT_B 低到那时为止。

一旦 INIT_B 被允许上升,FPGA 会立即进入从 Flash 配置的步骤。

3. Actual configuration from SPI Flash

此时 FPGA 处于 SPI‑master 配置模式。

Mode pins for SPI

  • Virtex‑5 示例:M[2:0] = 0 0 1,在 INIT_B 上升时采样。
  • 7‑Series 使用类似的编码(参见 UG470)。

Variant pins VS/FS[2:0]

这些引脚告诉 FPGA 使用哪种 SPI 操作码,例如:

VS/FS 值操作码地址宽度虚拟字节
FAST READ (0x0B)24‑bit1
READ (0x03)24‑bit0

Configuration transaction (simplified)

  1. FPGA 将 CSO_B / FCS_B 拉低(对 Flash 进行片选)。
  2. FPGA 的内部振荡器产生 CCLK,在 CCLK 引脚上输出(同时为 Flash 时钟)。
  3. MOSI 上,FPGA 发送:
    • 8 位 READ 命令(0x03 或 0x0B)。
    • 24 位起始地址,通常为 0x000000
    • 若使用 fast‑read,则发送所需的虚拟字节。
  4. Flash 在 MISO → DIN / D_IN 上响应,流式输出位流数据。
  5. FPGA 持续时钟 CCLK 并移入数据,直至接收完整位流(通过头部 + 同步字 + 长度和 CRC 进行识别)。

如果位流有效(CRC 正确),器件完成配置并进入启动阶段。

你可以根据总线宽度(SPI 为 1/2/4,BPI 为 8/16 等)以及 Xilinx 文档中给出的参数来估算配置时间。

4. Startup sequence & DONE

位流加载并校验完成后,FPGA 执行内部启动序列。一个典型(简化)的顺序——确切顺序可通过 UG470 中的位流选项进行配置——如下:

  1. 释放 GSR(全局置位/复位)。
  2. 释放 GTS(三态 → I/O 变为活动)。
  3. DONE 拉高(开漏,外部上拉)。
  4. 可选地在内部逻辑中断言 EOS(启动结束)。

关键外部引脚行为

引脚配置期间的状态成功启动后的状态
DONE高(需要外部上拉;旧系列约 330 Ω, 新系列为 kΩ)
INIT_B在初始化期间以及任何 CRC/配置错误时为低当初始化完成且配置成功时为高

如果检测到 CRC 或其他错误,FPGA 可以:

  • INIT_B 拉低,
  • 中止配置,
  • 可选地在下次尝试时回退 / MultiBoot 到 Flash 的另一个地址。

5. Putting it all together – textual timing sketch (Master SPI)

Power rails:   ----ramp----> [all above POR] ---------------------------

PROG_B:        ---------L (clear config) ---- H ------------------------>

INIT_B:        L (clear mem) ------H (mode pins sampled) ----- H ------->
               ^ rises when rails are good

M[2:0]/VS[2:0]:       (must be stable BEFORE INIT_B rises) -------------

CSO_B/FCS_B:                           H -----L-----------------H------->
               ^ low during the read transaction

CCLK:                                  idle  clock...clock...  idle ---->

MOSI:                                  cmd  + addr + dummy + ...  ------>

DIN (D_IN):                                   

DONE:        L.............................L..............H(user mode)->

INIT_B 上升到 DONE 上升的这段时间即为位流加载 + 启动时间。
如果 Flash 未就绪或位流损坏,INIT_B 会再次拉低,DONE 永远不会变高。

6. Board‑level design tips

在设计或调试板子时:

  1. 等待所有 FPGA 电源的 POR
  2. 等待 INIT_B 为高
  3. 从 Flash 传输位流(监视 CCLK、CS、MOSI、DIN)。
  4. 观察 DONE 拉高并且用户逻辑启动

Oscilloscope‑debug recipe

探测以下信号:VCCINTVCCAUXVCCO_0INIT_BCCLKCSO_B/FCS_BDINDONE

确认:

  • INIT_B 在电源正常后上升。
  • FPGA 实际切换 CCLKCS
  • DIN 正在传输数据。
  • DONE 最终拉高。

If configuration fails

  • 核实 Flash 内容和地址(位流必须位于 FPGA 预期的地址,通常是 0x0)。
  • 确保 M[2:0] / VS[2:0] 为所选 Flash 命令和总线宽度正确设置。
  • 确认 Flash 的 tPU 足够快,或根据需要对 INIT_B / PROG_B 进行门控。
Back to Blog

相关文章

阅读更多 »