FC2カウンター FPGAの部屋 PYNQ

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

FPGAの部屋

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

PYNQボードのFASTX コーナー検出にラプラシアンフィルタIPとアンシャープ・マスクキング・フィルタIPを追加4(SDK)

PYNQボードのFASTX コーナー検出にラプラシアンフィルタIPとアンシャープ・マスクキング・フィルタIPを追加3(Vivado)”の続き。

前回は、Vivado 2016.4 のブロックデザイン上で、FASTXコーナー検出IP にラプラシアンフィルタIP とアンシャープ・マスクキング・フィルタIP を追加した。今回はアプリケーションソフトを作成して、動作させてみよう。

前回、Vivado 2016.4 でビットストリームの生成までを行ったので、ハードウェアをエクスポートして、SDK を立ち上げた。
その時に、エラーが出てしまったので、PYNQ_FASTX_164.sdk フォルダを一旦捨てて、もう一度、ハードウェアをエクスポートして、SDK を立ち上げた。そうすると、PYNQ_FASTX_164.sdk フォルダがもう一度、作られる。

これで、SDK で File メニューからNew -> Application Project を選択して、disp_lap_mask_on_serial プロジェクトを作成した。
カメラ出力、FASTX コーナー検出、ラプラシアンフィルタ、アンシャープ・マスクキング・フィルタを行うことができる disp_lap_mask_on_serial.c を作成した。
pynq_de_other_filters_21_170226.png

disp_lap_mask_on_serial.elf を起動すると最初に、カメラ出力、FASTX コーナー検出、ラプラシアンフィルタ、アンシャープ・マスクキング・フィルタを選択する表示が出てくる。それで機能を選ぶと、例えばFASTX コーナー検出を選べば threshold を入力できるようになる。その様子を下の図に示す。
pynq_de_other_filters_22_170226.png

サブディスプレイにHDMI 端子が無いため、HDMI-VGA変換器を購入して今日来るので、画面をキャプチャできていないため続きます。
  1. 2017年02月26日 04:46 |
  2. PYNQ
  3. | トラックバック:0
  4. | コメント:0

PYNQボードのFASTX コーナー検出にラプラシアンフィルタIPとアンシャープ・マスクキング・フィルタIPを追加3(Vivado)

”PYNQボードのFASTX コーナー検出にラプラシアンフィルタIPとアンシャープ・マスクキング・フィルタIPを追加2(Vivado HLS2)”の続き。

前回は、PYNQボード用の AXI4-Stream版のラプラシアンフィルタIP を作成した。今回は、AXI4-Stream版アンシャープ・マスクキング・フィルタIP と AXI4-Stream版のラプラシアンフィルタIP をPYNQボードのFASTX コーナー検出のVivado 2016.4 プロジェクトに追加する。

PYNQボードのFASTX コーナー検出のVivado プロジェクト PYNQ_FASTX_164 を示す。
pynq_de_other_filters_16_170224.png

pynq_fastx ブロックデザインを示す。
pynq_de_other_filters_17_170224.png

camera_interface モジュールを表示した。
pynq_de_other_filters_18_170224.png

AXI4-Stream版アンシャープ・マスクキング・フィルタIP と AXI4-Stream版のラプラシアンフィルタIP を camera_interface モジュールに追加した。

Address Editor のアドレスを示す。AXI4-Stream版アンシャープ・マスクキング・フィルタIP と AXI4-Stream版のラプラシアンフィルタIP がアドレス・マップされていた。
pynq_de_other_filters_19_170224.png

論理合成、インプリメント、ビットストリームの生成を行った。レポートを示す。
pynq_de_other_filters_20_170224.png
  1. 2017年02月24日 05:15 |
  2. PYNQ
  3. | トラックバック:0
  4. | コメント:0

PYNQボードのFASTX コーナー検出にラプラシアンフィルタIPとアンシャープ・マスクキング・フィルタIPを追加2(Vivado HLS2)

PYNQボードのFASTX コーナー検出にラプラシアンフィルタIPとアンシャープ・マスクキング・フィルタIPを追加1(Vivado HLS)”の続き。

前回は、アンシャープ・マスクキング・フィルタIP を生成した。今回はラプラシアンフィルタIP を生成する。

PYNQ のZynq 7020 (xc7z020clg400-1)用のVivado HLS 2016.4 のプロジェクトpynq_lap_filter_axis を生成した。
AXI4-Stream版のラプラシアンフィルタIPを持ってきて、Source とTest Bench に入れた。
PIPELINE指示子の下のUNROLL指示子は効果が無いというか、PIPELINE指示子で展開されているので、削除した。
Vivado HLS 2016.4 からINTERFACE指示子のAXI4-Stream (axis) では、「registor both」オプションが必須になった。

#pragma HLS INTERFACE axis register both port=ins
#pragma HLS INTERFACE axis register both port=outs

よって、そのように修正した。
pynq_de_other_filters_6_170221.png

そして、カメラ画像のラプラシアンフィルタ処理結果をリアルタイムで表示するので、私のラプラシアンフィルタは2次微分結果の半分しか表示していない。そこで、ラプラシアンフィルタ演算後に丸め処理をするところで、マイナスの時に 0 にするのではなく、絶対値を取ることにする。これで、マイナス方向の2次微分成分も表示することができるはずだ。
pynq_de_other_filters_7_170221.png

これで C シミュレーションを行った。
pynq_de_other_filters_8_170221.png

ラプラシアンフィルタ処理後の画像を示す。
pynq_de_other_filters_9_170221.png

やはり、マイナスの2次微分成分が入っているので、線がぼやける感じがする。

ラプラシアンフィルタ演算後に丸め処理をするところで、マイナスの時に 0 にしたほうが見た目がよさそうだ。やはり、マイナスの2次微分成分は取り除くことにする。
pynq_de_other_filters_10_170221.png

Top Function に lap_filter_axis を指定して、C コードの合成を行った。
pynq_de_other_filters_11_170221.png

Estimated が 11.37 ns になってしまっている。Latency は 480009 クロックで良好の様だ。

これではまずいので、Solutionメニューから Solution Settings... を選択して、Solution Settings ダイアログを表示し、Clock Period を 10 から 9 (ns) に変更した。
pynq_de_other_filters_12_170221.png

これでもう一度、C コードの合成を行った。
pynq_de_other_filters_13_170221.png

Estimated が 9.40 ns となって、10 ns の動作には問題が無くなった。Latency は 480010 クロックで、1 クロックだけ増えていた。LUT やFF も少しだけ増えていた。

これで、IP としてパッケージを行った。
Vivado RTL Synthesis にチェックを入れた。
pynq_de_other_filters_14_170221.png

Timing met 出来て、IP が生成された。
pynq_de_other_filters_15_170222.png
  1. 2017年02月21日 05:26 |
  2. PYNQ
  3. | トラックバック:0
  4. | コメント:0

PYNQボードのFASTX コーナー検出にラプラシアンフィルタIPとアンシャープ・マスクキング・フィルタIPを追加1(Vivado HLS)

PYNQボードには、”PYNQボードでカメラ画像をリアルタイムにFASTX コーナー検出1”、”PYNQボードでカメラ画像をリアルタイムにFASTX コーナー検出2”で、PYNQボードに付けたカメラの画像にFASTX コーナー検出をリアルタイムで行うことができた。
でも、そろそろPYNQ祭りに向けて、もう少しPYNQボードに芸をさせたい。そこで、いつものラプラシアンフィルタIPと最近、assert() の例としてやってみたアンシャープ・マスクキング・フィルタを追加することにした。

まずは、アンシャープ・マスクキング・フィルタIP をPYNQボード用に生成する。

PYNQ のZynq 7020 (xc7z020clg400-1)用のVivado HLS 2016.4 のプロジェクトpynq_unsharp_mask_fixedp を生成した。

unsharp_mask_fixedp のファイルをコピー&ペーストして、Explorer のSource とTest Bench にAdd File した。
assert() 付きの任意精度固定小数点型の実装だ。

アンシャープ・マスクキング・フィルタIP を 800 x 600 解像度に変更した。
pynq_de_other_filters_1_170220.png

Top Function を指定して、一旦、合成した。合成結果を示す。
pynq_de_other_filters_2_170220.png

やはり、Timing のEstimated は、10.08 ns でわずかながらTarget を越している。
Latency は 480036 クロックだった。そうピクセル数が 480000 ピクセルのことを思えば、大体 1 クロックで 1 ピクセルを処理できている。

Timing のEstimated を改善するために、Solution Settings のSynthesis Settings のClock Period を 10 ns から 9 ns に変更した。
これでもう一度、C コードの合成を行った。でもやはり、Timing のEstimated は、10.08 ns で変化が無かった。

Solution Settings のSynthesis Settings のClock Period を 8 ns に設定したところ、Timing のEstimated が 8.25 ns に収まった。
合成結果を示す。
pynq_de_other_filters_3_170220.png

Latency は 480037 クロックで、Timing のEstimated が 10 ns の時よりも 1 クロック増えた。
パーセンテージには表れないほどだが、FF と LUT もリソース使用量が増えている。
これで、10 ns のクロックで動作するだろう。

Export RTL を行った。その際にVivado RTL Synthesis にチェックを入れて、論理合成テストを行った。
pynq_de_other_filters_4_170220.png

論理合成テストも問題ないようだ。

C:\Users\Masaaki\Documents\VIvado_HLS\PYNQ\pynq_unsharp_mask_fixedp\solution1\impl\ip に xilinx_com_hls_unsharp_mask_axis_1_0.zip ができた。
pynq_de_other_filters_5_170220.png
  1. 2017年02月20日 05:14 |
  2. PYNQ
  3. | トラックバック:0
  4. | コメント:0

PYNQボードでカメラ画像をリアルタイムにFASTX コーナー検出2

PYNQボードでカメラ画像をリアルタイムにFASTX コーナー検出1”の続き。

前回、ブロックデザインが完成したので、今回は、ビットストリームまで生成して、SDKを立ち上げてアプリケーションソフトを作り、PYNQボードでカメラ画像をリアルタイムにFASTX コーナー検出してみよう。

まずは、前回からの続きでHDL のラッパーファイル(pynq_fastx_wrapper)を生成した。
pynq_de_fastx_18_170207.png

次に制約を書いた。
pynq_de_fastx_19_170207.png

set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[0]}]

set_property IOSTANDARD LVCMOS33 [get_ports mt9d111_iic_scl_io]
set_property IOSTANDARD LVCMOS33 [get_ports mt9d111_iic_sda_io]
set_property IOSTANDARD LVCMOS33 [get_ports href]
set_property IOSTANDARD LVCMOS33 [get_ports pclk]
set_property IOSTANDARD LVCMOS33 [get_ports standby]
set_property IOSTANDARD LVCMOS33 [get_ports vsync]
set_property IOSTANDARD LVCMOS33 [get_ports xck]

set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets pclk_IBUF]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets pclk_IBUF_BUFG]

create_clock -period 55.560 -name pclk -waveform {0.000 27.780} [get_ports pclk]
set_input_delay -clock [get_clocks pclk] 10.800 [get_ports {{cam_data[0]} {cam_data[1]} {cam_data[2]} {cam_data[3]} {cam_data[4]} {cam_data[5]} {cam_data[6]} {cam_data[7]} href pclk vsync}]

set_property PULLUP true [get_ports mt9d111_iic_scl_io]
set_property PULLUP true [get_ports mt9d111_iic_sda_io]

set_property PACKAGE_PIN W14 [get_ports {cam_data[7]}]
set_property PACKAGE_PIN V16 [get_ports {cam_data[6]}]
set_property PACKAGE_PIN Y14 [get_ports {cam_data[5]}]
set_property PACKAGE_PIN W16 [get_ports {cam_data[4]}]
set_property PACKAGE_PIN T11 [get_ports {cam_data[3]}]
set_property PACKAGE_PIN V12 [get_ports {cam_data[2]}]
set_property PACKAGE_PIN T10 [get_ports {cam_data[1]}]
set_property PACKAGE_PIN W13 [get_ports {cam_data[0]}]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_0_B_p]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_1_R_p]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_2_G_p]
set_property IOSTANDARD TMDS_33 [get_ports TMDS_tx_clk_p]
set_property PACKAGE_PIN U19 [get_ports href]
set_property PACKAGE_PIN Y16 [get_ports standby]
set_property PACKAGE_PIN K17 [get_ports TMDS_tx_0_B_p]
set_property PACKAGE_PIN K19 [get_ports TMDS_tx_1_R_p]
set_property PACKAGE_PIN J18 [get_ports TMDS_tx_2_G_p]
set_property PACKAGE_PIN L16 [get_ports TMDS_tx_clk_p]
set_property PACKAGE_PIN Y19 [get_ports vsync]
set_property PACKAGE_PIN W19 [get_ports xck]
set_property PACKAGE_PIN Y18 [get_ports mt9d111_iic_scl_io]
set_property PACKAGE_PIN U18 [get_ports mt9d111_iic_sda_io]
set_property PACKAGE_PIN Y17 [get_ports pclk]

set_false_path -from [get_clocks pclk] -to [get_clocks clk_fpga_0]
set_false_path -from [get_clocks clk_fpga_0] -to [get_clocks pclk]
set_false_path -from [get_clocks [get_clocks -of_objects [get_pins pynq_fastx_i/bitmap_disp_cntrler_axi_master_0/inst/dvi_disp_i/BUFR_pixel_clk_io/O]]] -to [get_clocks clk_fpga_0]


論理合成、インプリメント、ビットストリームを生成した。と書いているが、何度か制約を修正しながらコンパイルしている。
pynq_de_fastx_20_170208.png

成功した。Clock Domain Closing のレポートを示す。
まずは、clk_fpga_0 から pclk
pynq_de_fastx_26_170209.png

次に、pclk から clk_fpga_0
pynq_de_fastx_27_170209.png

pclk_buf から clk_fpga_0
pynq_de_fastx_28_170209.png

ハードウェアをエクスポートして、SDK を立ち上げ、アプリケーションソフトを書いた。
pynq_de_fastx_21_170208.png

fastx_on_serial.elf を起動した。

threshold = 5 の時の FASTXコーナー検出の結果を示す。
pynq_de_fastx_22_170208.png

pynq_de_fastx_23_170208.jpg

threshold = 10 の時の FASTXコーナー検出の結果を示す。
pynq_de_fastx_24_170208.png

pynq_de_fastx_25_170208.jpg

うまく行った。PYNQボードでカメラ画像をリアルタイムにFASTX コーナー検出できた。。。うれしい。。。

PYNQボードの写真を示す。脇はZYBO だ。
pynq_de_fastx_29_170209.jpg

pynq_de_fastx_30_170209.jpg
  1. 2017年02月09日 04:18 |
  2. PYNQ
  3. | トラックバック:0
  4. | コメント:0

PYNQボードでカメラ画像をリアルタイムにFASTX コーナー検出1

このところ実装しているVivado HLS のFASTX コーナー検出IP をPYNQ ボードにも実装してカメラ画像からリアルタイムにFASTX コーナー検出を行った。

まずは、Vivado HLS で fastx プロジェクトをPYNQ のZynq 7020 (xc7z020clg400-1)用に再度合成を行った。
pynq_de_fastx_1_170206.png

ブロックデザインを最初から作るのはとっても面倒なので、ZYBO のV_ZYBO_CAMDS_FASTXt_164 フォルダのプロジェクトのブロックデザインをtcl スクリプトにエクスポートした。
pynq_de_fastx_2_170206.png

そのエクスポートされたV_ZYBO_CAMDS.tcl をコピー&ペーストして、名前を pynq_fastx.tcl に変更した。
pynq_de_fastx_3_170206.png

pynq_fastx.tcl をエディタで開いて、V_ZYBO_CAMDS を pynq_fastx に入れ替えた。
pynq_de_fastx_4_170206.png

Vivado 2016.4 でPYNQ のZynq 7020 (xc7z020clg400-1)用のプロジェクト PYNQ_FASTX_164 を新規作成した。
pynq_de_fastx_5_170206.png

Digilent 社のPYNQボードのResouce Center から Zynq Presets をダウンロードした。
pynq_de_fastx_6_170206.png

このZIPファイルの中には、pynq_revC.tcl が入っている。それをセーブしておく。
pynq_de_fastx_7_170206.png

ビットマップ・ディスプレイ・コントローラIP、カメラ・インターフェースAXI4-Stream IP、FASTX コーナー検出IP をコピー&ペーストして、IP Catalog でそれらのIP を追加する。

pynq_fastx プロジェクトの Tcl Console で

cd z:/PYNQ_FASTX_164/
source pynq_fastx.tcl

コマンドを入力し、pynq_fastx ブロックデザインを生成した。
pynq_de_fastx_8_170206.png

これだとまだ、PS がZYBO のままなので、PYNQボードに変更しよう。
Processing System_7 をダブルクリックして開く。
Re-customize IP ダイアログのPresets -> Apply Configuration... を選択する。
pynq_de_fastx_9_170206.png

先ほどダウンロードした pynq_revC.tcl を選択する。
pynq_de_fastx_10_170206.png

これでPYNQボードの設定に入れ替えられたが、クロックを3個使っていたり、AXI_GPポート、AXI_HP0, HP2 ポートを使っているので、デフォルト状態だとそれらのポートからの配線が無くなってしまう。よって、この状態でそれらの設定を行う必要がある。
まずは、PS-PL Configuration をクリックする。
pynq_de_fastx_11_170206.png

S AXI_HP0 と S AXI_HP2 にチェックを入れる。
pynq_de_fastx_12_170206.png

次に、Clock Configuration をクリックする。
FCLK_CLK1 とFCLK_CLK2 にチェックを入れて、FCLK_CLK1 を 25 MHz に設定する。FCLK_CLK2 を36 MHz に設定する。
pynq_de_fastx_13_170206.png

pynq_fastx ブロックデザインを示す。
pynq_de_fastx_14_170206.png

camera_interface サブモジュールを示す。
pynq_de_fastx_15_170206.png

Address Editor を示す。これは、ZYBO と同じアドレスだ。
pynq_de_fastx_16_170207.png

Validate Design も通った。
pynq_de_fastx_17_170207.png
  1. 2017年02月08日 04:48 |
  2. PYNQ
  3. | トラックバック:0
  4. | コメント:0

Xilinx/PYNQのプロジェクトを生成した4(タイミングエラーの解決)

Xilinx/PYNQのプロジェクトを生成した3(タイミングエラーの解析2)”の続き。

前回は、Report CDC で異なるクロック・ドメイン間のデータのやり取りの状況を解析した。今回はその問題となるパスを確認して解決してみよう。

最初の system_i/iop3/arduino_io_switch_0/inst/arduino_io_switch_v1_0_S_AXI_inst/slv_reg2_reg[14]/C から system_i/tracebuffer_arduino/trace_cntrl_0/inst/ap_CS_fsm_reg[7]/D へのパスを解析してみよう。

iop3 はここにある。
pynq-master_29_170125.png

pynq-master_30_170125.png

ipp3 をダブルクリックして開くと、arduino_io_switch_0 があった。
pynq-master_31_170125.png

さて、行先を見てみよう。Unknown のパスの 1, 2 番目の tracebuffer_arduino と tracebuffer_pmods が上下に配置されている。
pynq-master_32_170125.png

system_i/iop3/arduino_io_switch_0 から system_i/tracebuffer_arduino へのデータパスがあるかどうか?を見てみた。ある。。。
pynq-master_33_170125.png

2, 3 番目の iop1/mb1_gpio を見てみよう。iop1 をダブルクリックして開いた。
pynq-master_34_170125.png

pynq-master_35_170125.png

iop1/mb1_gpio から tracebuffer_pmods へのデータパスがあるかどうか?確かめてみた。やはり、あるね。。。
pynq-master_36_170125.png

arduino_io_switch_0 はプロジェクト内にローカルに存在するIP の様なので、IP の中身を見ることができる。
arduino_io_switch_0 を右クリックし、右クリックメニューからEdit in IP Packager を選択する。
pynq-master_37_170125.png

Edit in IP Packager ダイアログが表示された。OK ボタンをクリックした。
pynq-master_38_170125.png

arduino_io_switch_0 プロジェクトが表示された。
pynq-master_39_170125.png

slv_reg2 には S_AXI_WDATA が代入されていた。

そのarduino_io_switch_0 の slv_reg2 が接続されている先は、tracebaffer_arduino の A_TDATA だが、これはVivado HLSで生成された trace_cntrl_0 に直接接続されている。これは問題があるな。。。
pynq-master_40_170125.png

tracebuffer_pmods も同じだった。
pynq-master_41_170125.png

tracebaffer_arduino や tracebuffer_pmods は clk_fpga_3 クロックを使用している。
pynq-master_42_170125.png

Xilinx/PYNQのプロジェクトを生成した2(タイミングエラーの解析1)”でも、clk_fpga_3 のタイミングエラーは最大 - 2.258 ns でかなり大きい。よって、これを clk_fpga_0 にしてしまえば、全部解決すると思う。

PS からPL に回っているクロックを見てみよう。
pynq-master_43_170125.png

clk_fpga_0 は 100 MHz で、 clk_fpga_3 は166.667 MHz だった。

PS の FCLK_CLK3 ピンをクリックして、そこで右クリックし、右クリックメニューからDisconnect Pin を選択して、PS の FCLK_CLK3 ピンだけをクロックネットから外す。配線を消してしまうと、clk_fpga_3 のクロック配線をすべて削除することになり大変なことになってしまう。
次にPS の FCLK_CLK0 ピンからPS の FCLK_CLK3 ピンに接続されていたクロックネットに配線した。
pynq-master_44_170125.png

次に、ルーターとプレーサーにもう少し頑張ってもらうために、Flow Navigator のImplementation → Implementation Settings をクリックして、出てきたProject Settings ダイアログで、Strategy にPerformance_ExtraTimingOpt を選択した。
pynq-master_45_170125.png

これで、もう一度、論理合成、インプリメント、ビットストリームの生成を行った。
レポートを示す。
pynq-master_46_170126.png

うまくタイミングメットしたようだ。
  1. 2017年01月26日 05:08 |
  2. PYNQ
  3. | トラックバック:0
  4. | コメント:0
»