본 글에서는 Raspberry Pi(라즈베리파이)를 활용해 FPGA 보드를 원격으로 제어 및 프로그래밍(Configuration)하는 구체적인 방법에 대해 설명합니다. 일반적으로 FPGA 개발은 호스트 PC에 연결된 JTAG 케이블을 통해 수행되지만, 테스트 환경이 분리되어 있거나 여러 사용자가 하나의 FPGA 자원을 공유해야 할 때, 혹은 클라우드 기반의 자동화 테스트(CI/CD) 파이프라인을 구축할 때는 원격 프로그래밍이 필수적입니다.
이 튜토리얼에서 사용하는 보드는 Digilent 사의 Nexys A7-100T 모델이며, 구동에 사용한 라즈베리파이는 모델에 무관하게 Debian/Raspbian 기반 운영체제가 설치되어 있다면 동일하게 적용할 수 있습니다. 단, 이 문서에 소개된 유틸리티는 Digilent 사의 제품에 특화되어 있으므로 타사 벤더(예: Altera/Intel, Lattice)나 다른 써드파티 보드를 사용할 경우 추가적인 오픈소스 툴(OpenFPGALoader 등)이 필요할 수 있습니다.
[Preview]
위 시연 영상에서는 라즈베리파이를 통과하여 FPGA 보드에 비트스트림(.bit) 파일이 정상적으로 다운로드되고 코드가 실행되는 과정을 확인할 수 있습니다. 보드 영상과 모니터 녹화 화면 간의 캡처 시간 차이로 인해 약 6초가량의 딜레이가 발생하여 영상 싱크가 완전히 맞지는 않습니다. 이 점을 감안해 영상을 참고해 주시기 바랍니다.
Setup Guide
1. 유틸리티 패키지 다운로드
가장 먼저 할 일은 라즈베리파이 환경에서 Digilent 케이블 및 보드를 인식할 수 있게 해주는 Adept 소프트웨어를 설치하는 것입니다. 아래 공식 링크에 접속하여
Adept Runtime 및 Adept Utilities 두 개의 패키지를 모두 다운로드합니다.
https://cloud.digilent.com/myproducts/Adept?pc=1&tab=2
설치하고자 하는 라즈베리파이의 OS 아키텍처를 정확히 확인해야 합니다. 최신 라즈베리파이 OS(64-bit)를 사용 중이라면 Arm-64-bit
.deb 파일을 선택해야 합니다.
*참고사항: Raspbian 32-bit OS 버전이나 아주 구형의 라즈베리파이를 사용하신다면, 해당
목록에서 Raspberry pi 전용 구버전 파일(Arm-32)을 선택하시기 바랍니다. 아키텍처가 맞지 않으면 패키지 관리자가 설치를 진행하지 못합니다.
라즈베리파이 환경에서 브라우저를 열어 다운로드하는 것이 느리고 번거롭다면, 메인 PC에서 파일을 미리 받아둔 뒤 RealVNC를 사용하여 파일 공유 기능으로 넘기거나, 터미널에서 SCP(Secure Copy Protocol), FileZilla와 같은 SFTP 클라이언트를 이용해 라즈베리파이 로컬 디스크로 전송하는 것을 추천합니다.
2. 패키지 설치 (Install)
파일을 성공적으로 라즈베리파이에 다운로드하거나 옮겼다면 터미널을 열고 파일이 있는 경로로 이동합니다. 이후 `dpkg` 명령어를 통해 Runtime을 먼저 설치한 뒤, Utilities를 설치합니다 (의존성 문제가 발생하면 `apt --fix-broken install`을 활용하세요).
sudo dpkg -i digilent.adept.runtime_<버전 명시>_arm64.deb
sudo dpkg -i digilent.adept.utilities_<버전 명시>_arm64.deb
설치가 완료된 후 터미널 창에 `djtgcfg enum`을 입력하여 연결된 FPGA 보드의 ID 및 Device 이름이 올바르게 나타나는지 확인합니다.
Trouble & Shooting (오류 해결 방안)
아래는 원격 프로그래밍 구축 과정에서 흔히 마주칠 수 있는 문제점과 제가 직접 겪은 에러 메시지에 대한 해결 방안입니다.
에러 1: No devices found (디바이스 인식 실패)
증상: `djtgcfg enum` 명령어를 쳤는데 "No devices found" 문구가 뜨고 보드 정보를 가져오지 못하는 경우입니다.
해결 방법:
- USB 케이블 자체 문제일 가능성이 높습니다. 케이블 중에는 내부 데이터 선 없이 코어 전원 공급(충전) 용도로만 설계된 저가형 케이블이 존재합니다. 데이터 통신이 가능한 마이크로 5핀/Type-C 케이블로 교체해 보세요.
- 보드의 전원 스위치가 켜져 있는지 확인하고, JTAG/USB 부팅 모드 스위치(일반적으로 PROG Jumper) 포지션이 적절히 세팅되어 있는지 보드의 Reference Manual을 참고하여 점검합니다.
- `lsusb` 명령어를 사용해 시스템에서 FTDI 칩셋 혹은 Digilent USB Device를 인식하고 있는지 일차적으로 확인하는 것이 좋습니다.
에러 2: 인가 권한 거부 (Permission Denied)
증상: JTAG 포트 혹은 USB 디바이스에 연결하려 할 때 리눅스 시스템 권한이 없어 접근이 차단되는 현상입니다.
해결 방법: root 권한으로 실행(`sudo djtgcfg ...`)하면 정상 동작하지만, 매번 sudo를 입력하는 것은 자동화 스크립트
작성 시 큰 불편함을 초래합니다. udev 규칙(rules) 파일이 누락되었거나 적용되지 않았기 때문입니다.
`/etc/udev/rules.d/` 디렉토리 내에 Digilent USB 관련 rule 파일(보통 `52-digilent-usb.rules`)이 존재하는지 확인한 뒤,
다음 명령어를 통해 udev 규칙을 새로고침하고 장치를 뺐다가 다시 연결하세요.
sudo udevadm control --reload-rules
sudo udevadm trigger
에러 3: .deb 패키지 설치 중 Architecture Mismatch 에러 발생
증상: dpkg를 통해 설치하려 할 때 "package architecture (armhf) does not match system
(arm64)"와 같은 아키텍처 불일치 에러가 납니다.
해결 방법: 앞서 언급한 대로 라즈베리파이의 OS 비트 수와 다운로드한 패키지 버전이 어긋난 경우입니다. 라즈베리파이 터미널에서 `uname
-m`을 입력하여 결과를 확인하세요. `aarch64`가 뜬다면 64-bit OS이며, `armv7l` 등이 나오면 32-bit OS입니다. 본인 OS에 대응하는 파일을
Digilent 사이트에서 다시 받아 설치하시면 해결됩니다.
위 문제들을 모두 해결하고 나면, `djtgcfg prog -d <device_name> -i 0 -f <bitstream.bit>` 명령어를 사용하여 원격에서 언제든지 비트스트림 파일을 보드에 올릴 수 있습니다!