FOMU 튜토리얼 (작성 중)
오픈 소스 FPGA 개발 툴체인 설치
시작하기 전에 오픈 소스 FPGA 개발 툴체인(Yosys, NextPNR 등)을 설치해야 합니다. 설치 방법은 여기에 나와 있습니다.
간단한 FOMU 디자인 테스트하기 (선택 사항)
$ cd learn-fpga/Basic/FOMU/FOMU_blink
$ ./makeit.sh
비트스트림을 다운로드하는 동안 FOMU가 파란색으로 은은하게 빛나다가, 이후 여러 가지 색으로 깜박여야 합니다. FOMU에는 무언가를 출력할 LED가 하나뿐이지만, 그 LED는 컬러입니다!
femtosoc와 femtorv32 구성하기
이제 learn-fpga/FemtoRV/RTL/femtosoc_config.v를 편집할
차례입니다. 이 파일에서는 만들 RISC-V 프로세서의 종류와, 함께 구성되는
시스템 온 칩에 포함할 장치 드라이버를 정의할 수 있습니다. 지금은 (시각적
디버깅을 위해) LED를 활성화합니다. 지금은 6144바이트의 RAM을
사용합니다.
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_MAX7219 // 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 16 // Frequency in 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
펌웨어 컴파일하기
다음과 같이 RISC-V 블링키를 컴파일합니다.
$ cd FIRMWARE
$ ./make_firmware.sh ASM_EXAMPLES/blinker_loop.S
$ cd ..
합성하여 장치로 전송하기
$ make FOMU
3단계와 거의 같은 블링키를 얻으려고 꽤 복잡한 길을 돌아왔지만, 이 블링키는 훨씬 더 멋집니다. 어셈블리로 작성되어 BRAM에 저장되고, RISC-V 코어가 실행하기 때문입니다!
다음에 다룰 내용 ...
아직 이해하지 못한 점들이 있습니다. 24MHz에서는 16MHz에서보다 더 느리게 깜박이고, 20MHz에서는 멈춰 버립니다. 이해가 필요합니다.
이제 UART를 활성화하는 것이 자연스러운 순서일 것입니다. 하지만
FOMU에는 USB 시리얼을 구현하는 FTDI 칩이 없습니다. 따라서 여기서부터는
스스로 해결해야 하며, USB 스택용 게이트웨어를 직접 구현해야 합니다.
불가능한 일은 아닙니다. 여기에
UART-over-USB를 갖춘 J1 프로세서 구현이 있습니다. 규모가 꽤 커서, 무려
Verilog
파일 17개!로 이루어져 있습니다. 누군가 이를 연결해 보고 싶다면,
RTL/DEVICES/USB에 넣고 동작하게 되면 PR을 보내
주십시오.
FOMU로 할 수 있는 일은 훨씬 더 많습니다. 더 많은 기능을 넣을 여유
공간이 충분하고, 하드웨어 곱셈기(DSP 블록)가 있으며, RV32IM도 아무런
수정 없이 동작합니다(RTL/femtosoc_config.v에서
활성화하십시오). 특수한 SB_SPRAM256KA 블록을 사용하면
활용할 수 있는 RAM(단일 포트 RAM)도 넉넉합니다. 여기를
참고하십시오.
8x8 LED 매트릭스도 연결해 보고 싶습니다. 이를 위해서는 패드에 전선 3개를 납땜하고, 반대쪽에 전선 2개(gnd와 vcc)를 추가로 납땜해야 합니다.
다음 편에 계속됩니다