| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
- AVR
- atmel
- Visual Studio
- vscode
- Linux
- 디버깅
- C++
- Visual Studio Code
- 리눅스
- nucleo
- Raspberry
- robot
- UART
- 라즈베리파이
- buildroot
- yocto
- QT
- QEMU
- raspberrypi
- bare metal
- GPIO
- 문자 장치
- esp32
- c#
- Arduino
- yocto project
- WPF
- STM32
- Debug
- 아두이노
- Today
- Total
임베디드를 좋아하는 조금 특이한 개발자?
[FPGA][Vivado] Kira KV260 보드에서 GPIO를 구현을 위한 프로젝트 구성 본문
- 개발 환경
Vivado 2026.01
- 소스 코드
https://github.com/MainForm/kv260-pmod-gpio-hw
GitHub - MainForm/kv260-pmod-gpio-hw
Contribute to MainForm/kv260-pmod-gpio-hw development by creating an account on GitHub.
github.com
1. 서론
저는 보드를 새로 구입하기 가장 먼저하는 것이 GPIO를 구현해보는 것입니다. GPIO는 Peripheral 중에서 가장 구현하기 기 쉬우면서 대부분의 Pin은 GPIO를 지원하기 때문입니다. 그래서 역시 KV260 보드를 구매하면서 GPIO를 구현하는 것을 목표로 하였습니다.
2. KV260의 PS(Processing System) 영역과 PL(Programmable Logic) 영역
Xilinx의 FPGA인 KV260 보드에서 GPIO를 구현하는 것은 일반 임베디드 환경과 조금 차이가 있습니다. PS(Processing System)영역과 PL(Programmable Logic) 영역이 나뉘어져 있다는 것입니다.
PS(Processing System) 영역은 간단히 말하자면 MPU 부분이라고 생각하도 무리가 없습니다. PS 영역은 우리가 임베디드 개발 하듯이 개발하는 것과 차이가 없습니다. 예를 들면 RTOS나 Linux와 같이 OS가 동작하는 부분이 PS 영역입니다.
PL(Programmable Logic) 영역은 FPGA 부분이라고 생각하시면 편합니다. 그러니까 하드웨어의 동작(Logic)를 구성(Programming)하는 부분입니다.

위 그림은 KV260 내부 구성도 입니다. 여기서 PS에 직접적으로 연결된 인터페이스인 HDMI, DP, Ethernet은 PS에 직접적으로 연결되어 있어 따로 설정하지 않아도 PS영역 내 Controller가 존재하기 때문에 사용가능합니다.
하지만, PMOD, IAS, MIPI의 경우는 PL 영역에 연결되어 있습니다. 그러므로 PL 영역에 우리가 직접 Controller를 구성하지 않는다면 해당 인터페이스를 사용할 수 없습니다.
그렇다면 굳이 해당 인터페이스를 PL에 연결한 이유는 큰 대역폭이 필요한 인터페이스의 경우 PL영역에서 하드웨어로 구성하여 성능 최적화를 할 수 있으며 PL 영역에 다양한 Peripheral를 구성하여 자유롭게 원하는 Interface를 구성할 수 있는 장점이 있습니다.
이번에 우리는 GPIO를 구현하기 위해서 PL의 PMODE를 사용할 예정입니다. 그러므로 PL에 GPIO Controller를 구성하기 위해 Vivado를 사용해보도록 하겠습니다.
3. Vivado 프로젝트 생성








4. Block Diagram 구성
4.1. KV260의 Ultrascale+ MPSoc IP Block구성











4.2. AXI GPIO IP Block 구성








4.2. Design Block의 HDL Wrapper 생성
C나 C++에서 코드가 main 함수에서 시작하듣이 Vivado에서도 로직 진입점인 top module이 필요합니다. 그리고 해당 top module은 Verilog나 VHDL로 작성됩니다. 하지만, Design Block은 Verilog나 VHDL이 아니므로 Verilog로 작성된 HDL Wrapper로 Design Block를 감싸는(Wrapping) 것입니다.



5. Constrains 구성
이번에는 Constrain로 우리가 구성하였던 Block Design에서 입력 및 출력을 실제 물리적인 Pin과 매칭하기 위해서 사용합니다. 그 외에도 Constrains 클럭이나 전압등 다양한 설정을 하기 위해서도 사용됩니다.
5.1. Design Block의 출력 Pin 확인





위 과정을 통해 "pmod_led_tri_o[0]"이 실제 출력Pin 이름인 것을 확인했습니다.
5.2. Constrains 파일 생성






https://github.com/MainForm/kv260-pmod-gpio-hw/blob/main/src/constraints/kv260_pmod.xdc
set_property PACKAGE_PIN H12 [get_ports {pmod_led_tri_o[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {pmod_led_tri_o[0]}]
Contrains를 통해 Design Block Pin과 실제 물리Pin을 매칭하고, 출력에 대한 속성을 지정해줍니다.
PACKAGE_PIN으로 Design Block Pin과 실제 물리 Pin을 매칭하는 속성입니다.
IOSTANDARD는 해당 핀에 대해서 전기적 인터페이스를 지정하는 속성입니다.
IOSTANDARD를 통해서 LVCMOS(Low Level CMOS)를 사용하여 3.3V를 사용한다는 것입니다.
해당 Constrains은 공식 Xilinx의 XDC를 참고하여 작성했습니다.
https://github.com/Xilinx/kria-vitis-platforms/blob/main/kv260/platforms/kv260_bist/xdc/pin.xdc
kria-vitis-platforms/kv260/platforms/kv260_bist/xdc/pin.xdc at main · Xilinx/kria-vitis-platforms
Kria Vitis platforms and overlays. Contribute to Xilinx/kria-vitis-platforms development by creating an account on GitHub.
github.com
#Digilent PMOD pins:
#HDA11, HDA12, HDA13, HDA14, HDA15, HDA16, HDA17, HDA18
set_property PACKAGE_PIN H12 [get_ports PMOD_GPIO_tri_io[0]]
set_property PACKAGE_PIN E10 [get_ports PMOD_GPIO_tri_io[1]]
set_property PACKAGE_PIN D10 [get_ports PMOD_GPIO_tri_io[2]]
set_property PACKAGE_PIN C11 [get_ports PMOD_GPIO_tri_io[3]]
set_property PACKAGE_PIN B10 [get_ports PMOD_GPIO_tri_io[4]]
set_property PACKAGE_PIN E12 [get_ports PMOD_GPIO_tri_io[5]]
set_property PACKAGE_PIN D11 [get_ports PMOD_GPIO_tri_io[6]]
set_property PACKAGE_PIN B11 [get_ports PMOD_GPIO_tri_io[7]]
set_property IOSTANDARD LVCMOS33 [get_ports PMOD_GPIO_tri_io[*]]
set_property SLEW SLOW [get_ports PMOD_GPIO_tri_io[*]]
set_property DRIVE 4 [get_ports PMOD_GPIO_tri_io[*]]
6. Bitstream 생성
Bitstream 파일은 프로그래밍으로 비유하면 실행 파일 또는 바이너리 파일과 같은 개념입니다. Bitstream는 PL영역이 어떻게 구성되어야하는지 나타내는 파일입니다.
6.1. Implementaion 실행
Implementaion은 프로그래밍에서 Build하는 것과 같은 동작입니다. 출력 파일인 Bistream을 만들기전 PL영역을 어떻게 구성할지 확인하고 동작에 문제가 있는지 확인하는 과정입니다.



Implementation은 시간이 오래걸리는 작업입니다. Design Runs의 윈도우에서 현재 진행 상황을 확인할 수 있습니다.


6.1. Bitstream 생성




6. XSA 파일
XSA는 Vivado Project에서 설정한 PL 영역에 대해서 PS 영역에서 개발을 할때 PL영역에 대한 정보를 참조할 수 있도록 하기 위한 파일 Package입니다. 그러므로 Vitis나 EDF Linux에서 XSA파일을 통해 PL 영역에 대한 정보(Memory map, IP Block, bitstream 등)를 확인할 수 있습니다.
그래서 XSA 파일은 zip으로 압축되어 있어 압축을 해제 할 수 있으며, XSA안에 bitstream 또한 포함되어 있습니다.(bitstream 포함은 xsa 생성시 선택해야 합니다.)

6.1. XSA 파일 생성





7. 결론
이번 포스트는 단순히 GPIO를 PS 영역에서 사용할 수 있도록 Vivado Project를 구성했습니다. 이제는 XSA파일로 Vitis에서 GPIO를 제어하는 실습을 할 예정입니다. 이를 통해 KV260으로 PL 영역부터 PS 영역까지 개발 흐름을 확인하는 것이 목적입니다.
생각보다 ZYBO Z7으로 개발할 때와 많은 차이가 없어서 다행이 였습니다. 하지만 KV260 보드에 대한 정보가 많이 없어 초기 프로젝트를 구성하는데 애를 먹었습니다. 그래도 문제를 해결해 나가면서 KV260 보드에 대해서 더 알아가는 과정이였기에 재미있었습니다.
