새 보드 지원을 추가하는 방법
1단계: 보드 데이터시트에서 정보 수집하기
먼저 보드의 데이터시트에서 다음 정보를 찾아야 합니다:
보드가 사용하는 FPGA:
- 제품군: ICE40 또는 ECP5
- ICE40 변형: hx1k, up5k, ...
- ECP5 변형: 25k, 85k, um5g-85k(85k의 고속 버전), ...
- 패키지(칩의 외형): 예를 들어 ICE40은 tq144(4면에 핀이 있는 SMC), ECP5는 CABGA381(볼 그리드 어레이 SMC), ...
보드가 사용하는 주파수(예: IceStick은 12MHz ...)
FPGA 핀 번호 (목록의 처음 두 항목부터 시작한 다음, 필요한 것을 장치 하나씩 차례로 추가하십시오):
- 클록용 핀 1개(필수)
- LED 5개용 핀 5개(선택 사항이지만, 가장 먼저 해 보고 싶은 것이 LED 깜빡이기일 것이므로 사실상 필수라고 하겠습니다)
- USB를 통한 시리얼 연결용 핀 2개(RXD와 TXD), 선택 사항이지만 곧 테스트에 필요해질 것입니다
- 그리고 보드에 연결하려는 장치(LED 매트릭스, OLED 디스플레이)용 핀이 필요하며, 이 핀들은 보드의 커넥터(PMOD 또는 기타)에 배선된 핀 중에서 선택할 수 있습니다
- SPI 플래시용 핀 4개(선택 사항): FPGA 보드에서는 FPGA 구성이 수 메가바이트 크기의 작은 플래시 메모리에 저장되는 경우가 많습니다. FPGA 구성은 수십 킬로바이트 정도만 차지하므로, 데이터나 프로그램을 저장할 공간이 남습니다. SPI 플래시는 다리가 8개인 작은 SMC이며, 직렬 프로토콜(SPI의 일종)을 통해 통신할 수 있습니다. 데이터시트에서 핀 4개(클록, master-in-slave-out, master-out-slave-in, 칩 선택)를 찾아야 합니다
- SD 카드용 핀 4개(선택 사항): 일부 FPGA 보드에는 SD 카드 슬롯이 있습니다. PMOD를 추가하는 것도 가능합니다. SD 카드도 SPI 플래시에 사용되는 것과 상당히 비슷한 SPI 직렬 프로토콜의 일종을 사용합니다.
2단계: 제약 파일 작성하기
다음으로 제약 파일에 FPGA 핀 번호를 지정해야 합니다. ICE40의 제약
파일은 .pcf 확장자를 사용하고, ECP5의 제약 파일은
.lpf 확장자를 사용합니다(문법도 다릅니다!). 제약 파일은
BOARDS 하위 디렉터리에 있습니다. 사용하는 보드와 같은 FPGA
제품군의 제약 파일에서 시작하여 핀 번호를 수정하십시오.
3단계: PLL
PLL은 보드의 클록을 다른 주파수로 변환하는 FPGA 내부의 특수
블록입니다. Femtorv32는 RTL/PLL/femtopll.v에 있는 래퍼 모듈
femtopll을 사용하며, 이 모듈은
RTL/PLL/pll_xxx.v에 있는 보드별 구현으로 연결됩니다.
가장 먼저 할 수 있는 일은 RTL/femtosoc_config.v에
PASSTHROUGH_PLL을 정의해서 보드의 고유 주파수로 시작하는
것입니다. 이렇게 하면 RTL/femtosoc.v에서 보드의 클록
pclk가 프로세서 클록 clk에 직접 연결됩니다.
또한 NRV_FREQ를 보드의 주파수로 정의해야 합니다(115200
보(baud)로 시리얼 통신을 하는 데 쓰이는 UART가 이 값에 의존합니다).
보드의 클록이 너무 빠르다면 카운터를 사용해 분주할 수 있습니다.
이것이 동작하면, 그다음에는 주파수를 세밀하게 조정할 수 있는 실제
PLL을 대신 쓰고 싶어질 것입니다. 여러분의 보드와 가장 비슷한 것을
복사하는 것부터 시작하십시오. 매직 값을 찾을 때 쓸 수 있는 유틸리티가
(다행히도!) 몇 가지 있습니다. ICE40에서는
icepll -i inputfreq -o outputfreq를 사용하고, ECP5에서는
ecpll -i inoutfreq -o outputfreq -f tmp.v를 사용하십시오.
더 좋은 방법도 있습니다. 이 작업을 자동으로 해 주는 스크립트를 제가
만들어 두었습니다.
$ cd RTL/PLL
$ ./gen_pll.sh FPGA_type board_freq > pll_boardname.pll
여기서 FPGA_type은 ICE40 또는
ECP5이고, board_freq는 보드의 고유
주파수입니다. 이 스크립트가 모든 매직 값을 생성해 줍니다! 그런 다음
femtopll.v를 편집해서 새 파일을 포함하는 구문을 추가해야
합니다.
ICE-40 관련 참고 사항: 생성된 파일을 편집해서
SB_PLL40_CORE를 SB_PLL40_PAD로,
.REFERENCECLK를 .PACKAGEPIN으로 바꿔야 할 수도
있습니다. 이에 대한 자세한 설명은 여기에서
볼 수 있습니다.
4단계:
RTL/femtosoc_config.v
파일 끝에 여러분의 보드에 맞게 ICE40 또는 ECP5를 정의하는 규칙을 추가하십시오.
5단계: Makefile
여러분의 보드에 맞는 yosys 및 nextpnr 옵션과 BOARD,
BOARD.synth, BOARD.prog 타깃을 담은 새
BOARDS/board.mk를 만들어야 합니다. 여러분의 보드와 가장
비슷한 것을 복사한 다음 거기에 맞게 수정하는 것부터 시작하십시오.
6단계: 커뮤니티
트위터에서 여러분의 이야기를 들려주십시오! PR도 환영합니다!