FPGA 개발을 위한 오픈 소스 도구 설치하기

최신 소식(2023년 4월): Ice40 및 ECP5 기반 FPGA용으로 미리 빌드된 툴체인을 여기에서 내려받을 수 있습니다(Windows/Mac/Linux).

패키지를 내려받은 다음, 사용할 때마다 source ~/where/you/unpacked/it/oss-cad-suite/environment 명령으로 경로를 설정하기만 하면 됩니다(이 점을 알려 주신 @mecrisp 님께 감사드립니다).

이어지는 내용은 도구를 직접 컴파일하려는 분이나 Ice40 또는 ECP5가 아닌 다른 FPGA(예: ARTY)를 가진 분을 위한 것입니다.

참고: 다음 설명은 Linux 기준입니다(저는 Ubuntu를 사용합니다). Windows 사용자는 WSL을 사용하여 이 튜토리얼을 진행할 수 있습니다. 여기에서 설명하듯이 약간의 조정이 필요합니다.

시작하기 전에 오픈 소스 FPGA 개발 도구를 설치해야 합니다. 다음 구성 요소가 필요합니다.

미리 컴파일된 패키지가 몇 가지 있기는 하지만, 도구가 빠르게 발전하면서 점점 더 좋아지고 있으므로 소스 저장소에서 최신 소스 버전을 받는 것을 강력히 권장합니다! 이어지는 내용은 도구의 최신 버전을 받아 설치하는 방법입니다. 일부 단계는 보드에 탑재된 FPGA의 종류에 따라 달라지므로 다음 표를 참고하십시오.

보드 FPGA 제품군
IceStick Ice40
IceBreaker Ice40
IceFeather Ice40
FOMU Ice40
ULX3S ECP5
OrangeCrab ECP5
ECP5-EVN ECP5
ARTY artix-7 (xc7)
tang nano 9k gowin

1단계: FemtoRV

$ git clone https://github.com/BrunoLevy/learn-fpga.git

ARTY 전용

2단계: Yosys 및 관련 도구

yosys 웹사이트의 설치 안내를 따르십시오.

요약

필수 패키지를 설치합니다:

$ sudo apt-get install build-essential clang bison flex \
  libreadline-dev gawk tcl-dev libffi-dev git \
  graphviz xdot pkg-config python3 libboost-system-dev \
  libboost-python-dev libboost-filesystem-dev zlib1g-dev

소스를 받습니다:

$ git clone https://github.com/YosysHQ/yosys.git

컴파일하고 설치합니다:

$ cd yosys
$ make
$ sudo make install

icarus/iverilog 및 verilator

분석 도구와 시뮬레이션 도구도 필요합니다. icarus/iverilog는 컴파일 시점에 추가 검사를 수행할 수 있으며, 빌드 시스템에서 make lint가 이를 호출합니다. verilator는 디버깅에 꼭 필요한 시뮬레이션을 수행합니다. 또한 빌드 시스템은 이 도구를 사용하여 하드웨어 구성 매개변수를 펌웨어에 전달합니다.

sudo apt-get install iverilog verilator

3단계: FPGA 지원 라이브러리

사용하는 FPGA 제품군에 따라 안내가 다르다는 점에 유의하십시오:

IceStorm(Ice40 FPGA용)

icestorm 웹사이트의 설치 안내를 따르십시오.

요약

필수 패키지를 설치합니다:

$ sudo apt-get install build-essential clang bison flex libreadline-dev \
  gawk tcl-dev libffi-dev git mercurial graphviz   \
  xdot pkg-config python python3 libftdi-dev \
  qt5-default python3-dev libboost-all-dev cmake libeigen3-dev

소스를 받습니다:

$ git clone https://github.com/YosysHQ/icestorm.git

컴파일하고 설치합니다:

$ cd icestorm
$ make -j 4
$ sudo make install

Project Trellis(ECP5 FPGA용)

project trellis 웹사이트의 설치 안내를 따르십시오.

요약

소스를 받습니다:

$ git clone --recursive https://github.com/YosysHQ/prjtrellis

컴파일하고 설치합니다:

$ cd prjtrellis/libtrellis
$ cmake -DCMAKE_INSTALL_PREFIX=/usr/local .
$ make
$ sudo make install

Apycula (gowin FPGA용)

$ pip install apycula --break-system-packages

4단계: NextPNR

nextpnr 웹사이트의 설정 안내를 따르십시오

요약

소스를 받습니다:

$ git clone --recursive https://github.com/YosysHQ/nextpnr.git

Ice40 FPGA용 NextPNR 컴파일 및 설치

컴파일하고 설치합니다:

$ cd nextpnr
$ cmake -DARCH=ice40 -DCMAKE_INSTALL_PREFIX=/usr/local .
$ make -j 4
$ sudo make install

ECP5 FPGA용 NextPNR 컴파일 및 설치

컴파일하고 설치합니다:

$ cd nextpnr
$ cmake -DARCH=ecp5 -DTRELLIS_INSTALL_PREFIX=/usr/local -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_GUI=on .
$ make -j 4
$ sudo make install

GOWIN FPGA용 NextPNR 컴파일 및 설치

컴파일하고 설치합니다:

git clone --recursive https://github.com/YosysHQ/nextpnr.git
cd nextpnr
cmake . -B build -DARCH=himbaechel -DHIMBAECHEL_UARCH=gowin -DHIMBAECHEL_GOWIN_DEVICES=GW1N-9C -DCMAKE_INSTALL_PREFIX=/usr/local
cd build
make -j 4
sudo make install

5단계: FPGA에 비트스트림을 전송하는 도구

일반 사용자가 USB를 통해 IceStick을 프로그래밍할 수 있도록 해야 합니다. 이 작업은 /etc/udev/rules.d에 파일을 만들어 수행할 수 있습니다. 방법은 FPGA마다 다릅니다. 그다음 FPGA에 플래싱할 도구가 필요합니다(설치 방법은 아래 안내를 참고하십시오). 참고: openFPGALoader는 빠르게 발전하고 있는 도구로, 대부분의 FPGA를 지원하는 것으로 보입니다(TODO: openFPGALoader를 체계적으로 사용하도록 이 튜토리얼과 안내를 업데이트할 것. 이쪽이 올바른 방향으로 보임...).

Ice40 FPGA (iceprog)

/etc/udev/rules.d에 다음 내용으로 53-lattice-ftdi.rules 파일을 만드십시오:

ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="0660", GROUP="plugdev", TAG+="uaccess"

(추가로 설치할 도구는 없습니다. iceprog는 3단계에서 설치한 icestorm에 포함되어 있습니다)

OrangeCrab (ECP5)

/etc/udev/rules.d에 다음 내용으로 99-orangecrab.rules 파일을 만드십시오:

ATTRS{idVendor}=="1209", ATTRS{idProduct}=="5af0", MODE="0666", GROUP="plugdev", TAG+="uaccess"
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6014", MODE="0666", GROUP="dialout"
ATTRS{idVendor}=="1209", ATTRS{idProduct}=="5bf2", MODE="0666", GROUP="dialout"

OrangeCrab은 DFU 모드로 동작하므로 (아래의 FOMU와 마찬가지로) dfu-util이 필요합니다. 참고: OrangeCrab을 프로그래밍할 때는 DFU 모드로 진입하도록 버튼을 누른 채로 연결하십시오.

FOMU

FOMU에는 Ice40up5k FPGA(Ice40 계열)가 들어 있지만, 다른 USB 규칙과 도구가 필요합니다:

/etc/udev/rules.d에 다음 내용으로 99-fomu.rules 파일을 만드십시오:

SUBSYSTEM=="usb", ATTRS{idVendor}=="1209", ATTRS{idProduct}=="5bf0", MODE="0664", GROUP="plugdev"

dfu-util을 설치합니다(FOMU/OrangeCrab용):

$ sudo apt-get install dfu-util

FOMU 또는 OrangeCrab을 (버튼을 누른 채로) 연결하고 테스트하십시오:

$ dfu-util -l

다음과 비슷한 내용이 표시되어야 합니다:

dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/

Found DFU: [1209:5bf0] ver=0101, devnum=20, cfg=1, intf=0, path="1-1", alt=0, name="Fomu PVT running DFU Bootloader v1.9.1", serial="UNKNOWN"

ECP5 FPGA

/etc/udev/rules.d에 다음 내용으로 80-fpga-ulx3s.rules 파일을 만듭니다:

# this is for usb-serial tty device
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015", \
  MODE="664", GROUP="dialout"
# this is for ujprog libusb access
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015", \
  GROUP="dialout", MODE="666"

이제 ujprog(비트스트림을 FPGA로 보내는 도구)를 설치합니다:

git clone https://github.com/emard/ulx3s-bin
sudo cp ulx3s-bin/usb-jtag/linux-amd64/ujprog /usr/local/bin

모든 FPGA

OpenFPGALoader는 여러 FPGA를 지원하며 사용하기도 쉽습니다. 설치하려면 문서를 따르거나, 간단히(TL;DR) 다음을 실행하십시오:

$ git clone https://github.com/trabucayre/openFPGALoader.git
$ apt-get install libftdi1-2 libftdi1-dev libhidapi-libusb0 libhidapi-dev libudev-dev cmake pkg-config make g++
$ cd openFPGALoader
$ mkdir build
$ cd build
$ cmake ../
$ make
$ sudo make install

지원되는 보드 목록을 보려면 다음을 실행하십시오:

$ openFPGALoader --list-boards

비트스트림을 SRAM으로 보내려면(임시로 프로그래밍)

$ openFPGALoader --board my_board my_design.bit

비트스트림을 FLASH로 보내려면(영구적으로 프로그래밍)

$ openFPGALoader --board my_board -f my_design.bit

와, 정말 간단합니다! 정말 마음에 듭니다!

모든 준비가 끝났습니다!!!

휴우, 긴 여정이었습니다. 이제 즐길 시간입니다