ECP5 평가 보드 - 튜토리얼

이 튜토리얼에서는 FPGA 개발 도구를 설치하고, RISC-V 코어를 합성하고, 프로그램을 컴파일하고 설치하여 ECP5 평가 보드에서 실행하는 방법을 보여 드립니다.
오픈 소스 FPGA 개발 툴체인 설치
시작하기 전에 오픈 소스 FPGA 개발 툴체인(Yosys, NextPNR 등)을 설치해야 합니다. 설치 방법은 여기에 나와 있습니다.
femtosoc 및 femtorv32 구성
이제 learn-fpga/FemtoRV/RTL/femtosoc_config.v를 편집할
차례입니다. 이 파일에서는 만들 RISC-V 프로세서의 종류와, 함께 구성되는
시스템 온 칩(system-on-chip)에 포함할 장치 드라이버를 정의할 수
있습니다. 지금은 LED(시각적 디버깅용)와 UART(USB를 통한 터미널 연결로
시스템과 통신하기 위한 용도)를 활성화합니다. RAM은 256킬로바이트를
사용합니다. 많은 양은 아니지만, 현재로서는 ULX3S의 DRAM을 사용할 수
없습니다(다만 @sylefeb의 SLICE 메모리 컨트롤러를 통합할 계획입니다).
256kb의 RAM으로도 멋지고 흥미로운 RISC-V 데모를 충분히 프로그래밍할 수
있다는 것을 알게 되실 것입니다.
FemtoRV/RTL/femtosoc_config.v를 다음과 같이
구성합니다(사용하지 않는 옵션은 주석 처리된 줄로 남겨 둡니다):
/*
* Optional mapped IO devices
*/
`define NRV_IO_LEDS // Mapped IO, LEDs D1,D2,D3,D4 (D5 is used to display errors)
//`define NRV_IO_UART // Mapped IO, virtual UART (USB)
//`define NRV_IO_SSD1351 // Mapped IO, 128x128x64K OLed screen
//`define NRV_IO_MAX2719 // Mapped IO, 8x8 led matrix
//`define NRV_IO_SPI_FLASH // Mapped IO, SPI flash
//`define NRV_IO_SPI_SDCARD // Mapped IO, SPI SDCARD
//`define NRV_IO_BUTTONS // Mapped IO, buttons
`define NRV_FREQ 50 // Frequency in MHz. You can try overclocking (up to 100 MHz)
// Quantity of RAM in bytes. Needs to be a multiple of 4.
// Can be decreased if running out of LUTs (address decoding consumes some LUTs).
// 6K max on the ICEstick
//`define NRV_RAM 393216 // bigger config for ULX3S
`define NRV_RAM 262144 // default for ULX3S
//`define NRV_RAM 6144 // default for IceStick (maximum)
//`define NRV_RAM 4096 // smaller for IceStick (to save LUTs)
`define NRV_CSR // Uncomment if using something below (counters,...)
`define NRV_COUNTERS // Uncomment for instr and cycle counters (won't fit on the ICEStick)
`define NRV_COUNTERS_64 // ... and uncomment this one as well if you want 64-bit counters
`define NRV_RV32M // Uncomment for hardware mul and div support (RV32M instructions)
/*
* For the small ALU (that is, when not using RV32M),
* comment-out if running out of LUTs (makes shifter faster,
* but uses 60-100 LUTs) (inspired by PICORV32).
*/
`define NRV_TWOSTAGE_SHIFTER
예제
먼저 프로그램을 생성해야 합니다. 간단한 LED 깜빡이기 프로그램부터 시작합시다(그다지 흥미롭지는 않지만, 뒤에서 더 나아집니다):
cd FIRMWARE
./make_firmware.sh ASM_EXAMPLES/blinker_loop.S
cd ..
이제 설계를 합성하여 장치로 전송할 수 있습니다. 장치를 USB 포트에 연결한 뒤 다음을 실행하십시오:
$make ECP5_EVN
처음 실행하면 RISC-V 개발 도구를 다운로드합니다(시간이 좀 걸립니다).
OLED 화면을 사용하는 예제

멋진 그래픽을 만들어 봅시다. 이를 위해서는 SSD1351 128x128 OLED 디스플레이가 필요합니다. 가격은 약 15달러입니다(ST7789로 구동되는 240x240 IPS 화면처럼 더 저렴한 화면도 있지만, 화질이 훨씬 떨어지고 호환되지도 않습니다. SSD1351은 충분히 그만한 가치가 있으니 믿으셔도 됩니다). 반드시 품질이 좋은 제품을 구하십시오(가격이 5달러 미만이라면 의심해 볼 만합니다. 그런 저가 제품에서 오작동을 겪었다는 사용자 보고가 있습니다). 저는 Waveshare에서 구입했습니다. Adafruit 제품도 잘 작동한다는 보고가 있습니다.
전선을 연결하십시오. 원한다면 ecp5_evn.lpf를 편집하여 핀
할당을 변경할 수 있습니다. 기본 구성은 다음과 같습니다:
| OLED 디스플레이 핀 이름 | 핀 설명 | ECP5-EVN의 핀 |
|---|---|---|
| CS | 칩 선택(Chip Select) | D13 |
| DC | 데이터/명령(Data/Command) | E12 |
| RES 또는 RST | 리셋(Reset) | E13 |
| SDA 또는 DIN | 데이터(Data) | D11 |
| SCL 또는 CLK | 클록(Clock) | D12 |
| VCC | +3.3V | +3.3V |
| GND | 접지(Ground) | GND |
ECP5-EVN에서 핀을 찾는 것은 조금 번거롭습니다. 핀이 비트 순서와 상관없이 무작위처럼 보이는 순서로 배치되어 있기 때문입니다! (하지만 이 괴물 같은 칩에서 모든 핀을 밖으로 라우팅하는 것이 얼마나 어려운 작업인지는 짐작하실 수 있을 것입니다. 특히 커넥터가 아주 많은 이 평가 보드에서는 더욱 그렇습니다.)
이제 FemtoRV/RTL/femtosoc_config.v를 다음과 같이
설정하십시오:
/*
* Optional mapped IO devices
*/
`define NRV_IO_LEDS // Mapped IO, LEDs D1,D2,D3,D4 (D5 is used to display errors)
//`define NRV_IO_UART // Mapped IO, virtual UART (USB)
`define NRV_IO_SSD1351 // Mapped IO, 128x128x64K OLed screen
//`define NRV_IO_MAX2719 // Mapped IO, 8x8 led matrix
//`define NRV_IO_SPI_FLASH // Mapped IO, SPI flash
//`define NRV_IO_SPI_SDCARD // Mapped IO, SPI SDCARD
//`define NRV_IO_BUTTONS // Mapped IO, buttons
테스트 프로그램을 컴파일해 봅시다:
$ cd FIRMWARE
$ ./make_firmware.sh EXAMPLES/test_OLED.c
$ cd ..
$ make ECP5_EVN
모든 것이 잘 진행되면 화면에 움직이는 컬러 패턴이 표시됩니다. 텍스트
모드 데모(hello.c와 sieve.c)도 여전히
동작하며, 이제는 화면에 텍스트를 표시합니다. 이 밖에도 가지고 놀 수 있는
프로그램이 있습니다:
(검은 대각선 줄무늬는 디스플레이
갱신 때문에 생긴 것이며, 평소에는 보이지 않습니다).
| 프로그램 | 설명 |
|---|---|
ASM_EXAMPLES/test_OLED.S |
움직이는 패턴을 표시합니다. |
ASM_EXAMPLES/mandelbrot_OLED.S |
망델브로 집합을 표시합니다. |
EXAMPLES/cube_OLED.c |
회전하는 3D 정육면체를 표시합니다. |
EXAMPLES/mandelbrot_OLED.c |
망델브로 집합을 표시합니다(C 버전). |
EXAMPLES/riscv_logo_OLED.c |
RISCV 로고를 사용한 로토줌입니다(90년대로 돌아가 봅시다). |
EXAMPLES/spirograph_OLED.c |
회전하는 사각형들입니다. |
EXAMPLES/test_OLED.c |
움직이는 패턴을 표시합니다(C 버전). |
EXAMPLES/demo_OLED.c |
그래픽 함수 데모입니다(왕년의 여러분, EGAVGA.bgi를 기억하십니까?). |
EXAMPLES/test_font_OLED.c |
폰트 렌더링을 테스트합니다. |
EXAMPLES/sysconfig.c |
femtosoc 및 femtorv 구성을 표시합니다. |
| 더 큰 프로그램(IceStick에는 들어가지 않는 프로그램) | |
EXAMPLES/imgui_xxxx.c |
ImGui challenge에서 가져온 몇 가지 포트입니다. |
EXAMPLES/mandelbrot_float_OLED.c |
망델브로 집합을 표시합니다(gcc의 소프트웨어 부동소수점을 사용하는 부동소수점 버전). |
EXAMPLES/tinyraytracer.c |
TinyRaytracer의 포트입니다. |
LIBFEMTORV32 라이브러리에는 기본적인 폰트 렌더링, 2D 다각형 클리핑, 2D 다각형 채우기 루틴이 포함되어 있습니다. 대부분의 프로그램은 가장 작은 구성(IceStick)에서 사용할 수 있는 6KB 메모리에 모두 들어갑니다! 더 큰 프로그램은 gcc 라이브러리에 소프트웨어로 구현된 부동소수점 연산을 사용합니다(언젠가는 femtorv32용 하드웨어 FPU가 나올지도 모릅니다...).