Xilinx FPGA 通过 FLASH 加载程序的时序是什么?
Source: Dev.to
1. Global power‑up & FPGA initialization
在加电后,所有 FPGA 电源会逐渐上升(VCCINT、VCCAUX、VCCO_0 等)。
在 POR / 配置重新启动时:
- PROG_B 拉低 → FPGA 清除其配置存储器。
- DONE 和 INIT_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‑bit | 1 |
| “ | READ (0x03) | 24‑bit | 0 |
Configuration transaction (simplified)
- FPGA 将 CSO_B / FCS_B 拉低(对 Flash 进行片选)。
- FPGA 的内部振荡器产生 CCLK,在 CCLK 引脚上输出(同时为 Flash 时钟)。
- 在 MOSI 上,FPGA 发送:
- 8 位 READ 命令(0x03 或 0x0B)。
- 24 位起始地址,通常为
0x000000。 - 若使用 fast‑read,则发送所需的虚拟字节。
- Flash 在 MISO → DIN / D_IN 上响应,流式输出位流数据。
- FPGA 持续时钟 CCLK 并移入数据,直至接收完整位流(通过头部 + 同步字 + 长度和 CRC 进行识别)。
如果位流有效(CRC 正确),器件完成配置并进入启动阶段。
你可以根据总线宽度(SPI 为 1/2/4,BPI 为 8/16 等)以及 Xilinx 文档中给出的参数来估算配置时间。
4. Startup sequence & DONE
位流加载并校验完成后,FPGA 执行内部启动序列。一个典型(简化)的顺序——确切顺序可通过 UG470 中的位流选项进行配置——如下:
- 释放 GSR(全局置位/复位)。
- 释放 GTS(三态 → I/O 变为活动)。
- 将 DONE 拉高(开漏,外部上拉)。
- 可选地在内部逻辑中断言 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
在设计或调试板子时:
- 等待所有 FPGA 电源的 POR。
- 等待 INIT_B 为高。
- 从 Flash 传输位流(监视 CCLK、CS、MOSI、DIN)。
- 观察 DONE 拉高并且用户逻辑启动。
Oscilloscope‑debug recipe
探测以下信号:VCCINT、VCCAUX、VCCO_0、INIT_B、CCLK、CSO_B/FCS_B、DIN、DONE。
确认:
- INIT_B 在电源正常后上升。
- FPGA 实际切换 CCLK 和 CS。
- DIN 正在传输数据。
- DONE 最终拉高。
If configuration fails
- 核实 Flash 内容和地址(位流必须位于 FPGA 预期的地址,通常是
0x0)。 - 确保 M[2:0] / VS[2:0] 为所选 Flash 命令和总线宽度正确设置。
- 确认 Flash 的 tPU 足够快,或根据需要对 INIT_B / PROG_B 进行门控。