Xilinx FPGA가 FLASH를 통해 프로그램을 로드하는 타이밍 시퀀스는 무엇인가요?
Source: Dev.to
1. Global power‑up & FPGA initialization
전원이 인가된 후, 모든 FPGA 전원(VCCINT, VCCAUX, VCCO_0 등)이 램프업됩니다.
POR / 설정 재시작 시:
- PROG_B가 Low로 내려가면 FPGA는 설정 메모리를 클리어합니다.
- DONE와 INIT_B가 Low로 구동됩니다.
내부 메모리 클리어가 끝나면 INIT_B가 (외부 풀‑업에 의해) High로 해제되어 “비트스트림을 받을 준비가 됨”을 나타냅니다. 이 상승 엣지에서 FPGA는 모드 핀 **M[2:0]**와 변형 핀 **VS/FS[2:0]**을 샘플링하여 어떻게 구성할지 결정합니다(SPI vs. BPI, x1 vs. x4, 어떤 opcode 등).
많은 설계에서 “POR 대기 + INIT_B High” 전체가 필요합니다. XAPP951은 플래시가 깨우는 데 > 2 ms가 필요하면 그때까지 INIT_B를 Low로 유지할 수 있다고 명시합니다.
INIT_B가 High로 올라가면 FPGA는 즉시 플래시에서 구성 단계로 진행합니다.
3. Actual configuration from SPI Flash
이제 FPGA는 SPI‑마스터 구성 모드에 들어갑니다.
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 opcode를 지정합니다. 예:
| VS/FS 값 | Opcode | 주소 폭 | Dummy 바이트 |
|---|---|---|---|
| “ | FAST READ (0x0B) | 24‑bit | 1 |
| “ | READ (0x03) | 24‑bit | 0 |
Configuration transaction (simplified)
- FPGA가 CSO_B / FCS_B를 Low로 내립니다(플래시 칩‑셀렉트).
- FPGA 내부 오실레이터가 CCLK를 생성하고 CCLK 핀으로 출력합니다(플래시도 이 클럭으로 동작).
- MOSI에서 FPGA는 다음을 전송합니다:
- 8‑bit READ 명령(0x03 또는 0x0B).
- 24‑bit 시작 주소(보통
0x000000). - FAST‑READ 사용 시 필요한 Dummy 바이트.
- 플래시는 MISO → DIN / D_IN으로 비트스트림 데이터를 스트리밍합니다.
- FPGA는 전체 비트스트림을 받을 때까지 CCLK를 계속 클럭하고 데이터를 시프트합니다(헤더 + 동기 워드 + 길이 및 CRC로 끝을 인식).
비트스트림이 유효(CRC OK)하면 장치는 구성을 마치고 스타트업 단계로 이동합니다.
버스 폭(SPI의 1/2/4, BPI의 8/16 등)으로 구성 시간을 추정할 수 있으며, 이는 Xilinx 문서에 명시되어 있습니다.
4. Startup sequence & DONE
비트스트림이 로드되고 검증된 후 FPGA는 내부 스타트업 시퀀스를 실행합니다. 일반적인(단순화된) 순서는 UG470의 비트스트림 옵션에 따라 구성 가능하지만 대략은 다음과 같습니다:
- GSR(전역 셋/리셋) 해제.
- GTS(트라이스테이트) 해제 → I/O가 활성화.
- DONE을 High로 구동(외부 풀‑업이 있는 오픈‑드레인).
- 필요에 따라 패브릭 내부에서 EOS(End‑Of‑Startup)를 어설트.
주요 외부 핀 동작
| 핀 | 구성 중 상태 | 성공적인 스타트업 후 상태 |
|---|---|---|
| DONE | Low | High(외부 풀‑업 필요; 구형 패밀리는 ~330 Ω, 최신은 kΩ) |
| INIT_B | 초기화 및 CRC/구성 오류 시 Low | 초기화 완료·구성 성공 시 High |
CRC 등 오류가 감지되면 FPGA는:
- INIT_B를 Low로 내리고,
- 구성을 중단하고,
- 필요 시 다음 시도에서 다른 플래시 주소로 MultiBoot할 수 있습니다.
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가 상승할 때까지가 비트스트림 로드 + 스타트업 시간입니다.
플래시가 준비되지 않았거나 비트스트림이 손상된 경우 INIT_B가 다시 Low로 떨어지고 DONE는 절대 High가 되지 않습니다.
6. Board‑level design tips
보드 설계·디버깅 시 체크리스트:
- 모든 FPGA 레일에 대해 POR을 기다린다.
- INIT_B가 High가 될 때까지 기다린다.
- 플래시에서 비트스트림을 전송한다( CCLK, CS, MOSI, DIN 확인).
- DONE가 High가 되고 사용자 로직이 시작되는지 확인한다.
Oscilloscope‑debug recipe
다음 신호들을 프로브한다: VCCINT, VCCAUX, VCCO_0, INIT_B, CCLK, CSO_B/FCS_B, DIN, DONE.
확인 항목:
- 레일이 정상이면 INIT_B가 상승하는가?
- FPGA가 실제로 CCLK와 CS를 토글하는가?
- DIN에 데이터가 흐르는가?
- 최종적으로 DONE가 High가 되는가?
구성 실패 시 대처
- 플래시 내용과 주소를 검증한다(비트스트림은 보통
0x0주소에 있어야 함). - 선택한 플래시 명령과 버스 폭에 맞게 **M[2:0] / VS[2:0]**가 올바르게 설정됐는지 확인한다.
- 플래시의 tPU가 충분히 빠른지, 필요하면 INIT_B / PROG_B를 적절히 게이트한다.