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 を変更することができるかどうか?を確かめる。

inserted by FC2 system