FC2カウンター FPGAの部屋 reVISION, xfOpenCV
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

reVISION-Zybo-Z7-20をやってみた15(mnist_conv_nn10_sDMA その4)

reVISION-Zybo-Z7-20をやってみた14(mnist_conv_nn10_sDMA その3)”の続き。

前回は、Vivado HLS のプロジェクトを見て、他の動作周波数でもビルドが成功するどうか?を調べたところ、133.33 MHz でビルドが成功した。今回は、ビルドが成功した 133.33 MHz のファイルセットをMicroSDカードに書いて動作をチェックしよう。

今回参考にするのは、”reVISION-Zybo-Z7-20をやってみた6(Zybo-Z7-20 で確認)

最初に、MicroSDカードをフォーマットしておく。Ubuntu だと sudo fdiskで1パーティションでFAT32 でフォーマットする。
lsblk で見ると、MicroSD カードは /dev/sdc にマップされていた。

MicroSD カードがマウントされているときは、sudo umount /dev/sdc1 でアンマウントする。

cd reVISION-Zybo-Z7-20/sdsoc/zybo_z7_20/export/zybo_z7_20/sd_image/
で sd_image のディレクトリに入った。

unzip -p rootfs.zip | sudo dd of=/dev/sdd bs=2MB
sync

で、MicroSD に書き込んだ。

これだと、第2パーティションが 1.4GB しか無いので、後の 5GB 程度が無駄になるので、残りの容量をフルに使いたい。
ということで検索の結果、”Raspberry Pi のSDカードのパーティションを拡張する”を参考にして第2パーティションを拡張することにした。
sudo fdisk sdc
一旦、第2パーティションを削除して、もう一度、MicroSDカードの容量一杯に再度、第2パーティションを確保しなおした。
パーティション情報を書き込んで、
sudo resize2fs /dev/sdc2
コマンドで第2パーティションの容量を拡張した。
resize2fs_1_180910.png
resize2fs_2_180910.png
resize2fs_3_180910.png
resize2fs_4_180910.png

第2パーティションをマウントして容量を見てみると、7.1GB だった。容量が拡張されている。
resize2fs_5_180910.png

第1パーティションにブート用ファイルをコピーする。
sudo cp -r sdx_workspaces/revisio_zybo_z7_20_ws/mnist_conv_nn10_sDMA/Debug/sd_card/* /media/masaaki/ZYNQBOOT/

bmp_file0.bmp も/media/masaaki/ZYNQBOOT/ にコピーした。
reV_mnist_conv_nn10_sDMA_30_180911.png

この MicroSD カードを Zybo-Z7-20 に入れて電源ON した。
gtkterm を起動した。
sudo gtkterm
なお、sudo gtkterm & では、gtkterm が起動なかった。
gtkterm が起動したら次の設定を行った。
Configuration -> Portを選択する
Port:/dev/ttyUSB1、Baud Rate:115200を選択する

起動メッセージの一部とプロンプトが表示された。
ifconfig
すると、IP が振られているのが分かった。Ether のスイッチには接続してある。
reV_mnist_conv_nn10_sDMA_31_180911.png

ZYNQBOOT は /run/media/mmcblk0p1/ ディレクトリにマウントされていた。
reV_mnist_conv_nn10_sDMA_32_180911.png

./mnist_conv_nn10_sDMA.elf を起動した。
reV_mnist_conv_nn10_sDMA_33_180911.png
reV_mnist_conv_nn10_sDMA_34_180911.png

max_id_hw , max_id_sw 共に 8 と認識できた。成功だ。
  1. 2018年09月12日 04:44 |
  2. reVISION, xfOpenCV
  3. | トラックバック:0
  4. | コメント:0

reVISION-Zybo-Z7-20をやってみた14(mnist_conv_nn10_sDMA その3)

reVISION-Zybo-Z7-20をやってみた13(mnist_conv_nn10_sDMA その2)”の続き。

前回は、動作周波数 75 MHz でmnist_conv_nn10_sDMA.cpp がハードウェアとしてデバックでビルドできて、Vivado のレポートを見た。今回は、Vivado HLS のプロジェクトを見て、他の動作周波数でもビルドが成功しないのか?確かめてみよう。

まずは、Vivado HLS のプロジェクトは revisio_zybo_z7_20_ws/mnist_conv_nn10_sDMA/Debug/_sds/vhls/mnist_conv_nn ディレクトリにある。
reV_mnist_conv_nn10_sDMA_20_180911.png

Vivado HLS 2017.4 を立ち上げて、mnist_conv_nn プロジェクトを読み込んだ。
reV_mnist_conv_nn10_sDMA_21_180911.png

C コードの合成時のレポートを示す。
reV_mnist_conv_nn10_sDMA_22_180911.png
reV_mnist_conv_nn10_sDMA_23_180911.png

Timing のTarget が 13.33 ns に対して、Estimated が 10.73 ns だった。
Latency は min が 1161511 クロックで、max が 1363111 クロックだった。
リソース使用量は、BRAM_18K が 157 個、DSP48E が 4 個、FF が 1356 個、LUT が 4210 個だった。

次に、他の動作周波数でビルドが成功するか?確認してみよう。
115.38 MHz ではタイミングエラーでビルドが失敗した。
133.33 MHz では、ビルドが成功した。
reV_mnist_conv_nn10_sDMA_24_180911.png

Vivado HLS の C コードの合成結果を観す。
reV_mnist_conv_nn10_sDMA_25_180911.png
reV_mnist_conv_nn10_sDMA_26_180911.png

Target 7.5 ns に対して、Estimated は 12.13 ns でとても間に合わないように思える。
Latency は min 1609431クロックで、max が 1867351 クロックだった。133.33 MHz の周期 7.5 ns だと、min で約 12.1 ms で max で 14.0 ms となる。

Vivado synthesis, place and route にチェックを入れて、Export RTL を行った。
reV_mnist_conv_nn10_sDMA_27_180911.png

CP achieved post-implementation は 7.495 ns で、規格を満たしている。

Vivado を起動してレポートを見た。
reV_mnist_conv_nn10_sDMA_28_180911.png

WNS は 0.059 ns だった。微妙なところでタイミングがメットしている。

Implemented Design を開いて Intra-Clock Paths を確認するとやはり mnist_conv_nn_1 がタイミングの余裕が最小だということが分かった。
reV_mnist_conv_nn10_sDMA_29_180911.png
  1. 2018年09月11日 05:23 |
  2. reVISION, xfOpenCV
  3. | トラックバック:0
  4. | コメント:0

reVISION-Zybo-Z7-20をやってみた13(mnist_conv_nn10_sDMA その2)

reVISION-Zybo-Z7-20をやってみた12(mnist_conv_nn10_sDMA)”の続き。

前回は、畳み込みニューラル・ネットワークをreVISION-Zybo-Z7-20で実装しようとしたが、タイミングエラーで終わってしまった。今回は、動作周波数を 100 MHz から 75 MHz に変更してビルドしてみよう。成功したので、Vivadoのプロジェクトを見てみよう。

まずは動作周波数を 100 MHz から 75 MHz に変更した。
reV_mnist_conv_nn10_sDMA_9_180909.png

これで、Debug でビルドしたら、今度は成功した。
reV_mnist_conv_nn10_sDMA_10_180910.png

revisio_zybo_z7_20_ws/mnist_conv_nn10_sDMA/Debug/sd_card ディレクトリを見るとBOOT.BIN などのファイルが見えた。
reV_mnist_conv_nn10_sDMA_11_180910.png

Vivado のプロジェクトを見てみよう。
revisio_zybo_z7_20_ws/mnist_conv_nn10_sDMA/Debug/_sds/p0/_vpl/ipi/imp ディレクトリに imp.xpr があったので、Vivado 2017.4 で開いてみた。
reV_mnist_conv_nn10_sDMA_12_180910.png

reV_mnist_conv_nn10_sDMA_13_180910.png

Project Summary を見てみると、Timing のWorst Negative Slack は 0.264 ns だった。結構余裕がないかな?制約に依存するのではあるが、やはりこれだと 100 MHz はきついのかも?

Implemented Design を開いて Intra-Clock Paths を確認するとmnist_conv_nn_1 がタイミングの余裕が最小であることが分かった。
reV_mnist_conv_nn10_sDMA_19_180910.png

次に、revisio_zybo_z7_20_ws/mnist_conv_nn10_sDMA/Debug/_sds/p0/_vpl/ipi/syn ディレクトリの syn.xpr を開いた。
reV_mnist_conv_nn10_sDMA_15_180910.png

開いたVivado 2017.4 のプロジェクトを示す。
reV_mnist_conv_nn10_sDMA_16_180910.png

zybo_z7_20 ブロックデザインを開いた。
reV_mnist_conv_nn10_sDMA_17_180910.png

mnist_nn_conv_1 付近を拡大した。
reV_mnist_conv_nn10_sDMA_18_180910.png

mnist_conv_nn_1_if も見える。
  1. 2018年09月10日 05:23 |
  2. reVISION, xfOpenCV
  3. | トラックバック:0
  4. | コメント:0

reVISION-Zybo-Z7-20をやってみた12(mnist_conv_nn10_sDMA)

だいぶ飛んでしまったが、”reVISION-Zybo-Z7-20をやってみた11(WarpTransform)”の続き。

reVISION-Zybo-Z7-20をやっていたのは、畳み込みニューラル・ネットワークをreVISION, xfOpenCV (OpenCV 使っていないので、実質的には SDSoC だが)で実装するためだった。それをちょっと再開してみよう。理由はあるのだがここでは書かないでおく。

手書き数字認識用畳み込みニューラルネットワーク回路の製作3(畳み込みNN)”の mnist_conv_nn10_sDMA を使用して reVISION-Zybo-Z7-20 でやってみよう。

mnist_conv_nn10_sDMA プロジェクトを示す。
reV_mnist_conv_nn10_sDMA_1_180908.png

SDSoC に合わせて指示子を入れ替えた。
mnist_conv_nn10_sDMA.cpp のVivado HLS 用指示子をコメントアウトして、

#pragma SDS data zero_copy(in)

を追加した。
concatenate_2_180902.png

mnist_conv_nn10_sDMA_tb.cpp に

#include "sds_lib.h"

を追加し、malloc() を sds_alloc() に入れ替えた。
reV_mnist_conv_nn10_sDMA_3_180908.png

これで、Debug でビルドしたところエラーが発生した。
reV_mnist_conv_nn10_sDMA_4_180909.png

エラー内容を示す。

===>The following messages were generated while processing /home/masaaki/sdx_workspaces/revisio_zybo_z7_20_ws/mnist_conv_nn10_sDMA/Debug/_sds/p0/_vpl/ipi/syn/syn.runs/zybo_z7_20_mnist_conv_nn_1_if_0_synth_1 :
ERROR: [VPL 8-6058] Synth Error: [XPM_MEMORY 40-40] BYTE_WRITE_WIDTH_A (8) does not result in an integer number of bytes within the specified WRITE_DATA_WIDTH_A (12) for this configuration which uses port A write operations. [/opt/Xilinx/Vivado/2017.4/data/ip/xpm/xpm_memory/hdl/xpm_memory.sv:683]


ということで、12 ビット長で 8 ビット境界で無いからダメということのようだ。

mnist_conv_nn10_sDMA.cpp と mnist_conv_nn10_sDMA_tb.cpp に

ap_fixed<12, 7, AP_TRN_ZERO, AP_SAT>

があった。
reV_mnist_conv_nn10_sDMA_5_180909.png

それを

ap_fixed<16, 7, AP_TRN_ZERO, AP_SAT>

に変更した。
reV_mnist_conv_nn10_sDMA_6_180909.png

もう一度、Debug でビルドしたら、Vivado は起動したが、タイミングエラーで落ちてしまった。
reV_mnist_conv_nn10_sDMA_7_180909.png

でも elf ファイルはできた。
reV_mnist_conv_nn10_sDMA_8_180909.png
  1. 2018年09月09日 08:23 |
  2. reVISION, xfOpenCV
  3. | トラックバック:0
  4. | コメント:0

reVISION-Zybo-Z7-20をやってみた11(WarpTransform)

reVISION-Zybo-Z7-20をやってみた10(stereo)”の続き。

前回は、reVISION-Zybo-Z7-20 の File I/O の example の stereo をやってみた。今回は、reVISION-Zybo-Z7-20 の File I/O の example の最後の WarpTransform をやってみた。

なお、今回も @ikwzm さんの”FPGA+SoC+Linux+Device Tree Overlay+FPGA Region(SDSoC対応編)”のプラットフォームを使用して、SDSoC が出力した実行ファイルを実行している。

SDSoC の WarpTransform プロジェクトを示す。
reVISION-Zybo-Z7-20_127_120409.png

Debug でビルドを行って成功した。
Debug/sd_card を ZYBO-Z7-20 の Debian 上の ~/sdsoc_test/warptransform/ に SFTP した。

これからは、 ZYBO-Z7-20 の Debian 上での作業になる。
stereo から _p0_.dts と xlnk.dts を ~/sdsoc_test/stereo/ 上にコピーした。
ビットファイルをダウンロードして、Xilinx APF Accelerator driver を有功にする。
sd_card ディレクトリに行く。
cp ../stereo/*.dts .
sudo dtbocfg.rb --install _p0_ --dts _p0_.dts
sudo dtbocfg.rb --install xlnk --dts xlink.dts
cd sd_card/

reVISION-Zybo-Z7-20_128_120409.png

warptransform.elf を実行した。
sudo warptransform.elf im0.jpg
reVISION-Zybo-Z7-20_129_120409.png

レポートを示す。

Transformation Matrix
1.01332 0.0172398 -19.5289
0.00700084 1.01997 -16.4525
0 0 0
elapsed time 14995626

Max_err: 4 Min_err: 1 Num_errs: 342 Num_errs > 1: 342


input.png, hls_out.jpg, opencv_output.png, diff_image.png が生成された。
reVISION-Zybo-Z7-20_130_120409.png

reVISION-Zybo-Z7-20 の WarpTransform example の im0.jpg を引用する。
reVISION-Zybo-Z7-20_131_120409.jpg

input.png を示す。
reVISION-Zybo-Z7-20_132_120409.jpg

opencv_output.png を示す。少し平行四辺形に歪んでいる?
reVISION-Zybo-Z7-20_133_120409.jpg

hls_out.jpg を示す。
reVISION-Zybo-Z7-20_134_120409.jpg

diff_image.png を示す。これは、opencv_output.png と hls_out.jpg の差分なのだろう?
reVISION-Zybo-Z7-20_135_120409.jpg

これで、reVISION-Zybo-Z7-20 の File I/O をすべて、@ikwzm さんの”FPGA+SoC+Linux+Device Tree Overlay+FPGA Region(SDSoC対応編)”のプラットフォームを使用して、SDSoC が出力した実行ファイルを実行することができた。
  1. 2018年04月11日 05:25 |
  2. reVISION, xfOpenCV
  3. | トラックバック:0
  4. | コメント:0

reVISION-Zybo-Z7-20をやってみた10(stereo)

reVISION-Zybo-Z7-20をやってみた9(再びDense Non-Pyramidal Optical Flow)”の続き。

前回は、CMA領域を 64MB に増やして、Dense Non-Pyramidal Optical Flowをやってみたところエラーになることもなく正常に実行できた。今回は、reVISION-Zybo-Z7-20 の File I/O の example の残りの stereo をやってみよう。

なお、今回も @ikwzm さんの”FPGA+SoC+Linux+Device Tree Overlay+FPGA Region(SDSoC対応編)”のプラットフォームを使用して、SDSoC が出力した実行ファイルを実行している。

SDSoC の stereo プロジェクトを示す。
reVISION-Zybo-Z7-20_126_120409.png

Debug でビルドを行って成功した。
Debug/sd_card を ZYBO-Z7-20 の Debian 上の ~/sdsoc_test/stereo/ に SFTP した。

これからは、 ZYBO-Z7-20 の Debian 上での作業になる。
dnp_of から _p0_.dts と xlnk.dts を ~/sdsoc_test/stereo/ 上にコピーした。
前回の dnp_of をやったままだったので、デバイスツリーを削除した。
cp ../dnp_of/*.dts .
sudo dtbocfg.rb --remove _p0_
sudo dtbocfg.rb --remove xlink

reVISION-Zybo-Z7-20_117_120408.png

ビットファイルをダウンロードして、Xilinx APF Accelerator driver を有功にする。
sd_card ディレクトリに行って、stereo.elf を実行する。
sudo dtbocfg.rb --install _p0_ --dts _p0_.dts
sudo dtbocfg.rb --install xlnk --dts xlink.dts
cd sd_card/
sudo .stereo.elf left.png right.png

reVISION-Zybo-Z7-20_118_120408.png

sd_card ディレクトリに ocv_output.png, hls_output.jpg が生成された。
reVISION-Zybo-Z7-20_119_120408.png

まずは、reVISION-Zybo-Z7-20 の stereo example の left.png と right.png を引用する。
reVISION-Zybo-Z7-20_122_120408.jpg

reVISION-Zybo-Z7-20_123_120408.jpg

ocv_output.png を示す。
reVISION-Zybo-Z7-20_121_120408.jpg

hls_output.jpg を示す。
reVISION-Zybo-Z7-20_120_120408.jpg

白のほうが手前で、黒のほうが奥なんだろうと思う。
hls_output.jpg の方が、ocv_output.png よりも白っぽい感じがする。

今回も @ikwzm さんの”FPGA+SoC+Linux+Device Tree Overlay+FPGA Region(SDSoC対応編)”のプラットフォームを使用して、stereo example が実行できた。
  1. 2018年04月10日 05:06 |
  2. reVISION, xfOpenCV
  3. | トラックバック:0
  4. | コメント:0

reVISION-Zybo-Z7-20をやってみた9(再びDense Non-Pyramidal Optical Flow)

reVISION-Zybo-Z7-20をやってみた8(Harrisコーナー検出)”の続きではあるのだが、”@ikwzmさんの”FPGA+SoC+Linux+Device Tree Overlay+FPGA Region(SDSoC対応編)”をやってみる4”でエラーになった Dense Non-Pyramidal Optical Flow の対処方法を @ikwzm さんに教えて頂いたので、もう一度やってみようと思う。@ikwzm さん、お世話になり、ありがとうございました。

まずは、Linux 上では、CMA (Contiguous Memory Allocator) 領域という領域を SDSoC は使用している。CMA 領域は連続なメモリ領域を取ることができる。通常のメモリ領域を malloc() などで確保した場合はソフトウェア側から連続に見えても MMU (Memory Management Unit) がページごとに物理メモリを割り振っていて、ページを超えると物理アドレスが連続していないということが良くあり得る。その場合には、FPGAがメモリにDMA する場合は、ページごとにDMA の再起動が必要となる(ちなみにAXI4 インターフェースは 4Kバイト境界でバーストをやめる必要があります)。ページごとにアドレスを入れ替えるために Scatter Gather DMA がある。だが、連続領域にDMA するほうが絶対に効率が良い。そこで、物理メモリ的に連続領域を確保できる CMA 領域の出番がある。

Dense Non-Pyramidal Optical Flow のエラーは、その CMA 領域を確保しようとしたがメモリが足りないよというエラーだった。
よってCMA 領域を増やせば良いということになる。現在は 16 MB を確保している。それを 64 MB に増やすことにした。
増やし方は、ZYBO-Z7-20 の Micro SD カードの第1パーティションの uEnv.txt を書き換えることだ。なお、この書き方は、@ikwzm さんに教えて頂いた。

ZYBO-Z7-20 の Debian 上では /boot にマウントされている ディレクトリの uEnv.txt を書き換える。

linux_boot_cmd=setenv bootargs console=ttyPS0,115200 root=/dev/mmcblk0p2 rw rootwait uio_pdrv_genirq.of_id=generic-uio && bootz 0x03000000 - 0x02A00000



linux_boot_cmd=setenv bootargs console=ttyPS0,115200 root=/dev/mmcblk0p2 rw rootwait uio_pdrv_genirq.of_id=generic-uio cma=64M && bootz 0x03000000 - 0x02A00000


にした。つまり bootargs に cma=64M を追加した。
reVISION-Zybo-Z7-20_124_120409.png

リブートして、dmesg を見ると、CMA 領域が 64MB になった。
reVISION-Zybo-Z7-20_125_120409.png

それでは、もう一度、Dense Non-Pyramidal Optical Flow を@ikwzm さんの”FPGA+SoC+Linux+Device Tree Overlay+FPGA Region(SDSoC対応編)”の環境で動作させてみよう。

cd ~/sdsoc_test/dnp_of
sudo cp sd_card/_sds/_p0_.bin /lib/firmware/
sudo dtbocfg.rb --install _p0_ --dts _p0_.dts
sudo dtbocfg.rb --install xlnk --dts xlnk.dts
cd sd_card/
sudo ./dnp_of.elf im0.jpg im1.jpg

今度はエラー無しに実行できた。
reVISION-Zybo-Z7-20_113_120408.png

~/sdsoc_test/dng_of/ ディレクトリを示す。
reVISION-Zybo-Z7-20_114_120408.png

~/sdsoc_test/dng_of/sd_card/ ディレクトリを示す。
reVISION-Zybo-Z7-20_115_120408.png

out_0.jpg ができている。開いてみると、
reVISION-Zybo-Z7-20_116_120408.jpg

うまく行っている。成功だ。
  1. 2018年04月09日 04:13 |
  2. reVISION, xfOpenCV
  3. | トラックバック:0
  4. | コメント:0
»