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

#はじめに
1500円 ZYNQ 基板(EBAZ4205)で、
FPGAプログラミング大全Xilinx編(第2版)の第11章
11-1「パターン描画回路」
11-2「ビットブロック描画回路」
について、高位合成と IP のエクスポートまで実習したいと思います。

スクショの枚数がとても多くなってしまったため、
11-2 後半の「動作確認」は、次の投稿に分割します。

全て Vitis HLS 上での作業になるため、この記事に EBAZ4205 は出てきません。
EBAZ4205 で高位合成を利用するための作業ということで、1500円ZYNQ基板シリーズの記事となっておりますw
![33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/5e619660-97a3-45c3-b450-11aca9a3221b.png)


#プロジェクトの概要
C++ で記述されたパターン描画回路、ビットブロック描画回路を高位合成(C++ → RTL へ変換)し、それぞれ IP としてエクスポートします。

作成した 2 つの IP を、第9章で作成したグラフィック表示回路と合体して、回路を完成させます。
PS のプログラムで描画を行い、HDMI から画面出力します。

この記事では、プロジェクトの前半、IP パッケージのエクスポートまでを実習します。


#パターン描画回路の高位合成と IP 作成
大全のサポートファイルから、
\XilinxFPGA_SE\Zybo_Z7-10\dai11sho\patblt_ip
フォルダをデスクトップにコピーします。

p.493 表11-1 に従ってすすめます。

Vitis HLS を起動して、Create Project を選択します。
Project name: patblt
Locaton: \Desktop\patblt_ip
として Next します。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/0f756dbf-c1a7-6a0b-6871-5a71b6fc9855.png)

Add/remove C-based source files (design specification) では patblt.cpp を登録し、Top Function を patblt として Next。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/e2fd6109-c1a9-565e-5cde-70f7d233739e.png)

Add/remove C-based testbench files (design test) では、patblt_tb.cpp を登録して Next。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/15a10d9c-e9b8-9162-4421-26261a43e5ab.png)

Solution Configuration では、Part Selection に xc7z010clg400-1 を選択し、それ以外はデフォルトのまま Finish。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/b1999193-c000-9638-04e8-ffe16b70d81e.png)

Vitis HLS が起動します。
シミュレーションは省略して、高位合成の作業を進めます。

##ディレクティブの追加
p.496 リスト11-3 パターン描画回路のディレクティブ(directives.tcl) に沿って設定していきます。

左ペインで Source の下にある patblt.cpp をダブルクリックします。
ソースファイルと、その右のペインに Directive のタブが出てきます。
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/2414258c-f093-75d0-6caa-7f9a8ef8a9bf.png)

###1. patblt
Directive タブの下にある patblt を選択して右クリックし、Insert Directive... を選択(※)。
Vitis HLS Directive Editor が開きます。
※patblt をダブルクリックしても同じです
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/af816004-2ba3-58ac-8b0f-fcf2056d5d77.png)

Directive のプルダウンメニューから、Interface を選択。
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/15b0b619-9774-37e4-c6f5-3bcfb50acb95.png)

Options の mode (optional) のプルダウンメニューから s_axilite を選択。
それ以外はデフォルトのままとして、OK を押す。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/7b478127-4f8a-d725-bdbc-9258e772bd5b.png)

###2. dstout
次は patblt の下にある dstout を選択して右クリックし、Insert Directive... を選択。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/a4e53793-f27a-92b5-fc4c-97f18b779640.png)

Directive のプルダウンメニューから、INTERFACE を選択。
mode (optional) のプルダウンメニューから m_axi を選択。
offset (optional) のプルダウンメニューから slave を選択。
depth (required) に 307200 を入力。
max_write_burst_length (optional) に 16 を入力。
max_write_outstanding (optional) に 16 を入力。
それ以外はデフォルトのままとして、OK を押す。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/4d684cb3-f9a2-1fd5-a790-52110bc01d83.png)

###3. xpos, ypos, width, height, color
以下同様にして、
xpos, ypos, width, height, color すべてに INTERFACE, mode=s_axilte を設定します。
![11_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/71a8091d-2e4b-b356-7a7b-4d3d56a34797.png)

###4. height_loop
こんどは、Directive タブの下にある height_loop の設定で、
Directive プルダウンメニューから LOOP_TRIPCOUNT を選択。
avg (optional) に 240 を入力。
max (optional) に 480 を入力。
min (optional) に 1 を入力。
それ以外はデフォルトのままとして、OK を押す。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/d0ec869d-2571-8693-6f24-ec554894a393.png)

###5. with_loop
同様に、with_loop の設定で、
avg (optional) に 320 を入力。
max (optional) に 640 を入力。
min (optional) に 1 を入力。
それ以外はデフォルトのままとして、OK を押す。
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/2a8a98d1-90be-cd1c-7875-76a530ad52d8.png)

###6. patblt (name)
最後に、patblt の設定で、
Directive のプルダウンメニューから、TOP を選択。
top module name (optional) に patblt を入力。
それ以外はデフォルトのままとして、OK を押す。
![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/32e3cba9-62a2-a415-685a-45bdb81c5ff9.png)

##ディレクティブの確認
これでディレクティブの追加は完了です。
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/da9351f1-93f9-c896-7e61-f02d0c547206.png)

directives.tcl を確認してみると、このようになりました。
記載順は違いますが、大全の p.496 リスト11-3 と同内容になっています。
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/7fc6cbfd-97d2-4b02-2a18-59c32dfe6e92.png)

##合成
Run C Synthesis のボタンを押して、合成に入ります。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/ee5b236e-7442-c883-6fad-0d71bcbcdc8f.png)

合成結果は、このようになりました。
BRA_18K:2, DSP:0, FF:1092, LUT:1392 で大全と同じです。
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/90fa205a-6f3b-7208-79a2-ab95cca08a32.png)

##IP のエクスポート
Export RTL ボタンを押して、IP を出力します。
![18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/cec130f7-0eac-69b5-84fa-51de5a36cfe3.png)

Export の設定は、デフォルトのままで OK を押します。
![19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/61fb7537-a746-659e-eb9f-20fdd1a422b3.png)

これで、ひとつめの IP が完成しました。

#ビットブロック描画回路の高位合成と IP 作成
上と同じ手順で進めます。

\XilinxFPGA_SE\Zybo_Z7-10\dai11sho\bitblt_ip
フォルダをデスクトップにコピーします。

パターン描画回路と同様に、プロジェクトを作成してディレクティブを追加していきます。

Vitis HLS を起動して、Create Project を選択します。
Project name: bitblt
Locaton: \Desktop\bitblt_ip
として Next します。

Add/remove C-based source files (design specification) では bitblt.cpp を登録し、Top Function を bitblt として Next。

Add/remove C-based testbench files (design test) では、bitblt_tb.cpp を登録して Next。

Solution Configuration では、Part Selection に xc7z010clg400-1 を選択し、それ以外はデフォルトのまま Finish。

Vitis HLS が起動します。
Directive タブの各項目について、p.508 リスト11-8 の記載順に、ディレクティブを追加してゆきます。

##ディレクティブの追加
###1. bitblt
bitblt の設定で、Directive プルダウンメニューから TOP を選択。
top module name (optiolnal) に bitblt を追加して、OK を押す。
![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/0396596a-2d0f-da40-cd20-3642e6cf9ff6.png)

再度、bitblt の Insert Directive... を開き、今度は Directive プルダウンメニューから INTERFACE を選択。
mode (optional) のプルダウンメニューから s_axilite を選択。
それ以外はデフォルトのままとして、OK を押す。
![21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/d2737472-e417-631b-0701-0a2e23232269.png)

###2. dstout
次は bitblt の下の dstout の設定で、
Directive のプルダウンメニューから、INTERFACE を選択。
mode (optional) のプルダウンメニューから m_axi を選択。
offset (optional) のプルダウンメニューから slave を選択。
bundle (optional) に dst を入力。
depth (required) に 307200 を入力。
max_write_burst_length (optional) に 32 を入力。
max_write_outstanding (optional) に 16 を入力。
それ以外はデフォルトのままとして、OK を押す。
![22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/0376cba3-7326-dbee-6e41-05f8030d77c2.png)

###3. dstin
次は bitblt の下の dstin の設定で、
Directive のプルダウンメニューから、INTERFACE を選択。
mode (optional) のプルダウンメニューから m_axi を選択。
offset (optional) のプルダウンメニューから slave を選択。
bundle (optional) に dst を入力。
depth (required) に 307200 を入力。
max_write_burst_length (optional) に 32 を入力。
max_write_outstanding (optional) に 16 を入力。
それ以外はデフォルトのままとして、OK を押す。
![23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/f6c1e6b6-dbda-5004-80a1-0cc1a25043d9.png)

###4. srcin
次は bitblt の下の srcin の設定で、
Directive のプルダウンメニューから、INTERFACE を選択。
mode (optional) のプルダウンメニューから m_axi を選択。
offset (optional) のプルダウンメニューから slave を選択。
bundle (optional) に src を入力。
depth (required) に 307200 を入力。
max_read_burst_length (optional) に 32 を入力。
max_read_outstanding (optional) に 16 を入力。
それ以外はデフォルトのままとして、OK を押す。
![24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/878d1109-1c01-2cbd-b915-395c1f65946c.png)

###5. width, height, aplha
以下同様にして、bitblt の下の
width, height, alpha に INTERFACE, mode=s_axilte を設定します。
![25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/d2674df9-b795-d42b-f135-b31d97e731a3.png)

###6. height_loop
こんどは、Directive タブの下にある height_loop の設定で、
Directive プルダウンメニューから DATAFLOW を選択。
それ以外はデフォルトのままとして、OK を押す。
![26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/bceb616e-eade-2607-18a6-dc7b9ac09f46.png)

再度、height_loop の設定で、
Directive プルダウンメニューから LOOP_TRIPCOUNT を選択。
avg (optional) に 240 を入力。
max (optional) に 480 を入力。
min (optional) に 1 を入力。
それ以外はデフォルトのままとして、OK を押す。
![27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/56abad80-0954-c3d9-db06-35e622a27b5a.png)

###7. dstin_loop
次に、dstin_loop の設定で、
Directive プルダウンメニューから PIPELINE を選択。
それ以外はデフォルトのままとして、OK を押す。
![28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/c7c7d4ed-5fab-6fda-5333-ed93c4f32000.png)

再度、dstin_loop の設定で、
Directive プルダウンメニューから LOOP_TRIPCOUNT を選択。
avg (optional) に 320 を入力。
max (optional) に 640 を入力。
min (optional) に 1 を入力。
それ以外はデフォルトのままとして、OK を押す。
![29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/855d36a9-3be0-ad0a-8ee2-76e5ddf53bc8.png)

###8. src_loop, dstout_loop
src_loop, dstout_loop も、dstin_loop と同じく DATAFLOW と LOOP_TRIPCOUNT のディレクティブ追加を行い、OK を押す。

##ディレクティブの確認
これでディレクティブの追加は完了です。
![30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/2b6f653f-6cbf-a6ab-7020-3be65946789a.png)

directives.tcl を確認してみると、このようになりました。
記載順は違いますが、大全の p.508 リスト11-8 と同内容になっています。
![31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/4e74fe69-f43b-8ea5-18b1-4dcffb2063b7.png)

##合成
Run C Synthesis のボタンを押して、合成に入ります。

合成結果は、このようになりました。
全て、p.509 図11-7 と同じ結果が得られています。
![32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/955220/7583d3f1-a656-49fe-b597-05d7b203334f.png)

##IP のエクスポート
Export RTL ボタンを押して、IP を出力します。
2つめの IP も完成しました。

#まとめ
FPGAプログラミング大全Xilinx編(第2版)の第11章
11-1「パターン描画回路」
11-2「ビットブロック描画回路」
について、高位合成と IP のエクスポートまで実習することができました。

動作確認は、次の記事で投稿します。

ディレクティブ追加の前まではソフトウェア開発ですが、そこから先はハードウェア開発要素が増えていきます。

ソフト開発者の手元で C++ コードができたら、ハード開発者と連携して検討しながら、ディレクティブを詰めていくような開発手法が良いのはないでしょうか。