1500円ZYNQ基板でPSからPL(FPGA)へ再ダウンロードする方法

#はじめに
1500円 ZYNQ 基板( EBAZ4205 )で、起動後に PS(ARM)から PL(FPGA) を再ダウンロードする方法を解説します。

EBAZ4205 以外の ZYNQ 基板でも、同じ方法で書き換えができます。

PetaLinux が動いているまま、LAN 経由で FPGA を書き換えることができるので、周辺回路の接続を変更せずに済み、便利に開発ができます。


#なぜ、再ダウンロードか
ZYNQ がブートするとき、FSBL が ブートイメージに含まれる FPGA のダウンロードを実施しています。

FPGA に新しい回路を追加するとき、microSD や NAND フラッシュのブートイメージごと更新するのは面倒です。

FPGA だけを更新できれば、すぐに動作を調べることができます。

デバイスツリーが変わらない事が前提ですが、何度でも再ダウンロードして試すことができます。

__PYNQ__と似ていますが、プログラムも PetaLinux 上で gcc でコンパイルできますので、より組み込み志向な開発ができます。

※デバイスツリーごと上書きする方法もあるようですが、試していません



#使用環境

1. Windows10 Pro (20H2)
2. EBAZ4205 (自作 PetaLinux 2020.1 ブートイメージで起動)
3. TeraTerm

PetaLinux ブートイメージは、以前の記事 [1500円ZYNQ基板でNANDブートの実現](https://qiita.com/kan573/items/bc3234e4ee2b559cb3cf) で作成したものを使います。

#参考資料
__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 を使う事になっているようです。


#作業の流れ
1. Vivado が出力した bit ファイルを、PS ダウンロード用にバイトスワップします。
2. 変換したファイルを、SCP で PetaLinux へ転送します。
3. PetaLinux で、fpga_manager からダウンロードします。
4. C 言語ソースも転送してコンパイルできます。

# 実際の作業

##1. FPGA ダウンロードデータの準備
PS から PL へのダウンロードには、.bit をバイトスワップした専用の FPGA データが必要です。
Vivado で作成された .bit ファイルを、Vivado ツールの Bootgen で変換します。

ここでは、参考資料にある [__なひたふ__ さんのページ](http://nahitafu.cocolog-nifty.com/nahitafu/2018/01/devxdevcfg-accc.html)で公開されている、
__bit2bin.bat__
を使用させていただきました。

私の環境では、Vivado のインストール先は、__C:\Xilinx2020.1\Vivado\2020.1__
です。
これに合わせて、参照先を変更しています。

```bit2bin.bat
@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__ )を同じフォルダにコピーしておきます。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/b62a5849-e067-99a0-c6f2-f028cc040d6b.png)


__bit2bin.bat__ のアイコンの上に __system.bit__ ファイルをドロップします。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/c1182000-a3a7-94fb-cecb-eb1bc134ee28.png)

変換情報 all.bif と、変換された FPGA ダウンロードファイル __system.bit.bin__ が作成されました。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/7e42a398-b0db-f9d9-2552-b41d658e948e.png)


##2. EBAZ4205 の PetaLinux へ転送
通常、EBAZ4205 のコンソール操作用には UART で接続した TeraTerm を利用しています。
ファイル転送には、LAN から ssh 接続して、scp でファイルを送り込みます。

UART の TeraTerm で、ifconfig して割り当てられた IP アドレスを調べます。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/b29960cf-7a76-26eb-a411-efebd5328f6f.png)



File - New Connection で EBAZ4205 の IP アドレスを指定して ssh 接続します。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/8a8d81bb-3ab4-c1c1-29f5-c45bc3a242b0.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/d805e39c-5428-1989-731c-62169a93e2ed.png)


root/root でログインできます。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/6bd8b925-956b-fd30-48c4-929b35c23b59.png)


File - SSH SCP...
を選択して、ファイル転送を始めます。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/2d8217aa-a536-811d-b4a3-55eb821de48b.png)


転送したい FPGA ダウンロードファイルをドロップして、Send ボタンを押します。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/f3e9c6ed-f1fe-30ce-966b-69f7946072e6.png)
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/a6ace7ce-61fc-91d3-358b-0bdbb63f4db9.png)


EBAZ4205 のカレントのディレクトリに転送されています。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/456163de-2a92-fb09-eaf2-0e6c70247d40.png)


##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 　　: ダウンロード実行

ダウンロードは、一瞬で終わります。

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/aa126d71-d1b5-a645-82ca-edcae68a4078.png)


EBAZ4205 では、PL の EMIO を経由して LAN の PHY を接続しているため、ダウンロード中は LAN のリンクが切れます。
リンクが復活した後、DHCP で IP アドレスが再割り当てされ、TeraTerm の ssh 接続が復活します。

IP アドレスが再割り当てで変わってしまうと、ssh 接続は復活しません。

＃ダウンロードする FPGA は、PHY 接続部がブート時の FPGA と同じになっている必要があります。
　EBAZ4205 のブート FPGA に、ユーザー回路を追加して作成した FPGA を上書きダウンロードすれば、リンクが復活します。


##4. C 言語ソースのコンパイル
scp でソースを送り込んで、コンパイルすることもできます。

```hello_world.c
#include <stdio.h>

int main()
{
  printf("Hello World!\n");
}
```

scp で転送して、gcc でコンパイルして、実行します。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/0c95c3ab-ed31-934a-01d8-b4bd3f9b20f3.png)


#まとめ
EBAZ4205 で、LAN 経由で FPGA の再コンフィグレーションが実現できました。
専用ダウンロードケーブルが無くてもよく、またリモートで FPGA の開発ができます。