1500円ZYNQ基板でPetaLinuxを動作させるハードウェア情報(.xsa)の作成

#はじめに
1500円 ZYNQ 基板(EBAZ4205)で、PetaLinux を動作させるための FPGA デザインを作成します。

Vivado で、 PS の設定と必要最小限の PL 構築を行い、エクスポートして PetaLinux で使えるようにします。

PL にオリジナル回路を追加する雛形としても、使用することができます。

#使用環境

1. Windows10 Pro (20H2)
2. Vivado 2020.1 (WebPack ライセンス、現在最新の 2020.2 もたぶん同手順)

#参考資料
KeitetsuWorks さんの ebaz4205 リポジトリ

https://github.com/KeitetsuWorks/EBAZ4205


---
ZYNQ-PS の設定については、以前の記事も参考になるかと思います。
[1500円ZYNQ基板でFPGAプログラミング大全Xilinx編(第2版)の実習 5-2 Zynqシステムのハードウェア構築](https://qiita.com/kan573/items/3c1ca1c4cd7ff94da38c)


#ブロックデザインの雛形
KeitetsuWorks さんが公開されているデザインの tcl スクリプトを利用させていただきました。
https://github.com/KeitetsuWorks/EBAZ4205/

そのままだと、.xdc が絶対パスで記載されていて、指定フォルダーにファイルが無いとエラーで止まってしまうようです。

テキストエディタで .xdc 関連部分を削除して、開くことができました。
Vivado のバージョンも、少し違いますが、大丈夫なようです。
少しアレンジして、ブロックデザインを再作成しました。
(下に __ebaz4205.tcl__ へのリンクがあります)

制約ファイル(__ebaz4205.xdc__)は、KeitetsuWorks さんの物をそのまま使わせていただきます。
https://github.com/KeitetsuWorks/EBAZ4205/tree/master/vivado/export/ebaz4205/ebaz4205.srcs/constrs_1/new


#tcl スクリプトでブロックデザインを作成
単体で開けるように、再出力した tcl スクリプト(__ebaz4205.tcl__)を用意しました。

[ebaz4205.tcl](https://drive.google.com/file/d/1zjrMulC-2rEJ2K_UsCPuebasBrtFZS6-/view?usp=sharing)

オリジナルからいくつか変更点があります。
これを使用して、ブロックデザインを作成します。

##1. Vivado で tcl スクリプトの読み込み
デスクトップに仮フォルダを作成して、__ebaz4205.tcl__ と __ebaz4205.xdc__ をコピーしておきます。
フォルダ名は、短い名前で ebaz としておきます。

Vivado を起動したら、プロジェクトは開かずに、画面下部の Tcl Console にある Type a Tcl command here にコマンドを打ち込んで使用します。
![0_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/a2b6039f-fd69-ad93-9344-0f35fd8677a7.png)

> pwd

で、カレントディレクトリが表示されますので、作成した ebaz フォルダへ移動します。
ここでは、￥ ではなく / でパスを指定する必要があります。

>cd c:/user/(ユーザー名)/desktop/ebaz/

![0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/6eef564c-51b3-960a-0a56-509563c04805.png)


ebaz フォルダに移動できたら、tcl スクリプトを読み込みます。

>source ebaz4205.tcl

自動的にブロックデザインが作成され、プロジェクトが出来上がります。
![0_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/5dc5cf73-cf6e-4b24-65f5-b68d16c6f7ed.png)


##2. ZYNQ-PS の設定内容

PS の設定内容とブロックデザインについて、いくつか変更している部分がありますので、解説します。
とりあえず動けば良い、という方は読み飛ばして[ブロックデザインの変更点](https://qiita.com/drafts#2-5-%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE%E5%A4%89%E6%9B%B4%E7%82%B9)へ進んでください。

###2-1. MIO / EMIO ピンの設定
NAND、Ethernet0+MDIO(⇒EMIO)、SD0、SPI0(⇒EMIO)、SPI1、UART1、I2C0、I2C1(⇒EMIO)、CAN0(⇒EMIO)、CAN1(⇒EMIO)、TTC0(⇒EMIO)

TTC0 は、PetaLinux で TTC が一つ必須と UG1144 に書いてあるのですが、MIO に出すのか EMIO に出すのか、よくわかりません。
中華リソースで EMIO に出している図があったので、それに倣って EMIO に出して、外部ピンは接続しないままにしてあります。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/a4aa443a-ec17-6d3a-b8f9-3911a795e7e7.png)

###2-2. クロック設定
ENET0 : 100 Mbps
FCLK_CLK0 : 50 MHz (アプリケーションに合わせて 100 MHz などにしてもよい)
FCLK_CLK3 : 25 MHz (Ether PHY への供給用)
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/9c086867-6293-b2f8-5dcc-2d97be373f4b.png)

###2-3. DDR 設定
MT41K128M16JT-125
16 bit
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/fd99d3ab-04c1-da7e-4f1c-15db7864068b.png)


###2-4. NAND 設定
(2021.4.25 追記)
NAND メモリのパラメータですが、FSBL が NAND の初期化に失敗する現象があり、調べたところ特定の値に設定しないと動作しないという結論になりました。

https://forums.xilinx.com/t5/Processor-System-Design-and-AXI/Zynq-NAND-Baremetal-Initialization-Fails/td-p/423833

に書かれてある通り、UG585 で BootROM の設定として記載されている分周数

>t_rc  = 5
>t_wc  = 5
>t_rea = 2
>t_wp  = 3
>t_clr = 1
>t_ar  = 2
>t_rr  = 2

にすることで、FSBL から認識されるようになります。
(U-boot/PetaLinux からの認識は、前の値でも変わらない)

最終的な NAND 設定値は、下記になります。
![5_NAND_TIMING_UG585.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/b9573db0-2102-8261-5682-cfeda6544803.png)


~~NAND メモリのサイクルパラメータを、W29N01HV のデータシートから拾います。~~
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/73815754-0b6c-3ff9-96b5-b11c5cea2709.png)


~~全て、データシート規定値よりも少し大きい値にします。
(T_REA は最大値が規定されていますが、Read Enable# がアクティブになってからデータバスに値が出てくるまでにかかる時間の最大値ですので、それよりも大きい値にするのが正しいです ⇐ 修正 2021.4.25)~~

~~それぞれ適当な値を、７つのパラメータに対して設定しました。~~
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/4b7880c8-f8d0-e631-9347-71627b0ff9ff.png)


###2-5. ブロックデザインの変更点
KeitetsuWorks さんのデザインだと、RJ45 横の LED がデフォルト点灯だったため、Utility Vector Logic でインバータを追加してデフォルト消灯にしました。
(PS から GPIO 操作で、点灯・消灯が制御できます)

それ以外は、そのままにしてあります。


#ハードウェアのエクスポートまで

Constraints に制約ファイル(ebaz4205.xdc)を追加します。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/91ae17ee-a49c-3966-17fd-6bd768ef0eec.png)


Create HDL Wrapper でトップモジュールを作成します。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/b656a752-1c43-8191-d9d0-b703bb0a84f9.png)


Generate Bitstream で、ビルドします。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/76fa25ac-041b-ea16-d039-60127dd26636.png)

File - Export - Export Hardware で、ハードウェア情報(ebaz4205_wrapper.xsa)をエクスポートします。
Fixed - Include bitstream の設定で OK です。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/7daf66cf-182b-ef47-71ba-8880a7f5aabd.png)


出力された ebaz4205_wrapper.xsa を使って、PetaLinux ブートイメージをビルドします。

⇒前回の投稿 [1500円ZYNQ基板でPetaLinuxを動作させる(後編:PetaLinux ビルドと EBAZ4205 での動作)](https://qiita.com/kan573/items/98f364eec46cb3842d79)
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/7232d325-7b51-5965-3503-fd44cc148f3e.png)


#実際にエクスポートしたサンプル

エクスポートしたハードウェア情報
[ebaz4205_wrapper.xsa](https://drive.google.com/file/d/1e0OfOAcd2wyCLCnepdqKCaoaNiCeQ87G/view?usp=sharing)


#まとめ
EBAZ4205 で PetaLinux 動作のための FPGA デザインを構築して、ハードウェア情報(.xsa)をエクスポートすることができました。