FC2カウンター FPGAの部屋 ZYBO Z7
FC2ブログ

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

FPGAの部屋

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

ZYBO Z7-20でPcam 5Cを使用する4(タイミングエラーの検討)

ZYBO Z7-20でPcam 5Cを使用する3(インプリメント)”の続き。

前回はインプリメントを行ったら、タイミングエラーが出てしまった。今回は、そのタイミングエラーの原因を探ってみよう。

Project Manager のImplementation → Open Implemented Design をクリックして、Implemented Desgin を開いた。

Timing タブをクリックする。
Intra-Clock Paths が赤くなっているので、タイミングエラーがことにあるはずだ。
dphy_hs_clock_p が赤くなっているので、開くと、ここがタイミングエラーだった。
dphy_data_hs_n[1], dphy_data_hs_n[0] だった。MIPI の 2 つのデータがタイミングエラーとのことだが、全部Logic Delay でNet Delay が 0 だと対応しようがないんじゃないだろうか?
MIPI_camera_20_180105.jpg

Requirement の 1.488 ns は、ZyboZ7_A.xdc の

create_clock -period 2.976 -name dphy_hs_clock_p -waveform {0.000 1.488} [get_ports dphy_hs_clock_clk_p]

で定義されている。
MIPI_camera_21_180106.png

その記述はMIPI_D_PHY_RX IP のMIPI_DPHY_reciver.vhd -> DPHY_LaneSFEN.vhd -> HS_Deserializer.vhd にあった。
MIPI_camera_22_180106.png

Deserializer の ISERDESE2 のDDLY ピンの部分だ。
MIPI_camera_23_180106.png

こんなところ、どうにもならないんじゃないだろうか?
もう一度、Implemented Desgin でパスをDevice 画面で見てみた。まずは、dphy_data_hs_n[1] から。
MIPI_camera_24_180106.png

パスは短いしパスの遅延は 0 ns だ。

次に、dphy_data_hs_n[0] を見てみよう。
MIPI_camera_25_180106.png

やはりパスは短い。

dphy_data_hs_n[1] のデータパスのクロックパスの遅延状況を示す。
MIPI_camera_26_180106.png

dphy_data_hs_n[0] のデータパスのクロックパスの遅延状況を示す。
MIPI_camera_27_180106.png

IDELAYE2 のIDELAY_TYPE も"VARIABLE"だし、このまま動作を確認してみようかと思う。
  1. 2018年01月06日 21:23 |
  2. ZYBO Z7
  3. | トラックバック:0
  4. | コメント:0

ZYBO Z7-20でPcam 5Cを使用する3(インプリメント)

ZYBO Z7-20でPcam 5Cを使用する2(pcam-5c プロジェクト)”の続き。

前回は、pcam-5c プロジェクトを生成した。今回は、pcam-5c プロジェクトのsystem ブロック・デザインを階層化して、論理合成、インプリメント、ビットストリームの生成を行う。

ブロック・デザインの system だが、IP が小さくなって見にくいので、階層化を行った。
MIPI 関連のIP と画像処理 IP をMIPI_image 階層にまとめた。更にHDMI 出力関連のIP を hdmi_out 階層としてまとめてある。

最初に、ブロック・デザインのトップの system から貼っておく。
MIPI_camera_15_180105.jpg

MIPI_image 階層を貼っておく。
MIPI_camera_16_180105.jpg

hdmi_out 階層を貼っておく。
MIPI_camera_17_180105.jpg

Address Editor 画面を貼っておく。
MIPI_camera_18_180105.jpg

これで論理合成、インプリメント、ビットストリームの生成を行った。
結果を示す。
MIPI_camera_19_180105.jpg

Timing エラーが発生している。次はその原因を探っていこう。
  1. 2018年01月05日 05:27 |
  2. ZYBO Z7
  3. | トラックバック:0
  4. | コメント:0

ZYBO Z7-20でPcam 5Cを使用する2(pcam-5c プロジェクト)

ZYBO Z7-20でPcam 5Cを使用する1(D-PHYインターフェース)”の続き。

前回は、MIPI のD-PHY インターフェースについて調べた。今回は、Digilent 社のZybo Z7 Pcam 5C Demo プロジェクトをダウンロードして、Vivado 2016.4 のプロジェクトを生成してみよう。

Pcam 5C のリソースセンターから、Zybo Z7 Pcam 5C Demo をクリックする。

Zybo Z7 Pcam 5C DemoDownloadGIT Repo をクリックする。

GitHub のDigilent/Zybo-Z7-20-pcam-5c が開く。

Clone or download ボタンをクリックして、Download ZIP をクリックした。
MIPI_camera_5_180104.jpg

Zybo-Z7-20-pcam-5c-master.zip を Z:\ZYBO_Z7 に保存した。
Zybo-Z7-20-pcam-5c-master.zip を解凍すると、Zybo-Z7-20-pcam-5c-master フォルダが作成された。
MIPI_camera_6_180104.jpg

Zybo-Z7-20-pcam-5c-master フォルダ以下のディレクトリ構造を示す。

Z:.
├─hw_handoff
├─proj
├─repo
│  ├─cache
│  ├─local
│  │  └─ip
│  │      ├─AXI_BayerToRGB
│  │      │  ├─hdl
│  │      │  └─xgui
│  │      └─AXI_GammaCorrection
│  │          ├─hdl
│  │          └─xgui
│  └─vivado-library
├─sdk
│  ├─pcam_vdma_hdmi
│  │  ├─bootimage
│  │  ├─Debug
│  │  └─src
│  │      ├─hdmi
│  │      ├─ov5640
│  │      └─platform
│  ├─pcam_vdma_hdmi_bsp
│  └─system_wrapper_hw_platform_0
└─src
    ├─bd
    │  └─system
    │      ├─hdl
    │      ├─hw_handoff
    │      ├─ip
    │      │  ├─system_auto_pc_0
    │      │  │  ├─sim
    │      │  │  └─synth
    │      │  ├─system_auto_pc_1
    │      │  │  ├─sim
    │      │  │  └─synth
    │      │  ├─system_auto_pc_2
    │      │  │  ├─sim
    │      │  │  └─synth
    │      │  ├─system_AXI_BayerToRGB_1_0
    │      │  │  ├─sim
    │      │  │  └─synth
    │      │  ├─system_AXI_GammaCorrection_0_0
    │      │  │  ├─sim
    │      │  │  └─synth
    │      │  ├─system_axi_mem_intercon_0
    │      │  ├─system_axi_mem_intercon_1_0
    │      │  ├─system_axi_vdma_0_0
    │      │  │  ├─sim
    │      │  │  └─synth
    │      │  ├─system_clk_wiz_0_0
    │      │  ├─system_MIPI_CSI_2_RX_0_0
    │      │  │  ├─hdl
    │      │  │  │  ├─cdc_fifo
    │      │  │  │  │  ├─cdc_fifo
    │      │  │  │  │  ├─hdl
    │      │  │  │  │  ├─sim
    │      │  │  │  │  ├─simulation
    │      │  │  │  │  └─synth
    │      │  │  │  ├─ila_rxclk
    │      │  │  │  │  ├─hdl
    │      │  │  │  │  │  └─verilog
    │      │  │  │  │  ├─ila_v6_2
    │      │  │  │  │  │  └─constraints
    │      │  │  │  │  ├─sim
    │      │  │  │  │  └─synth
    │      │  │  │  ├─ila_rxclk_lane
    │      │  │  │  │  ├─hdl
    │      │  │  │  │  │  └─verilog
    │      │  │  │  │  ├─ila_v6_2
    │      │  │  │  │  │  └─constraints
    │      │  │  │  │  ├─sim
    │      │  │  │  │  └─synth
    │      │  │  │  ├─ila_vidclk
    │      │  │  │  │  ├─hdl
    │      │  │  │  │  │  └─verilog
    │      │  │  │  │  ├─ila_v6_2
    │      │  │  │  │  │  └─constraints
    │      │  │  │  │  ├─sim
    │      │  │  │  │  └─synth
    │      │  │  │  └─line_buffer
    │      │  │  │      ├─hdl
    │      │  │  │      ├─line_buffer
    │      │  │  │      ├─sim
    │      │  │  │      ├─simulation
    │      │  │  │      └─synth
    │      │  │  ├─sim
    │      │  │  └─synth
    │      │  ├─system_MIPI_D_PHY_RX_0_0
    │      │  │  ├─hdl
    │      │  │  │  ├─ila_scnn_refclk
    │      │  │  │  │  ├─hdl
    │      │  │  │  │  │  └─verilog
    │      │  │  │  │  ├─ila_v6_2
    │      │  │  │  │  │  └─constraints
    │      │  │  │  │  ├─sim
    │      │  │  │  │  └─synth
    │      │  │  │  ├─ila_sfen_refclk
    │      │  │  │  │  ├─hdl
    │      │  │  │  │  │  └─verilog
    │      │  │  │  │  ├─ila_v6_2
    │      │  │  │  │  │  └─constraints
    │      │  │  │  │  ├─sim
    │      │  │  │  │  └─synth
    │      │  │  │  └─ila_sfen_rxclk
    │      │  │  │      ├─hdl
    │      │  │  │      │  └─verilog
    │      │  │  │      ├─ila_v6_2
    │      │  │  │      │  └─constraints
    │      │  │  │      ├─sim
    │      │  │  │      └─synth
    │      │  │  ├─sim
    │      │  │  └─synth
    │      │  ├─system_processing_system7_0_0
    │      │  │  ├─hdl
    │      │  │  │  └─verilog
    │      │  │  ├─sim
    │      │  │  └─synth
    │      │  ├─system_ps7_0_axi_periph_0
    │      │  ├─system_rgb2dvi_0_0
    │      │  │  ├─sim
    │      │  │  ├─src
    │      │  │  └─synth
    │      │  ├─system_rst_clk_wiz_0_50M_0
    │      │  │  ├─sim
    │      │  │  └─synth
    │      │  ├─system_rst_vid_clk_dyn_0
    │      │  │  ├─sim
    │      │  │  └─synth
    │      │  ├─system_video_dynclk_0
    │      │  │  ├─sim
    │      │  │  ├─src
    │      │  │  └─synth
    │      │  ├─system_vtg_0
    │      │  │  ├─sim
    │      │  │  └─synth
    │      │  ├─system_v_axi4s_vid_out_0_0
    │      │  │  ├─sim
    │      │  │  └─synth
    │      │  ├─system_xbar_0
    │      │  │  ├─sim
    │      │  │  └─synth
    │      │  └─system_xlconcat_0_0
    │      │      ├─sim
    │      │      └─synth
    │      └─ipshared
    │          ├─01bf
    │          │  └─hdl
    │          ├─04b4
    │          │  └─hdl
    │          ├─0b6b
    │          │  └─hdl
    │          ├─0ba0
    │          │  └─hdl
    │          ├─100a
    │          ├─1923
    │          │  └─hdl
    │          ├─1f32
    │          │  └─hdl
    │          ├─20df
    │          │  └─src
    │          ├─2e37
    │          ├─38e8
    │          │  └─hdl
    │          ├─39ba
    │          │  └─hdl
    │          ├─3c71
    │          │  └─hdl
    │          ├─40b8
    │          │  └─hdl
    │          ├─4e69
    │          │  └─hdl
    │          ├─52cb
    │          │  └─hdl
    │          ├─564d
    │          │  ├─hdl
    │          │  └─simulation
    │          ├─5ab6
    │          │  └─hdl
    │          ├─6039
    │          │  └─hdl
    │          ├─6273
    │          │  ├─hdl
    │          │  └─simulation
    │          ├─7dd0
    │          │  └─hdl
    │          ├─7e3a
    │          │  └─hdl
    │          ├─7ee0
    │          │  └─hdl
    │          ├─832a
    │          │  └─hdl
    │          ├─896d
    │          │  └─hdl
    │          ├─8c13
    │          │  └─hdl
    │          │      └─verilog
    │          ├─bf41
    │          │  └─hdl
    │          ├─d9f8
    │          │  └─hdl
    │          ├─df1b
    │          │  └─hdl
    │          ├─ed72
    │          │  └─hdl
    │          └─f822
    │              └─src
    ├─constraints
    ├─hdl
    ├─ip
    └─others


これで、Vivado 2016.4 のプロジェクトの作成を試みたのだが、IP のソースが足りないというエラーでプロジェクトを作成することができなかった。
Twitter でプロジェクトができないとつぶやいていたら、@torix3g さんが、Zybo-Z7-20-pcam-5c/repo/vivado-library@4c77837の中にIP のソースがあると教えてくれた。ありがとうございました。

Zybo-Z7-20-pcam-5c/repo/ には、vivado-library @ 4c77837 があるが、その下は別のGitHub のプロジェクトとなっているようだった。
MIPI_camera_7_180104.jpg

vivado-library @ 4c77837 をクリックすると、Digilent Vivado library に移動した。これは別のGitHub のプロジェクトだ。
MIPI_camera_8_180104.jpg

ip フォルダをクリックすると、2つのMIPI 関連のIP があるのが確認できる。
MIPI_camera_9_180104.jpg

ちなみに、通常のDigilent 社のGitHub のvivado-library ではMIPI の 2 つのIP は存在しない。リンクされていないディレクトリのようだ。

Digilent Vivado library に戻って、Download ZIPで vivado-library-4c77837154a3dd90ef1ed9feacdce41dbfc6e538.zip をダウンロードすることができた。
MIPI_camera_10_180104.jpg

Z:\ZYBO_Z7\vivado-library-4c77837154a3dd90ef1ed9feacdce41dbfc6e538.zip\vivado-library-4c77837154a3dd90ef1ed9feacdce41dbfc6e538 の下のすべてのファイルとフォルダをZ:\ZYBO_Z7\Zybo-Z7-20-pcam-5c-master\repo\vivado-library にコピーした。
MIPI_camera_11_180104.jpg

これでファイルがそろったので、Vivado 2016.4 を立ち上げた。

Tcl Console で、

cd z:/ZYBO_Z7/Zybo-Z7-20-pcam-5c-master/proj

を入力した。
MIPI_camera_12_180104.jpg

Tcl Console で、

source ./create_project.tcl

を入力した。
MIPI_camera_13_180104.jpg

すると、pcam-5c プロジェクトが作成された。
MIPI_camera_14_180104.jpg
  1. 2018年01月04日 05:23 |
  2. ZYBO Z7
  3. | トラックバック:0
  4. | コメント:0

ZYBO Z7-20でPcam 5Cを使用する1(D-PHYインターフェース)

2018 年の最初のFPGA の記事は ZYBO Z7 で Pcam 5C を使ってみるという記事にする。

まずは、Xilinx 社の XAPP 894 (v1.0) D-PHY ソリューション でD-PHY のことを学習しよう。

XAPP 894 (v1.0) D-PHY ソリューション で学習した内容を示す。
MIPI (Mobile Industry Processor Interface) は、MIPIアライアンスが策定したシリアル通信インターフェース規格で、カメラ・シリアル・インターフェース(CSI)とディスプレイ・シリアル・インターフェース(DSI)があるそうだ。そして、MIPI のインターフェース規格がD-PHY のようだ。
現在、1本でD-PHY をサポートできるI/O ピンがFPGAにないので、複数のピンを使用している。
その理由を示す。
XAPP 894 (v1.0) D-PHY ソリューション の図1:D-PHYの概要を引用する。
MIPI_camera_3_180103.jpg

D-PHYには、2つのモードがあって、LVDS のHS (HS Diff. Swing (e.g. 200mV))と、LVCMOS-1.2V の LP(Low-power Signaling Level (e.g. 1.2V))があるので、通常のFPGAの 1 ピンでは出力できない。

D-PHY の信号線には、クロック・ペアとデータのレーンがあるが、ZYBO Z7-20 のMIPI インターフェースは 2 つのデータ・レーンを使用している。

1つのD-PHY インターフェースには 4 のI/O ピンを必要とする。どんなインターフェースでFPGAのI/O ピンを使用しているかを示す図が、XAPP 894 (v1.0) D-PHY ソリューション の図 11 :FPGA 対応のD-PHY レシーバーだ。それを引用する。
MIPI_camera_4_180103.jpg

ZYBO Z7 では、XAPP 894 (v1.0) D-PHY ソリューション の図 11 :FPGA 対応のD-PHY レシーバーと同じ回路で接続されている。

ZYBO Z7 の回路図を見てみよう。

2ページのMIPI インターフェース部分を引用する。
MIPI_camera_1_180103.jpg

XAPP 894 (v1.0) D-PHY ソリューション の図 11 :FPGA 対応のD-PHY レシーバー と同じだった。

MIPI 関連の線がFPGA のどこに接続されているかだが、ZYBO Z7 の回路図の 11 ページにFPGA への接続図がある。
MIPI_camera_2_180103.jpg

例えば、レーン 0 は、MIPI_LANE0_P が M19 ピンに、MIPI_LANE0_N が M20 ピンに、LP_LANE_0_N が M18 ピンに、LP_LANE_0_P が L19 に接続されている。
  1. 2018年01月03日 08:06 |
  2. ZYBO Z7
  3. | トラックバック:0
  4. | コメント:0

FPGA+SoC+Linux実践勉強会での課題をやってみた3(Vivado 編2 ACPポートを使用)

FPGA+SoC+Linux実践勉強会での課題をやってみた2(Vivado 編)”の続き。

「”FPGA+SoC+Linux実践勉強会”でZYBO Z7 を使用し、Vivado HLS でDMA IPを作成して、Vivado で回路にして、SDK でベアメタル・アプリケーションでDMA IP を動作させようとしたら動作しなかった。
そこで、DMA IP を仕上げてデバイツリー・オーバーレイやudmabuf などを確かめてみよう。」ということで、前回はPS のHP ポートを使用して、Vivado HLS で作成したDMA_pow2 IP を接続して使用することができた。今回は、ACP ポートにDMA_pow2 IP を接続して使用してみようと思う。

FPGA+SoC+Linux実践勉強会での課題をやってみた2(Vivado 編)”をプロジェクト・フォルダごとコピー&ペーストして、フォルダの名前をtest_dma_ACP に変更した。
FPGA-SoC-Linux4ZYBO_Z7_41_171206.png

PS をダブルクリックして、ダイアログを開き、HP ポートを削除し、ACP ポートをTie off AxUSER 付きで追加した。
FPGA-SoC-Linux4ZYBO_Z7_43_171206.png

ブロック・デザインを示す。
FPGA-SoC-Linux4ZYBO_Z7_42_171206.png

Address Editor 画面を示す。
FPGA-SoC-Linux4ZYBO_Z7_54_171209.png

論理合成、インプリメント、ビットストリームの生成を行った。結果を示す。
FPGA-SoC-Linux4ZYBO_Z7_44_171206.png
FPGA-SoC-Linux4ZYBO_Z7_45_171206.png

成功した。
ビットストリーム付きで、ハードウェアをエクスポートし、SDK を立ち上げた。
FPGA-SoC-Linux4ZYBO_Z7_46_171206.png

Vivado Analyzer で波形を観測するためにHello_World を起動してから、Vivado Analyzer を起動して、その後、test_dma.elf を十個したところ、成功した。
FPGA-SoC-Linux4ZYBO_Z7_40_171206.png

Vivado Analyzer の波形を示す。
Read 波形を示す。
FPGA-SoC-Linux4ZYBO_Z7_39_171206.png

Write 波形を示す。
FPGA-SoC-Linux4ZYBO_Z7_40_171206.png

ここで、最後にBVALID が 1 になっていることに注目してほしい。
ここまでは昨日の夜やっていたのだが、一夜明けて、朝もう一度やってみたところ、Tera Termに全く表示されなくなった。
その時の波形を示す。

Read から示す。
FPGA-SoC-Linux4ZYBO_Z7_47_171207.png

一見普通のトランザクションに見えるのだが、最後の 9 をRead するところで、データのRead が 1 買いだけになってしまっているのが分かると思う。つまり、トランザクションが足りない。

次にWrite を見てみよう。
FPGA-SoC-Linux4ZYBO_Z7_48_171207.png

こちらも 64 はWrite できているが、91 が無い。しかもBVALID のアサートもない。
つまり、Write 応答チャネルに反応が無いようなのだ。メモリに書けていないようなのだ。しかし、一回はうまく行ったのに、一夜明けると失敗するのだろう?不可解だ。。。
なお、HP ポートはいつでも成功していて安定している。

(追記)
ACPポートが使えるようになりました。ikzwm さんに教えてもらったのですが、AWCACHEとARCACHE はXilinxのデフォルトでは 0011 のCacheable and bufferable, do not allocate だが、これではL2 キャッシュには書かれないそうだ。(”Zynq の ACP を使う時の AxCACHE 信号とAxUSER 信号の値”参照)

Zynq の ACP を使う時の AxCACHE 信号とAxUSER 信号の値”によるとAxCACHE 信号とAxUSER 信号の値は、Cacheable write-back, allocate on both read and write の 1111 ということで、これを設定してやってみた。

DMA_pow2 IP をダブルクリックして、設定ダイアログを表示させた。
CACHE value を ”1111”に変更した。
FPGA-SoC-Linux4ZYBO_Z7_49_171207.png

これで、論理合成、インプリメント、ビットストリームの生成を行って、成功した。

ハードウェアをエクスポートして、SDK を立ち上げた。
FPGA-SoC-Linux4ZYBO_Z7_50_171207.png

HP ポートでも result[] が 0 になるコードを実行したが、きちんと二乗の計算ができてる。
FPGA-SoC-Linux4ZYBO_Z7_51_171207.png

Vivado Analyzer でAXI4 Master の波形を取ってみたので貼っておく。
Read
FPGA-SoC-Linux4ZYBO_Z7_52_171207.png

Write
FPGA-SoC-Linux4ZYBO_Z7_53_171207.png

これで、デバイスツリー・オーバーレイや udmabuf を試してみよう。
  1. 2017年12月07日 04:57 |
  2. ZYBO Z7
  3. | トラックバック:0
  4. | コメント:0

FPGA+SoC+Linux実践勉強会での課題をやってみた2(Vivado 編)

FPGA+SoC+Linux実践勉強会での課題をやってみた1(Vivado HLS編)”の続き。

「”FPGA+SoC+Linux実践勉強会”でZYBO Z7 を使用し、Vivado HLS でDMA IPを作成して、Vivado で回路にして、SDK でベアメタル・アプリケーションでDMA IP を動作させようとしたら動作しなかった。
そこで、DMA IP を仕上げてデバイツリー・オーバーレイやudmabuf などを確かめてみよう。」ということで、前回はVivado HLS 2017.3 でDMA_pow プロジェクトを作成し、10 個のデータをReadし、 2 乗して出力するIP にした。今回は、そのDMA_pow2 IP を使用して、Vivado 2017.3 の IPI で ZYBO Z7 のPS と接続して、SDK でアプリケーションソフトを作って実機で試してみよう。

Vivado 2017.3 で test_dma プロジェクトを作成した。

IP Catalog を開いて、右クリックメニューからAdd Repository... を選択して、DMA_pow2 IP を加えた。

test_dma ブロック・デザインを作成し、回路を構成した。
FPGA-SoC-Linux4ZYBO_Z7_23_171206.png

ブロック・デザインを示す。
FPGA-SoC-Linux4ZYBO_Z7_24_171206.png

PS のHP ポートを使用している。ACP ポートを使用すると、SDK のtest_dma アプリケーションソフトを実行したときに、どうしても

while(!XDma_pow2_IsDone(&XMluti_ap)) ;

から抜けてこなかったのだ。どうしてか分からないが、ACP ポートではVivado HLS で作成した Dma_pow2 IP がDone にならないようだ?

HDL Wapper を作成し、論理合成、インプリメント、ビットストリームの生成を行って、成功した。結果を示す。
FPGA-SoC-Linux4ZYBO_Z7_25_171206.png
FPGA-SoC-Linux4ZYBO_Z7_26_171206.png

ハードウェアをビットストリームごとエクスポートし、SDK を立ち上げた。

Hello_World アプリケーション・プロジェクトを作成した。

test_dma アプリケーション・プロジェクトを作成した。
FPGA-SoC-Linux4ZYBO_Z7_28_171206.png

test_dma.c を示す。

/* * test_dma.c * *  Created on: 2017/12/02 *      Author: masaaki */


#include <stdio.h>
#include "xdma_pow2.h"
#include "xparameters.h"

volatile int data[10] = {0123456789};
volatile int result[10] = {0123456789};

int main(){
    XDma_pow2 XMluti_ap;
    XDma_pow2_Config *XMulti_apPtr;
    int i;

    // Look Up the device configuration
    XMulti_apPtr = XDma_pow2_LookupConfig(0);
    if (!XMulti_apPtr){
        fprintf(stderr, "XMulti_apuint configuration failed.\n");
        return(-1);
    }

    // Initialize the Device
    int Xlap_status = XDma_pow2_CfgInitialize(&XMluti_ap, XMulti_apPtr);
    if (Xlap_status != XST_SUCCESS){
        fprintf(stderr, "Could not Initialize XMulti_apuint\n");
        return(-1);
    }

    XDma_pow2_Set_in_r(&XMluti_ap, (u32)&data[0]);
    XDma_pow2_Set_out_r(&XMluti_ap, (u32)&result[0]);

    XDma_pow2_Start(&XMluti_ap);

    while(!XDma_pow2_IsDone(&XMluti_ap)) ;

    for(i=0; i<10; i++){
        printf("data[%d] = %d, result[%d] = %d\n", i, data[i], i, result[i]);
    }

    return 0;

}


Hello_World を実行してから、test_dma を実行した結果を示す。
FPGA-SoC-Linux4ZYBO_Z7_29_171206.png

date[] の 2 乗倍が result[] になっている。

result[] の結果はresult[] 配列の宣言によっても影響を受ける。

volatile int result[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

volatile int result[10];

にしてみよう。
FPGA-SoC-Linux4ZYBO_Z7_30_171206.png

これで実行してみた結果を示す。
FPGA-SoC-Linux4ZYBO_Z7_31_171206.png

result[] はすべて 0 だ。。。DMAは成功していてもARM プロセッサはデータを読めていない。これで、”FPGA+SoC+Linux実践勉強会”の時はうまく行かなかったようだ。
これは、.bss 領域と .data 領域のキャッシュのON, OFF の違いが影響しているのかもしれない?
ちなみに、現在は、volatile でグローバルに data 配列と reseult 配列を宣言しているが、main() の中で、data 配列と reseult 配列を宣言していた時は、Vivado Analyzer で見たときのRead アクセス(つまり in[i] のRead )のデータも正しくなかった。つまり、物理アドレスと仮想アドレスが違っていたのではないか?と思う。
いろいろと難しいですね。。。ホントに。。。

Vivado Analyzerの波形を貼っておく。

まずは、全体のトランザクション波形から。
FPGA-SoC-Linux4ZYBO_Z7_32_171206.png

Slot_0 がAXI4 Master で、Slot_1 が AXI4 Lite Slave だ。
AXI4 Lite Slave でレジスタを設定してるので、AXI4 Master よりも先にトランザクションがあるのが分かる。AXI4 Master のトランザクションが発生してからのAXI4 Lite Slave はAXI4 Master のDone 待ちループに入っている。

次に、AXI4 Lite Slave のレジスタ設定部分を拡大してみた。
FPGA-SoC-Linux4ZYBO_Z7_33_171206.png

最初の0x18 へのWrite が in[] のアドレスを書いている。それが 0x0010e3fc だ。次に、0x20 に out[] のアドレスの 0x0010e424 を書いている。最後のWrite はスタートで、0x00 に 1 を書いている。

次にAXI4 Master を見てみよう。
最初のRead とWrite を拡大した。最初にRead から。
FPGA-SoC-Linux4ZYBO_Z7_34_171206.png

これは、最初の二乗の 0 の二乗をやっているところだ。RVALID が 2 回 1 になっているのが分かる。これは、Vivado HLS でのC/RTL コシミュレーションと同様だ。RDATA の値は 0 になっているのが分かる。

次に、同じ時間のWrite を示す。
FPGA-SoC-Linux4ZYBO_Z7_35_171206.png

WVALID が 1 になっているところが 1 個のデータ(WDATAが 0 )をWrite したところだ。なお、Read のバースト長は 1 だが、Write のバースト長は 10 で、すべてのデータをバーストで書く。しかし、データが用意できないので、Write もまばらなトランザクションになってしまう。

データが 0 では寂しいので、最後の二乗を示す。 9 X 9 = 81 の演算だ。まずはRead を示す。
FPGA-SoC-Linux4ZYBO_Z7_36_171206.png

次にWrite を示す。
FPGA-SoC-Linux4ZYBO_Z7_37_171206.png

ここでは、バーストの最後なので、RVALID と一緒にRLAST が 1 にアサートされているのが分かると思う。そして、BVALID がアサートされているのも分かる。
  1. 2017年12月06日 05:22 |
  2. ZYBO Z7
  3. | トラックバック:0
  4. | コメント:0

FPGA+SoC+Linux実践勉強会での課題をやってみた1(Vivado HLS編)

FPGA+SoC+Linux実践勉強会”でZYBO Z7 を使用し、Vivado HLS でDMA IPを作成して、Vivado で回路にして、SDK でベアメタル・アプリケーションでDMA IP を動作させようとしたら動作しなかった。
そこで、DMA IP を仕上げてデバイツリー・オーバーレイやudmabuf などを確かめてみよう。

まずは、Vivado HLS 2017.3 でDMA_pow プロジェクトを作成した。
FPGA-SoC-Linux4ZYBO_Z7_16_171206.png

DMA_pow.c を貼っておく。in を2乗して out に出力するコードだ。

int DMA_pow2(volatile int *in, volatile int *out){
#pragma HLS INTERFACE m_axi depth=10 port=out offset=slave
#pragma HLS INTERFACE m_axi depth=10 port=in offset=slave
#pragma HLS INTERFACE s_axilite port=return
    int i;

    for (i=0; i<10; i++){
        out[i] =in[i] * in[i];
    }

    return(0);
}


これで、AXI4 Master のDMA IP を生成できる。

テストベンチのDMA_pow_tb.c を貼っておく。

int DMA_pow2(volatile int *in, volatile int *out);

int main(){
    int data[10] = {0123456789};
    int result[10];
    int i;

    DMA_pow2(data, result);

    for(i=0; i<10; i++){
        printf("data[%d] = %d, result[%d] = %d\n", i, data[i], i, result[i]);
    }
}


最初にC シミュレーションを行った。結果を示す。
FPGA-SoC-Linux4ZYBO_Z7_17_171206.png

次にC コードの合成を行った。結果を示す。
FPGA-SoC-Linux4ZYBO_Z7_18_171206.png

レイテンシは 126 クロックだった。BRAMは 2 個、DSP は 3 個使用している。

C/RTL コシミュレーションを行った。結果を示す。
FPGA-SoC-Linux4ZYBO_Z7_19_171206.png

C/RTL コシミュレーションでのレイテンシは 235 クロックだった。

C/RTL コシミュレーションの波形を示す。
FPGA-SoC-Linux4ZYBO_Z7_20_171206.png
FPGA-SoC-Linux4ZYBO_Z7_21_171206.png

m_axi_gmem_RDATA[31:0] が入力データなので、これを 2 乗したデータが m_axi_gmem_WDATA[31:0] に出力されているのが分かる。
m_axi_gmem_RVALID を見ると 2 つ並んで 1 になっているのが分かると思う。これは、

out[i] =in[i] * in[i];

で in[i] が 2 回 Read されているが、それがそのまま実装されているのだ。

Export RTL を行った。Vivado synthesis, place and route にチェックを入れた。
結果を示す。
FPGA-SoC-Linux4ZYBO_Z7_22_171206.png

AXI4 Master とAXI4 Lite Slave インターフェースが実装されているので、結構リソースは消費している。
C:\Users\masaaki\Documents\Vivado_HLS\test\DMA_pow\solution1\impl\ip の内容を示す。
FPGA-SoC-Linux4ZYBO_Z7_27_171206.png

xilinx_com_hls_DMA_pow2_1_0.zip にIP が圧縮されている。
  1. 2017年12月06日 04:42 |
  2. ZYBO Z7
  3. | トラックバック:0
  4. | コメント:0