1500円ZYNQ基板でFPGAプログラミング大全Xilinx編(第2版)の実習 (高位合成) 11-1 パターン / 11-2 ビットブロック 描画回路の実機確認

#はじめに
1500円 ZYNQ 基板(EBAZ4205)を使い、前回までの投稿と組み合わせて、
FPGAプログラミング大全Xilinx編(第2版)の

11-1「パターン描画回路」
11-2「ビットブロック描画回路」

の動作確認を行います。


#プロジェクトの概要

前回の投稿
[11-1 パターン描画回路 / 11-2 ビットブロック描画回路](https://qiita.com/kan573/items/5b14e8ebefa0828eb93f)
で、高位合成を使って描画回路の IP を 2 つ作成しました。

これを、前々回の投稿 [グラフィック表示回路](https://qiita.com/kan573/items/d9bf6396f5f39f4cf098) に組み込んで、回路を完成させます。
この回路を使って、PS のプログラムで描画を行い、HDMI から画面出力します。

EBAZ4205 からの HDMI 出力には、
[1500円ZYNQ基板でFPGAプログラミング大全Xilinx編(第2版)の実習 2-3 HDMIでパターン表示](https://qiita.com/kan573/items/44ced51037d221a4d171#hdmi-%E5%87%BA%E5%8A%9B%E3%81%AE%E6%8E%A5%E7%B6%9A%E5%9B%B3)
で作成した HDMI 出力ケーブルを使用します。
![16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/856cc47c-681e-1371-1c5d-3e5727172238.jpeg)


#プロジェクトの準備
前々回に作成したプロジェクト display に、patblt と bitblt を合体させます。

グラフィック表示回路 display の Vivado プロジェクトを、デスクトップに用意しておきます。

\Desktop\display : グラフィック表示回路のプロジェクトのフォルダ
\Desktop\COMMON  : 回路で使用される HDMI/VGA 出力回路の IP

前回作成した IP のフォルダも、デスクトップに用意しておきます。

\Desktop\patblt_ip : パターン描画回路の IP
\Desktop\bitblt_ip : ビットブロック描画回路の IP

##Vitis HLS 2020.1 のバグ対策
Vitis で作成・出力した IP には、Makefile に問題があるとのことですので、その対応を行います。

p.478 の囲み記事「API の Makefile にバグ？」
を参照して、2つの IP のフォルダに含まれている Makefile に、テキストエディタで変更を行います。

それぞれ、
\Desktop\???blt_ip\patblt\solution1\impl\ip\drivers\???blt_v1_0\src
にある Makefile について、18行目の

> OUTS = \*.o

を、

> OUTS = \$(addsuffix .o, \$(basename \$(wildcard \*.c)))

 に変更します。

2 つの IP の Makefile を変更したら、次に移ります。

#display プロジェクトへの合体

まず、Vivado で display プロジェクトを開きます。

##各 IP の IP カタログへの登録
PROJECT MANAGER の下の Settings をクリック。
IP - Repository を開いて、追加の 2 つの IP を登録します。
(bitblt_ip, patblt_ip)

IP が 4 つとも黒字で正しく登録できていれば、OK を押して閉じます。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/e75121da-a1c9-4430-1346-cd4e118f602c.png)

##流用デザインに IP を追加
Sources ペインの design_1_i をダブルクリックして、Diagram を開きます

Add IP (+ ボタン) から、Bitblt と Patblt を配置します。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/84f762ca-4a10-e1e3-3728-cd4caafc7490.png)
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/a27a5f0f-77f1-73fc-7e46-a9ec015cb7bd.png)

Run Connection Automation をクリックして、bitblt_0 と patblt_0 にチェックして、OK を押します。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/8c8c500d-05c7-f42c-5107-906e0d271971.png)

axi バスが自動接続され、ダイアグラムが完成します。
Regenerate Layout すると、こうなりました。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/c1c7e4fc-7f74-7ca3-a349-210f266249d9.png)

Validate Design して、問題なければ完成です。

##コンパイルとエクスポート
Generate Bitstream でコンパイルします。

問題なくコンパイルが完了したら、Include bitstream でエクスポートします。
File → Export → Export Hardware → Platform type = Fixed で Next → Include bitstream で Next →
 XSA file name: display_pat_bit
 Export to: \desktop\display_pat_bit.vitis
で Next → Finish

display.xsa が作成され、エクスポートが完了しました。
この回路のリソース使用率はこのぐらいでした。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/0aca69ae-5e75-d333-c58a-badc807fdba5.png)

#動作確認
Tools - Launch Vitis IDE で、Vitis を起動します。

Create Platform Project で、プラットフォームプロジェクトを作成します。
Project name: display_pat_bit
Location: \Desktop\display_pat_bit.vitis

Create from hardware specification (XSA) で Next したら、display_pat_bit.xsa を指定すると、プロットフォームプロジェクトが作成されます。
作成されたプラットフォームプロジェクトは、例によって Out-of-date ですので、Build Project して解消します。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/99cf1f94-19e8-cbb9-1cb2-db14802fab46.png)

次にアプリケーションプロジェクトを作成します。
File - New - Application Project... でウィザードを開いたら、
Applicaion Project name は disp_pat_bit_test とし、Empty Application で作成します。

アプリケーションプロジェクトの src フォルダに、大全のサポートファイルのフォルダ
\Zybo_Z7-10\dai11sho\display_pat_bit\VITIS
から、pat_bit_test.c を登録します。

前々回のグラフィック表示回路、[グラフィック表示回路-1.テストプログラムの変更](https://qiita.com/kan573/items/d9bf6396f5f39f4cf098#1-%E3%83%86%E3%82%B9%E3%83%88%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E5%A4%89%E6%9B%B4)
で説明した通り、フレームバッファのアドレスの変更が必要です。

L24, L25 にアドレス指定がありますので、

>\#define VRAM 0x10000000     /\* page 0 \*/
>\#define TEX  0x1012c000     /\* page 1 \*/

を、

>\#define VRAM 0x08000000     /\* page 0 \*/
>\#define TEX  0x0812c000     /\* page 1 \*/

に変更しておきます。


##プログラムの実行(disp_test.c)
・アプリケーションプロジェクトを Build Project します。
・Debug Configurations を作成して、デバッグを開始します。
・disp_test.c のブレークポイント指定3箇所にブレークポイントを設定してから、Resume ボタンを押していきます。
(disp_test.c の行番号表示の左横の網部分をダブルクリックすると、ブレークポイントが設定できます)

resumuボタンを押してスタートさせたあと、
2番目のブレークポイントでの表示。(パターン描画)
![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/0beee90a-0ac4-c1ec-2961-d05f343586bc.jpeg)

3番目のブレークポイントでの表示。(演算つきビットブロック描画)
![9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/64f6f886-8680-33ca-30bf-ecb42a6692b4.jpeg)

無事、動作させることができました。


##フェードインアウト＆ワイプの実行(fade_wipe.c)
プラットフォームプロジェクトをそのまま使用して、もう一つアプリケーションプロジェクトを作成します。
File - New - Application Project... でウィザードを開いたら、
Applicaion Project name は fade_wipe とし、Empty Application で作成します。

作成したアプリケーションプロジェクトの src フォルダに fade_wipe.c を登録します。
L51 に、フレームバッファのアドレスがあります。

>    return 0x10000000 + XSIZE*YSIZE*4*page;

を、

>    return 0x08000000 + XSIZE*YSIZE*4*page;

に変更します。

p.434 コラム I の通り、プラットフォームプロジェクトの BSP を変更します。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/3f5dce4d-9a93-10ca-eb03-2c5a3508644e.png)
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/19a653c1-561b-ae37-3518-7420bc548d9f.png)

FAT ファイルシステムの設定ができたら、プラットフォームプロジェクトを再ビルドします。

FAT フォーマットした microSD カードに、
\Zybo_Z7-10\dai11sho\display_pat_bit\VITIS
から、2 つの raw ファイルをコピーします。

FPGA_boards.raw
funamori.raw

できた MicroSD カードを、EBAZ4205 のソケットに挿しておきます。


すべての準備ができたら、
Debug Configurations を作成して、デバッグを開始します。
ブレークポイントの設定はありません。

microSD からファイルを読み込んで、フェードイン・アウトと、ワイプが繰り返し動作する映像が HDMI 出力から出てきます。

![12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/06b9e994-9345-3e77-be5c-c4c15db6e62c.jpeg)
![13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/ecf46750-23b3-624d-bdd2-77abc7497e2a.jpeg)


動作している様子は、下記のようになります。

https://twitter.com/i/status/1379684546426204160



#まとめ
FPGAプログラミング大全Xilinx編(第2版)の課題11-1
「パターン描画回路」
と、課題11-2
「ビットブロック描画回路」
を EBAZ4205 で実習することができました。