Zynq

 ZedBoard Zynq™-7000 Development Board  
ZedBoard Zynq™-7000 Development Board の情報がDegilentに出てました。

 Zynq- 7000(ZC702)のチュートリアルをやってみた1(PlanAheadプロジェクト、XPS)
Zynq -7000シリーズのxc7z020clg484-1を使用したZC702ボードを残念ながら持ってはいないのだが、チュートリアルの”Zynq- 7000 EPP Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design UG873 (v14.1) May 31, 2012”を見つけたので、実機で試す部分を抜いて、やってみることにした。XPSプロジェクトが出来るとこまで。
 Zynq- 7000(ZC702)のチュートリアルをやってみた2(XPS、SDK) 
XPSプロジェクトを設定してSDKを起動
 Zynq- 7000(ZC702)のチュートリアルをやってみた3(実機でテスト)
ツイッターでお世話になっているykazu1998さんからZC702ボードをお借りすること が出来たので、チュートリアルの続きをやってみたいと思う。まずはチュートリアル1から実機でテストした。Hello World を表示することが出来た。

 Zynq- 7000(ZC702)のチュートリアル2をやってみた1(XPSプロジェクトの生成) 
今 回はチュートリアルの”Zynq-7000 EPP Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design UG873 (v14.1) May 31, 2012”の19ページからの”Embedded System Design Using the Zynq Processing System and Programmable Logic”チュートリアルをやってみることにした。Programmable Logic (PL) 領域を使用して、XPSでIPを繋いで、Processing System (PS) と接続して動作させるチュートリアルだ。
 Zynq- 7000(ZC702)のチュートリアル2をやってみた2(IPの接続)
AXI General Purpose IO IPを追加した。
 Zynq- 7000(ZC702)のチュートリアル2をやってみた3(PSの設定、インプリメント)
プロセッシング システム (PS) の設定とインプリメント
 Zynq- 7000(ZC702)のチュートリアル2をやってみた4(実機でテストの準備)
SDKで設定を行った。チュートリアルの47ページ、”Application Software”の概要を要約した。
 Zynq- 7000(ZC702)のチュートリアル2をやってみた5(実機でテスト)
実機でテストしたらうまく行った。PSとPLを連帯させて実機テストを行った。
 Zynq- 7000(ZC702)のチュートリアル2をやってみた6(SDKデバック)
今 度は、”Zynq-7000 EPP Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design UG873 (v14.1) May 31, 2012”の29ページ、Chapter 4 Debugging with SDK and ChipScope をやってみた。SDKによるソフトウェアのデバックのやり方。
 Zynq- 7000(ZC702)のチュートリアル2をやってみた7(ChipScopeによるデバック)
”Zynq-7000 EPP Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design UG873 (v14.1) May 31, 2012”の31ページ、”4.2 Take a Test Drive! Debugging Hardware Using ChipScope Software”をやってみた。ChipScopeを使用したデバック。” Zynq- 7000(ZC702)のチュートリアル2をやってみた2(IPの接続)”の時点で ChipScope AXI Monitor が追加されている。
 Zynq- 7000(ZC702)のチュートリアル2のXPSでのZynqの設定
Zynq- 7000(ZC702)のチュートリアル2をやってみた5(実機でテスト)”でSW5やSW7をプッシュすることでDS23(LED) を消灯、点灯させたが、その時のXPS上でのZynqの設定を見てみることにした。

 Zynq- 7000(ZC702)のLinuxチュートリアルの勉強
今 回は、”Zynq-7000 EPP Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design UG873 (v14.1) May 31, 2012”の34ページ、”Linux Booting and Application Debugging Using SDK”を見ていくことにする。チュートリアルを読んで、覚書を書いた。
 Zynq- 7000(ZC702)のLinuxチュートリアル1(Slave Boot Method)
”Zynq-7000 EPP Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design UG873 (v14.1) May 31, 2012”の37ページ、”5.2.3 Take a Test Drive! Linux Booting Using JTAG Mode”をやってみた。
Zynqをコンフィグして、XMDプロンプトからLinuxのブートイメージなどをDRAMにロードしてブートしようとしたが、ブートできなかった。
 Zynq- 7000(ZC702)のLinuxチュートリアル2(Master Boot Method、SDカード)
”Zynq-7000 EPP Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design UG873 (v14.1) May 31, 2012”の45ページ、”5.2.6 Take a Test Drive! Booting Linux From the SD Card”をやってみた。SDカードからならLinuxをブートすることが出来た。
 Zynq- 7000(ZC702)のLinuxチュートリアル3(リモートデバック)
”Zynq-7000 EPP Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design UG873 (v14.1) May 31, 2012”の39ページ、”5.2.4 Take a Test Drive! Debugging the Linux Application Using SDK Remote Debugging”をやってみた。Windowsのパソコン上のSDKから、LANで接続されたZC702ボードにリモートで実行ファイルをロードして デバックを行った。
 Zynq- 7000(ZC702)のLinuxチュートリアル4(リモートデバック2) 
前 回、Zynqで起動しているLinuxにSSHを使用して、パソコンのSDK からリモートデバックを行った。これは、フォルダと実行ファイルのスケルトンを作っておいて、SDKから実行ファイルをZynqのLinuxに送って実行 させでバックしているのだと思う。よって、ZC702ボードの電源を切ってしまうと、Linuxに作成したフォルダ (Apps) と実行ファイルのスケルトンが消えてしまう。次にZC702ボードの電源を入れた際には、Linuxに作成したフォルダ (Apps) と実行ファイルのスケルトンを作ってデバックする必要がある。その辺のことを書いてみようと思う。
 Zynq- 7000(ZC702)でビットファイル入りのLinuxのブートイメージが入ったSDカードを作る 
”Zynq-7000 EPP Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design UG873 (v14.1) May 31, 2012”の45ページ、”5.2.6 Take a Test Drive! Booting Linux From the SD Card”をやってみたが、Linuxのブートイメージだけでなく、チュートリアル2のビットファイルをSDカードのブートイメージに追加してみた。
 Zynq- 7000(ZC702)のLinuxでMIOに接続されているLEDを制御
ZC702のLinuxを立ち上げた状態で、”Zynq- 7000(ZC702)のLinuxチュートリアル3(リモートデバック)”でやってきたSDKのリモートデバックを使用して、 DS23(LED)を制御してみた。
 Zynq- 7000(ZC702)のLinuxでMIOに接続されているLEDを制御2 
前回はDS23(LED) をLinuxで制御したが、今回はAXI GPIOに接続されたSW5を押した時にDS23(LED) を点灯させて、その後消灯させてみようと思う。これが出来れば、”Zynq- 7000(ZC702)でビットファイル入りのLinuxのブートイメージが入ったSDカードを作る”で作ったビットファイル入りのLinux ブートイメージで間違いなくビットファイルをコンフィギュレーションしていることがわかった。

ZedBoardで Linuxが動作した
ZedBoardが届いたので、ZedBoardでLinuxを起動してみた。すでにSDカー ドが付属していてLinuxのブートイメージが書いてあったので、電源ONしただけで行けると思ったのだが、そのままではLinuxをブートすることができな かった。

 Zynqの勉強 1
Zynqのチュートリアルはやってきたが、Zynqのことをあまり勉強していなかったので、勉 強しようと思う。プロセッシング システム (PS)とプログラマブル ロジック (PL)の概要。

カメラの表示回路及びソフト ウェアをSDカードからブートする
カメラ回路と制御するソフトウェアをSDカードからブートして動作させる方法。

Zynq勉強会1日目
今日は、Zynq勉強会を開催しました。15人程度の参加がありました。
午前中は、1_Zynq-7000の概要.pdf、2_Zynq用ツール概要です。
午後は、Zynqチュートリアルを皆で一緒にライブコーディングしました。
Zynq勉強会2日目
Zynq勉強会の2日目が終了しました。
午前中に、XPSプロジェクトでカスタムIPを作る方法とAXI4 バス説明をしてました。
午後には、AXI4バスを使用したカスタムIPの作成方法を説明してから、演習1と演習2をやりました。
ZynqのAXI_ACP ポートとAXI_HPポートの性能の違い1(AXI_ACPポート)
ZynqのAXI_ACPポートとAXI_HPポートの性能の違いを確かめてみることにした。
ここでは、ビットマップ・ディスプレイ・コントローラIPを使用して、AXI_ACPポートとAXI_HPポートでピクセル・データをそれぞれReadして、 そのAXIバスの様子をChipScopeで観察するという方法で比較する。
最初にACPポートの性能を測定した。
ZynqのAXI_ACP ポートとAXI_HPポートの性能の違い2(AXI_HPポート)
前回は、AXI_ACPポートを使って、ビットマップ・ディスプレイ・コントローラIPを使用 して、AXI_ACPポートからピクセル・データをReadするのをChipScope Proで観察するという方法で性能を見た。今回は、AXI_HP0 ポートを使用して同様に性能を見た。

OSERDESE2のRST
7シリーズのFPGAに使用されているOSERDESE2のRST端子は、CLKと CLKDIVに対して、1にする場合は非同期だが、0にする場合はCLKDIVに対して同期して0にする必要がある。どちらのエッジも非同期だと出力は不定 だ。

Zynqチップにヒートシン クを付けた
ZYBOとREV.C のZedBoardはZynqチップにヒートシンクが付いていないので、Linuxを動作させたりすると、かなり発熱して心配です。
それで、あまり効果が無いかもしれませんが、アイネックス チップ用マルチヒートシンク HM-19Aを注文して、今日来たので付けてみました。効果は少しはあると思います。なお、貼付け用の両面テープも入っているので、これだけ買えばOKです。

ZynqのSIMDエンジン NEONについての資料
ZynqにはARMのCortex-A9 プロセッサがDualで入っているが、NEONというSIMDエンジンが搭載されている。NEONについて調査した。
gcc の最適化と自動ベクトル化を使用した時の性能
”ZynqのSIMDエンジンNEONについての資料”の続きというか、その資料を参考にして 自動ベクトル化を行う gcc のオプションを使用してラプラシアンフィルタをコンパイルし、その性能を確認した。
gcc の最適化と自動ベクトル化を使用した時の性能2
”gcc の最適化とNEON 最適化ライブラリを使用した時の性能”の時は、gcc 4.6 でコンパイルしていたが、今回は gcc 4.8 にアップグレードして同様にラプラシアンフィルタの異なるソフトウェアをコンパイルして実行時間を比較してみた。
gcc の最適化と自動ベクトル化を使用した時の性能3
前回は gcc 4.8 の時のコンパイル・オプションやNEON 最適化ライブラリを使用するためのコンパイラ・オプションを使った時の性能差を表にまとめた。
今回は、NEON最適化ライブラリを使用するコンパイラ・オプションを付けた時に本当のNEONを使用するアセンブラ・コードが出ているかを検証する。
clang の最適化と自動ベクトル化を使用した時の性能
clang-3.4 + llvm-3.4 でC がコンパイルできるようになったので、clang の最適化オプションや自動ベクトル化・オプションを付けてコンパイルした時にどのくらいの性能向上があるのかを検証した。
gcc と clang で -Ofast 最適化オプションを付けた場合の実行速度
gcc-4.6, gcc-4.8, clang-3.4 とコンパイル時の最適化オプションによる速度の違いを検証してきた。
今回は、最適化オプションの -Ofast を gcc-4.6, gcc-4.8, clang-3.4 で試してみた。
OpenMPでのラプラシア ンフィルタの実行速度
今まで、NEON命令を使ってラプラシアンフィルタの実行速度を測ってきたが、今回は OpenMPを使って、高速化してみよう。
OpenMPとは複数のプロセッサを使ったマルチスレッディングを行うための API だそうだ。
ラプラシアンフィルタ処理結果がおかしくなった。
OpenMPでのラプラシア ンフィルタの実行速度2
Vengineer さんからツイッターで、”forループ内のローカル変数をプラグマ内で定義しないと、おかしくなりますよ”とのアドバイスを頂いた。調べてみると、”#pragma omp parallel for”の後に”private(list)”を付ける必要があるようだ。
” C言語による OpenMP 入門 ”の12ページ、”5.1 private(list) ”を参照すると、各スレッドで独自の変数値を持つためには、private 指示子が必要なようだ。
それでも、まだ、ラプラシアンフィルタ処理結果はおかしい。
OpenMPでのラプラシア ンフィルタの実行速度3
前回は、laplacian_fiter1 と laplacian_fiter2 のOpenMP を使うようにコンパイルして、実行した結果をブログに書いた。今回は、laplacian_fiter3 と laplacian_fiter4 をやってみた。
新しいラプラシアンフィルタ のソフトウェア実装
OpenMPを使ったラプラシアンフィルタの動作がおかしいという現象があった。ブログのコメ ント欄でも教えてもらったのだが、OpenMPのプラグマを書いた for 文のどの順に実行されるかわからない?ということで、元のラプラシアンフィルタをよりシンプルにしてみた。
laplacian_filter8.c は真ん中に線が入ってしまったが、その他は正常なラプラシアンフィルタ処理結果となった。
gcc-4.8 の OpenMP、-O3、laplacian_filter8.c で最速値 72.5 ms が計測できた。まだ、laplacian_filter8.c は結果がおかしいが最速値を計測することができた。一方、ラプラシアンフィルタの実行に関しては、1 core 使用した時と、2 core 使用した時では、あまり速度差が無いと言える。

ikwzm さんの fclkcfg による Zynq のPS の fclk の設定
前回は、デバイスツリー・ソース・ファイルを書いて、ビットストリームのFPGAへのロードや UIO の設定、udmabuf のロード、fclk の設定を行ったが、fclk の設定値が想定していた値と違ってしまった。
これは、ikwzm さんにお聞きしたところ、fclk1 などのClock Source が違っていたからということだった。Clock Source には、ARMPLL、DDRPLL、IOPLL の3種類あるが、どれを選ぶかで、周波数の設定値に対して、実際の値の偏差が発生するかどうか?が決まる。
このfclkcfg のバージョンでは、デバイスツリーのロード時にClock Source を変更することはできないので、u-boot 時にClock Source を変更するということだ。なお、現在のfclkcfg (fclkcfg-4.14.34-armv7-fpga_1.1.0-1_armhf.deb)では、デバイスツリーにClock Source を書くことができるので、後でやってみよう。
ikwzm さんの fclkcfg による Zynq のPS の fclk の設定2
前回は、ZYBO_BOOT つまり、ブート用のFAT32 フォーマットのMicro SD カードのパーティションで、uEnv.txt (u-boot の設定ファイル)を編集して、各 fclk の Clock Source を設定した。そのため、デバイスツリーで fclk を設定したときに正しい値を設定することができた。
今回は、新しく ikwzm さんにバージョンアップして頂いた新しい fclkcfg (fclkcfg-4.14.34-armv7-fpga_1.1.0-1_armhf.deb)を使用して、デバイスツリーから Clock Source を変更することができるかどうか?を確かめる。

Zynq のベアメタル・アプリケーションによるキャッシュの操作1(説明編)
今日から筑波大学で 2020 年度の Vivado HLS セミナを始めるが、その教材の一部をご紹介する。
それは、Zynq ( Cortex-A9 プロセッサと FPGA が搭載されているチップ)のキャッシュにかかわる動作についてだ。
今日はその説明で、キャッシュによる不具合をスライドで説明する。
Zynq のベアメタル・アプリケーションによるキャッシュの操作2(Xil_DCacheFlush())
前回は、Zynq ( Cortex-A9 プロセッサと FPGA が搭載されているチップ)のキャッシュにかかわる動作について、キャッシュによる不具合をスライドで説明した。今回は、実際に Vivado HLS 2019.2 で AXI4 Master インターフェースを持つ 2乗 IP を作成して、Vivado 2019.2 で 2乗 IP を Add IP して回路を作成する。その回路のビットストリームを作成し、XSA ファイルを出力してから Vitis 2019.2 を起動して、プラットフォームとアプリケーション・プロジェクトを作成する。アプリケーション・プロジェクトで作成された elf ファイルを実行してみよう。キャッシュの操作が無いとデータがおかしくなるが、Xil_DCacheFlush() を入れると正常になる。
Zynq のベアメタル・アプリケーションによるキャッシュの操作2(ACPポート)
前回は、 Vivado HLS 2019.2 で AXI4 Master インターフェースを持つ 2乗 IP を作成して、Vivado 2019.2 で 2乗 IP を Add IP して回路を作成する。その回路のビットストリームを作成し、XSA ファイルを出力してから Vitis 2019.2 を起動して、プラットフォームとアプリケーション・プロジェクトを作成する。アプリケーション・プロジェクトで作成された elf ファイルを実行してみよう。キャッシュの操作が無いとデータがおかしくなるが、Xil_DCacheFlush() を入れると正常になった。今回は同様の回路を使用するが、AXI_ACP ポートを使用して、キャッシュに書けるようにし、キャッシュ・フラッシュ関数(Xil_DCacheFlush())を呼ばなくても正常に表示できるかを確かめてみよう。
Zynq のベアメタル・アプリケーションによるキャッシュの操作3(Vitis でのキャッシュ操作について)
前回までは、Vivado HLS 2019.2 で AXI4 Master インターフェースを持つ 2乗 IP を作成して、Vivado 2019.2 で 2乗 IP を Add IP して回路を作成した。AXI_ACP ポートを使用して、キャッシュに書けるようにし、キャッシュ・フラッシュ関数(Xil_DCacheFlush())を呼ばなくても正常に表示できるかを確かめてみたとこ ろ、結果を収納する配列を初期化していると、うまく行かなかった。今回は、Zynq のキャッシュの振る舞いについて、更に調べてみよう。

”FPGAプログラミング大全 Xilinx編 第2版”の”5-4 タイマー割り込みとAPIの利用”をやってみる1
小林さんから”FPGAプログラミング大全 Xilinx編 第2版”をいただいた。
その中から私が意図的に使ってこなかった Zynq の割り込みをやってみようと思う。具体的には”5-4 タイマー割り込みとAPIの利用”をやってみようと思う。
まずは、”FPGAプログラミング大全 Xilinx編 第2版”のサンプルをやってみるということで、ブロック・デザインを作成した。
”FPGAプログラミング大全 Xilinx編 第2版”の”5-4 タイマー割り込みとAPIの利用”をやってみる2
”FPGAプログラミング大全 Xilinx編 第2版”の”5-4 タイマー割り込みとAPIの利用”をやってみるということで、前回は、Vivado 2020.2 の second プロジェクトを作成して、ブロックデザインを完成させた。今回は、ラッパー Verilog HDL ファイルのトップファイルを生成し、制約ファイルを追加して、論理合成、インプリメンテーション、ビットストリームの生成を行う。そして、ハードウェアをエクスポートし、 XSA ファイルを生成した。
”FPGAプログラミング大全 Xilinx編 第2版”の”5-4 タイマー割り込みとAPIの利用”をやってみる3
前回は、ラッパー Verilog HDL ファイルのトップファイルを生成し、制約ファイルを追加して、論理合成、インプリメンテーション、ビットストリームの生成を行う。そして、ハードウェアをエクスポートし、 XSA ファイルを生成した。今回は、Vitis 2020.2 を立ち上げて、プラットフォームとアプリケーション・プロジェクトを作成して、ZYBO Z7-10 で実機検証を行って、成功した。

Zynq で PL から PS に割り込みを掛ける1
”FPGAプログラミング大全 Xilinx編 第2版”の”5-4 タイマー割り込みとAPIの利用”の second プロジェクトを改造して、プッシュボタンスイッチを押した時に割り込みを掛けて RGB LED のON/OFF 制御をしてみよう。
今回は、Zynq 割り込みコントローラを構造を確認して、 Xilinx のライブラリを使用した設定方法を見ていこう。
Zynq で PL から PS に割り込みを掛ける2
”FPGAプログラミング大全 Xilinx編 第2版”の”5-4 タイマー割り込みとAPIの利用”の second プロジェクトを改造して、プッシュボタンスイッチを押した時に割り込みを掛けて RGB LED のON/OFF 制御をしてみようということで、前回は、前振りとして、PL から PS への割り込み方法について調査した。今回は、 second プロジェクトのブロックデザインに押しボタンスイッチによって PL から PS への割り込みを追加する。
Zynq で PL から PS に割り込みを掛ける3
前回は、 second プロジェクトのブロックデザインに押しボタンスイッチによって PL から PS への割り込みを追加して、動作を確認することができた。今回は、”Zynq で PL から PS に割り込みを掛ける1”で、 IRQ_F2P 割り込みはレベル割り込みとエッジ割り込みの 2 種類から選べるはずだが、どちらになっているか?を確認してみよう。

Zynq のベアメタル・アプリケーションによるキャッシュの操作3(ACPポート2)
”Zynq のベアメタル・アプリケーションによるキャッシュの操作2(ACPポート)”で ACP ポートのキャッシュ・コヒーレンシがうまく行ってないようだったが、今回、HDLabで開催する予定の Zynq + Vivado HLS セミナの例題を作っていて、同じ結果になってしまった。そこで、 ACP ポートを使用して、キャッシュ・コヒーレンシを取れる DMA を使用するために調査した。Vivado HLS と Vivado のバージョンは 2019.2 です。



inserted by FC2 system