はじめに
1500円 ZYNQ 基板( EBAZ4205 )で、起動後に PS(ARM)から PL(FPGA) を再ダウンロードする方法を解説します。
EBAZ4205 以外の ZYNQ 基板でも、同じ方法で書き換えができます。
PetaLinux が動いているまま、LAN 経由で FPGA を書き換えることができるので、周辺回路の接続を変更せずに済み、便利に開発ができます。
なぜ、再ダウンロードか
ZYNQ がブートするとき、FSBL が ブートイメージに含まれる FPGA のダウンロードを実施しています。
FPGA に新しい回路を追加するとき、microSD や NAND フラッシュのブートイメージごと更新するのは面倒です。
FPGA だけを更新できれば、すぐに動作を調べることができます。
デバイスツリーが変わらない事が前提ですが、何度でも再ダウンロードして試すことができます。
__PYNQ__と似ていますが、プログラムも PetaLinux 上で gcc でコンパイルできますので、より組み込み志向な開発ができます。
※デバイスツリーごと上書きする方法もあるようですが、試していません
使用環境
- Windows10 Pro (20H2)
- EBAZ4205 (自作 PetaLinux 2020.1 ブートイメージで起動)
- TeraTerm
PetaLinux ブートイメージは、以前の記事 1500円ZYNQ基板でNANDブートの実現 で作成したものを使います。
参考資料
Solution Zynq PL Programming With FPGA Manager
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841645/Solution+Zynq+PL+Programming+With+FPGA+Manager
FPGAをLinuxからコンフィグするxdevcfgの使い方 - なひたふさん
http://nahitafu.cocolog-nifty.com/nahitafu/2018/01/devxdevcfg-accc.html
※以前の PetaLinux で PS → PL ダウンロードに利用できた、
cat system.bit.bin > /dev/xdevcfg
は廃止されてしまったようで、動きませんでした。
現在は fpga_manager を使う事になっているようです。
作業の流れ
- Vivado が出力した bit ファイルを、PS ダウンロード用にバイトスワップします。
- 変換したファイルを、SCP で PetaLinux へ転送します。
- PetaLinux で、fpga_manager からダウンロードします。
- C 言語ソースも転送してコンパイルできます。
実際の作業
1. FPGA ダウンロードデータの準備
PS から PL へのダウンロードには、.bit をバイトスワップした専用の FPGA データが必要です。
Vivado で作成された .bit ファイルを、Vivado ツールの Bootgen で変換します。
ここでは、参考資料にある なひたふ さんのページで公開されている、
bit2bin.bat
を使用させていただきました。
私の環境では、Vivado のインストール先は、C:\Xilinx2020.1\Vivado\2020.1
です。
これに合わせて、参照先を変更しています。
@if "%1"=="" goto ERR
@echo all:{%1} > all.bif
C:\Xilinx2020.1\Vivado\2020.1\bin\bootgen.bat -image all.bif -w -process_bitstream bin
move %1.bin %~dp0
pause -1
exit /b
:ERR
@echo "ビットストリームファイル名が必要です"
@echo "Usage: bit2bin.bat <bit_file_name>"
pause -1
bit2bin.bat と、Vivado が出力した .bit ファイル(今回は system.bit )を同じフォルダにコピーしておきます。
bit2bin.bat のアイコンの上に system.bit ファイルをドロップします。
変換情報 all.bif と、変換された FPGA ダウンロードファイル system.bit.bin が作成されました。
2. EBAZ4205 の PetaLinux へ転送
通常、EBAZ4205 のコンソール操作用には UART で接続した TeraTerm を利用しています。
ファイル転送には、LAN から ssh 接続して、scp でファイルを送り込みます。
UART の TeraTerm で、ifconfig して割り当てられた IP アドレスを調べます。
File - New Connection で EBAZ4205 の IP アドレスを指定して ssh 接続します。
File - SSH SCP...
を選択して、ファイル転送を始めます。
転送したい FPGA ダウンロードファイルをドロップして、Send ボタンを押します。
EBAZ4205 のカレントのディレクトリに転送されています。
3. PS からダウンロード
EBAZ4205 で、下記の通りにコマンドを実行します。
必ず、/lib/firmware というフォルダを作成してダウンロードファイルをコピーして、ダウンロードする必要があります。
echo 0 > /sys/class/fpga_manager/fpga0/flags : フラグを設定する
mkdir -p /lib/firmware : ダウンロード専用のフォルダを作成
cp system.bit.bin /lib/firmware/ : ダウンロード専用フォルダに、.bit をコピー
echo system.bit.bin > /sys/class/fpga_manager/fpga0/firmware : ダウンロード実行
ダウンロードは、一瞬で終わります。
EBAZ4205 では、PL の EMIO を経由して LAN の PHY を接続しているため、ダウンロード中は LAN のリンクが切れます。
リンクが復活した後、DHCP で IP アドレスが再割り当てされ、TeraTerm の ssh 接続が復活します。
IP アドレスが再割り当てで変わってしまうと、ssh 接続は復活しません。
#ダウンロードする FPGA は、PHY 接続部がブート時の FPGA と同じになっている必要があります。
EBAZ4205 のブート FPGA に、ユーザー回路を追加して作成した FPGA を上書きダウンロードすれば、リンクが復活します。
4. C 言語ソースのコンパイル
scp でソースを送り込んで、コンパイルすることもできます。
# include <stdio.h>
int main()
{
printf("Hello World!\n");
}
まとめ
EBAZ4205 で、LAN 経由で FPGA の再コンフィグレーションが実現できました。
専用ダウンロードケーブルが無くてもよく、またリモートで FPGA の開発ができます。