”
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 に変更した。

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

ブロック・デザインを示す。

Address Editor 画面を示す。

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


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

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

Vivado Analyzer の波形を示す。
Read 波形を示す。

Write 波形を示す。

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

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

こちらも 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”に変更した。

これで、論理合成、インプリメント、ビットストリームの生成を行って、成功した。
ハードウェアをエクスポートして、SDK を立ち上げた。

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

Vivado Analyzer でAXI4 Master の波形を取ってみたので貼っておく。
Read

Write

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