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 개발 도구를 설치해야 합니다. 다음 구성 요소가 필요합니다.
- Verilog 컴파일 및 합성: Yosys
- 디버깅 도구: icarus/iverilog 및 verilator
- FPGA 지원 라이브러리: IceStorm(Ice40) 또는 Trellis(ECP5)
- 배치 및 배선: NextPNR
- FPGA로 비트스트림을 전송하는 도구: ujprog
미리 컴파일된 패키지가 몇 가지 있기는 하지만, 도구가 빠르게 발전하면서 점점 더 좋아지고 있으므로 소스 저장소에서 최신 소스 버전을 받는 것을 강력히 권장합니다! 이어지는 내용은 도구의 최신 버전을 받아 설치하는 방법입니다. 일부 단계는 보드에 탑재된 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 전용
- ARTY FPGA 제품군은 이 링크의 안내를 따르십시오.
- 그 밖의 FPGA 제품군은 아래 단계를 따르십시오.
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 제품군에 따라 안내가 다르다는 점에 유의하십시오:
- Ice40 제품군용 IceStorm(보드: IceStick, IceBreaker, IceFeather, Fomu 등)
- ECP5 제품군용 Trellis(보드: ULX3S, OrangeCrab 등)
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
와, 정말 간단합니다! 정말 마음에 듭니다!
모든 준비가 끝났습니다!!!
휴우, 긴 여정이었습니다. 이제 즐길 시간입니다