ULX3SでLiteX
https://gyazo.com/3214e4f22714e62f3032cc24777d29da
LiteXとは?
FPGA上でSoCを構築するためのフレームワーク。CPU、メモリ、ペリフェラルを自由に組み合わせてSoCを構築することができる。
LiteXをインストール
LiteX
code:sh
$ cd ~/src
$ mkdir litex
$ cd litex
$ python3 -m venv litex_env
$ source litex_env/bin/activate
$ chmod +x litex_setup.py
$ ./litex_setup.py --init --install --config=standard
Pythonの仮想環境外で pip install を行うと error: externally-managed-environment エラーが出るようになったため、python3 -m venv litex_env で仮想環境を作成、source litex_env/bin/activate で仮想環境に入る必要がある。
Pythonの仮想環境への入り方
code:sh
$ cd ~/src/litex
$ source litex_env/bin/activate
RISC-Vツールチェインのインストール
bios等のビルド用にRISC-Vツールチェインをインストール(が、今回はすでに手元にあるのでスキップ)
code:sh
$ pip3 install meson ninja
$ ./litex_setup.py --gcc=riscv
ターゲットボードに合わせたSoCをビルド
ターゲットボード(ULX3S)に向けたSoCをビルドする。今回は以下のオプションを設定してビルドを行う。
ボード: ULX3S
-m litex_boards.targets.radiona_ulx3s
FPGAチップ:Lattice ECP5 LFE5U-85F (84K LUT)
--device LFE5U-85F
SDRAM:MT48LC16M16(ULX3Sのリビジョンによって異なるらしい)
--sdram-module MT48LC16M16
有機ELディスプレイ(OLED)
--with-oled
手元にある SSD1331 が動くらしい
code:sh
$ cd litex-boards/
$ python3 -m litex_boards.targets.radiona_ulx3s --device LFE5U-85F --sdram-module MT48LC16M16 --with-oled --build --load
以下のコマンドを叩くとビットストリームがロードされて、LEDがピコピコし出す。
code:sh
python3 -m litex_boards.targets.radiona_ulx3s --load
一度ビルドしたら、上記のコマンドでビットストリームのロードのみ実行することもできる
ビットストリームにロードには、fujprog を直接使っても良い
code:sh
# SRAMへロード
fujprog build/radiona_ulx3s/gateware/radiona_ulx3s.bit
# FLASHへロード ()
fujprog -j FLASH build/radiona_ulx3s/gateware/radiona_ulx3s.bit
LiteXのBIOSプロンプトを表示
LiteXのBIOSプロンプトを表示するためには、シリアルコンソールでULX3Sへ接続する必要がある。シリアルコンソールには screen コマンドを利用する。ボーレートは115200に、接続先のデバイスは自分の環境に合わせていい感じに。
code:sh
screen /dev/cu.usbserial-D00084 115200
screen で接続したら、ULX3Sのb1ボタンを押すとLiteX BIOSのプロンプトが表示される(リセットされるから?)
また、プロンプトから抜けるには Ctrl-a k でscreenを終了させればOK
https://gyazo.com/7381d20ca99dd669a315d4e45c973333
Litexでベアメタルプログラミング
litex/litex/soc/software/demo にあるデモプログラムをビルドする。手順が無駄に複雑なのでなんとかしたい...
code:sh
$ cd ~/src/litex/litex-boards/
$ python3 -m litex_boards.targets.radiona_ulx3s --device LFE5U-85F --sdram-module MT48LC16M16 --with-oled --build --load
$ python3 ../litex/litex/soc/software/demo/demo.py --build-path build/radiona_ulx3s/
ビルドしたバイナリをBIOSへ送り込むためのサーバを起動する。--kernel=demo.bin でULX3Sへ書き込みたいバイナリを指定する。
code:sh
$ ../litex/litex/tools/litex_term.py /dev/cu.usbserial-D00084 --kernel=demo.bin --speed 115200
サーバが起動後、ULX3S実機のB1ボタンを押すと指定したバイナリがULX3Sへ書き込まれ、デモアプリが起動する。
https://gyazo.com/9824cd351c7e3f88ce10a60abd39475a
LiteXのビルドオプション
https://gyazo.com/8e532080d76a61f858e835bef70d05b7
--device, default=LFE5U-45F, help=FPGA device (LFE5U-12F, LFE5U-25F, LFE5U-45F or LFE5U-85F).
載せてるFGPAのチップ
うちのは --device LFE5U-85F
--sdram-module, default=MT48LC16M16, help=SDRAM module (MT48LC16M16, AS4C32M16 or AS4C16M16).
SDRAMのチップ
うちのは --sdram-module MT48LC16M16
--with-spi-flash, action=store_true, help=Enable SPI Flash (MMAPed).
--with-oled, action=store_true, help=Enable SDD1331 OLED support.
うちのULX3Sに載せてるOLEDは SSD1331 なので、使えるっぽい
--sdram-rate, default=1:1, help=SDRAM Rate (1:1 Full Rate or 1:2 Half Rate).
SDCARD
--with-spi-sdcard, action=store_true, help=Enable SPI-mode SDCard support.
--with-sdcard, action=store_true, help=Enable SDCard support.
(sdcardが動かない時はspi-sdcardを使うと良いかも)
VIDEO
--with-video-terminal, action=store_true, help=Enable Video Terminal (HDMI).
--with-video-framebuffer, action=store_true, help=Enable Video Framebuffer (HDMI).
メモ
code:bios_output
litex> mem_list
Available memory regions:
ROM 0x00000000 0x20000
SRAM 0x10000000 0x2000
MAIN_RAM 0x40000000 0x2000000
CSR 0xf0000000 0x10000
やりたいこと
biosをflushに書き込みたい
LEDに対応するメモリマップトアドレスを知りたい
参考
LiteXではじめる自作SoC(3) Linuxの動くSoCを自作する