ZYBO

ZYBOが届いた
昨日、ZYBOが届いた。ZYBO は Zynq の Z-7010が搭載されたボードだ。

ZYBO用LEDテストプロ ジェクト1(プロジェクト作製)
ZYBO はDigilent社の新しい Zynq-7010 のボードだ。Digilent社のZYBOのWebサイトには、リファレンス・デザインもまだ載っていないが、LEDをテストするテストプロジェクトを作ってみようと思 う。プロジェクトとしては、ZedBoard用に作ってあって、Zynq勉強会の1番目の AXI Lite Slave カスタムIPを作る課題用のプロジェクトとして使用している。それをZYBO用に変更してみようと思う。ZedBoardはLEDを8ビット分持っていたが、ZYBOは4 ビット分のLEDしか無いので、そこを変更する。
ZYBO用LEDテストプロ ジェクト2(単体シミュレーション)
自作の AXI4 Lite Master BFM を使用してシミュレーションを行った。
ZYBO用LEDテストプロ ジェクト3(インプリメント)
今回は、XPSプロジェクトを完成させて、Project Navigator でインプリメントを行った。
ZYBO用LEDテストプロ ジェクト4(実機でテスト)
実機テストを行って成功した。実機テストのやり方を詳しく書いた。

VivadoでZYBO用 LEDテストプロジェクト1(単体テスト)
ISEでZYBO用LEDテストプロジェクトを作製した。今度はVivado 2013.4でZYBO用LEDテストプロジェクトを作ってみようと思う。最初にled4_axi_lite_slave の単体テストから行う。
VivadoでZYBO用 LEDテストプロジェクト2(プロジェクト作製、ビットストリーム生成まで)
やっと、Vivado 2013.4でZYBO用LEDテストプロジェクトが動いたので、ブログに書くことにする。ビットストリームの生成まで成功した。
VivadoでZYBO用 LEDテストプロジェクト3(SDK、実機テスト)
前回、Vivado 2013.4のプロジェクトを作製するところから、ビットストリームの生成まで行った。今回は、ハードウェアをエクスポートして、SDKを立ちあげ実機テストを行った。
実機テストのやり方を詳しく書いた。

ZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IP1(単体テスト)
ZYBOにAXI4 Slaveバス対応のキャラクタ・ディスプレイ・コントローラを付けて、HDMI端子とVGA端子から出力を出してみようという企画だ。単体シミュレーションを行っ た。
ZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IP2(完成)
前回、ZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IPの単体シミュレーションが終了したので、今度は、実際にIPを実装してZYBO実機で確かめた。SVGA解像度では完成した。
ZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IP3(SVGA以外の解像度)
前回はSVGAでHDMIポート、VGAポートとも表示に成功した。今回は、VGAとXGA、 SXGA解像度で表示できるかどうかを確かめてみた。
結果として、VGA解像度では、HDMIポート、VGAポート両方共表示することが出来たが、XGA、SXGA解像度では、VGAポートは問題なく表示するこ とが出来たが、HDMIポートは表示はできているのだが、動作が不安定だった。表示はされているが、ぱっと消える時がある。これは周期的に消える。
いろいろとできることをやってみたが、うまく行かなかった。
ZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IP4(BUFIO, BUFR)
Digilent社のSpartan-6 ボード、Atlysボード用のHDMIをサポートするDigilent社製のVHDLコードを自分で修正して、ZYBOで、キャラクタ・ディスプレイ・コントローラの出力 をHDMIとVGAに出力していた。しかし、BUFGのみを使用したHDMI出力では、VGAとSVGA しか出力することが出来なかった。(”ZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IP3(SVGA以外の解像度)”参照)それを、BUFIO と BUFR に対応させることにした。
インプリメントを行ったところ、やはり同様にエラーが出てしまった。PLLをMMCMに変更す ることにした。
ZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IP5(MMCM)
PLLの代わりにMMCMを使用した。インプリメントとビットストリームの生成が成功した。こ れでOKのようだ。
ZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IP6(ぱっと消えてしまうことがある)
ZYBOで実機で試してみたところ、”ZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IP3(SVGA以外の解像度)”と同様に、XGAやSXGA解像度で試すと、画像が消えてしまうことがある。ぱっと消えて、また表示されるを繰り返している。前回同様に SVGA解像度では問題ない。
いろいろとやってみたが、原因がわからない?

ZYBO用キャラクタ・ディ スプレイ・コントローラ IPの単体テスト(VGAポート専用)
ZYBO用にVGAポート出力のみのキャラクタ・ディスプレイ・コントローラ IPを作っている。Githubで公開した。
以前のZYBOのキャラクタ・ディスプレイ・コントローラ IPは、”AXI4 Slave キャラクタ・ディスプレイ・コントローラ IP2(完成)”で完成したが、SVGA解像度のみで、VGAポートとHDMIポートに出力することができた。但し、HDMIは出力周波数が高いために、XGA解像度以上 だとBUFGが対応せずに動作が不安定だった。そこで、HDMIポートを削除して、XPSプロジェクトのAdd IPダイアログで、VGA, SVGA, XGA, SXGA, HD解像度を切り替えられるように変更した。だ。
単体シミュレーションが成功した。
ZYBO用キャラクタ・ディ スプレイ・コントローラ1(VGAポート専用)
ISE14.7でプロジェクトを作製し、その中にXPSプロジェクトを作製する。更に、VGA ポート専用のZYBO用キャラクタ・ディスプレイ・コントローラ IPをAdd IPして、キャラクタ・ディスプレイ・コントローラを作製した。SVGAの表示に成功した。
ZYBO用キャラクタ・ディ スプレイ・コントローラ2(VGAポート専用)
今回は残りのVGA, XGA, SXGA, HD解像度でキャラクタをディスプレイに表示した。
VGAポート専用のZYBO 用キャラクタ・ディスプレイ・コントローラのプロジェクトの公開
今まで作ってきた、VGAポート専用のZYBO用キャラクタ・ディスプレイ・コントローラのプ ロジェクトをGitHubで公開しました。

ZYBO用LEDテストプロ ジェクトの試し方(Vivado 2013.4使用)
ZYBO用のLEDテスト・プロジェクトを作ってGithub にアップロードしておきました。その使い方と注意点を書いておくことにします。

ZYBO Base System Design(ISE14.7版)
DigilentのZYBOサイトから ZYBO Base System Design をダウンロードして、とりあえずはISE14.7 でやってみた。
HD画面を表示することができた。驚きだ。
ZYBO Base System Design(Vivado 2014.1版)
今回は、ZYBO Base System Design の Vivado 版をやってみることにした。本来は、Vivado 2013.4のプロジェクトなのだ、がVivado 2014.1に変換してやってみた。IPはアップグレードした。

ZYBOでXillinux を起動してみる
Ryuzのブログさんの”ZYBO(Zynq)のLinux(Xillinux起動)”の記事 を見ると、ZYBOでXillinuxが簡単に起動できたということなので、やってみることにした。
ZYBOにOpenCV 2.4.6.1をインストール
XillinuxはUbuntuなので、OpenCVをインストール出来るのでは?ということ でインストールしてみた。
Xillinuxに新しい ユーザー zybo を追加
”ZYBOにOpenCV 2.4.6.1をインストール”でZybo のXillinux にOpenCV 2.4.6.1 をインストールしたのですが、これは、root でやっていました。どうも root でコマンドを実行しているとあまり気持ちよく無いので、zybo というユーザーを作ることにしました。パスワードは同じく zybo です。

VivadoでZYBOの AXI4 Slave キャラクタ・ディスプレイ・コントローラ IP1(新規プロジェクトの生成)
”ZYBO用キャラクタ・ディスプレイ・コントローラ IPの単体テスト(VGAポート専用)”のVivado 2014.1版を作ろうと思う。Vivado 2014.1 のチュートリアルをかねようとしているので、丁寧に図をキャプチャして書くつもりだ。
VivadoでZYBOの AXI4 Slave キャラクタ・ディスプレイ・コントローラ IP2(FIFOの生成)
前回はプロジェクトを作るところまでだったが、今回はFIFOを生成する。
VivadoでZYBOの AXI4 Slave キャラクタ・ディスプレイ・コントローラ IP3(単体シミュレーション)
今回は、OVL(Open Verification Library)を使用した単体シミュレーションを行う。
VivadoでZYBOの AXI4 Slave キャラクタ・ディスプレイ・コントローラ IP4(IP化)
単体シミュレーションが終了したZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラをIPにする。
VivadoでZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ1(新規プロジェクトの作製)
”VivadoでZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラ IP4(IP化)”で、ZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラの IP化が終了したので、今回はZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラの回路全体を作製する。
Vivado 2014.1を使用して、IPにした ZYBOのAXI4 Slave キャラクタ・ディスプレイ・コントローラをインスタンスして、動作する様に、他のIPもインスタンスし、回路全体を構成する。
なお、Vivado 2014.1のチュートリアルとしても使用できるように、1つ1つの手順を図入りで紹介する。
VivadoでZYBOの AXI4 Slave キャラクタ・ディスプレイ・コントローラ2(IPリポジトリへの追加)
VivadoでZYBOの AXI4 Slave キャラクタ・ディスプレイ・コントローラ3(PSのインポートと設定)
VivadoでZYBOの AXI4 Slave キャラクタ・ディスプレイ・コントローラ4(PS以外のブロックデザイン)
VivadoでZYBOの AXI4 Slave キャラクタ・ディスプレイ・コントローラ5(ブロック・デザインの生成)
VivadoでZYBOの AXI4 Slave キャラクタ・ディスプレイ・コントローラ6(ブロック・デザインのデバック)
ブロック・デザインの生成でエラーがでているので、デバックをしていた。日曜日の1日中いろい ろなことを試したが、やっとわかってきたと思うので、ブログに書いておく。
因みに、プロジェクト名を短くしないとWinodwsのパス名260文字問題に引っかかってしまうので、プロジェクトを作りなおした。
うまく行った。
VivadoでZYBOの AXI4 Slave キャラクタ・ディスプレイ・コントローラ7(配置制約の生成)
前回、ブロック・デザインが終了して、ラッパー Verilog HDLファイルを作製した。今回は、論理合成し、出力端子の出力レベルと配置を制約した。
VivadoでZYBOの AXI4 Slave キャラクタ・ディスプレイ・コントローラ8(インプリメント)
インプリメントを行い、成功した。
VivadoでZYBOの AXI4 Slave キャラクタ・ディスプレイ・コントローラ9(SDK、実機テスト)
実機テストは成功した。
VivadoでZYBOの AXI4 Slave キャラクタ・ディスプレイ・コントローラ10(VHDLソース)
VivadoでZYBOの AXI4 Slave キャラクタ・ディスプレイ・コントローラ11(Verilog HDLソース1)
VivadoでZYBOの AXI4 Slave キャラクタ・ディスプレイ・コントローラ12(Verilog HDLソース2)
VivadoでZYBOの AXI4 Slave キャラクタ・ディスプレイ・コントローラ13(Verilog HDLソース3)

ZYBOにビットマップ・ ディスプレイ・コントローラを追加する1(仕様)
ZYBOにビットマップ・ディスプレイ・コントローラを追加しようと思う。ZedBoard用 のビットマップ・ディスプレイ・コントローラがすでにあるので、移植するということになる。

ZYBO用ビットマップ・ ディスプレイ・コントローラIP1(プロジェクト生成とFIFO生成)
ZYBO用のビットマップ・ディスプレイ・コントローラIPを作ることにした。
ZedBoard用のビットマップ・ディスプレイ・コントローラ(BMDC)は作ってあるので、それを改造することにした。ZedBoard用のBMDCは、 アナデバのHDMI出力用IC ADV7511 がHDMIを出力しているので、それ用のフォーマットに変換して出力していたが、ZYBOはZynqから直接HDMI信号を出力する。
ZYBO用ビットマップ・ ディスプレイ・コントローラIP2(シミュレーション1)
前回、プロジェクトを生成して、FIFOも生成した。今回は、テストベンチを作製してシミュ レーションを行う。
ZYBO用ビットマップ・ ディスプレイ・コントローラIP3(シミュレーション2)
前回は、シミュレーションを始めることができたので、今回はビットマップ・ディスプレイ・コン トローラの動作を確認した。
ZYBO用ビットマップ・ ディスプレイ・コントローラIP4(IP化)
前回、単体シミュレーションを行ったので、今回は、ZYBO用ビットマップ・ディスプレイ・コ ントローラのIP化を行った。

ZYBO用ビットマップ・ ディスプレイ・コントローラの作製1(ブロック・デザイン1)
”ZYBO用ビットマップ・ディスプレイ・コントローラIP4(IP化)”で、ZYBO用ビッ トマップ・ディスプレイ・コントローラのIP化が完成した。
次は、ZYBO用ビットマップ・ディスプレイ・コントローラIPを使用して、ZYBOのビットマップ・ディスプレイ・コントローラを作製する。まずは、IP Integrator を使用して、ブロック・デザインを作製する。
ZYBO用ビットマップ・ ディスプレイ・コントローラの作製2(ブロック・デザイン2)
ZYBO用ビットマップ・ ディスプレイ・コントローラの作製3(ブロック・デザイン3)
IP Integrator のブロック・デザインを引き続き作っている。
ZYBO用ビットマップ・ ディスプレイ・コントローラの作製4(デバック、論理合成)
前回で、ブロック・デザインは出来上がったので、今回は、論理合成と制約の追加を行った。
ZYBO用ビットマップ・ ディスプレイ・コントローラの作製5(制約の生成、インプリメント)
配置制約、タイミング制約を生成して、インプリメントを行った。

VivadoでZYBOの AXI4 Slave キャラクタ・ディスプレイ・コントローラの近況

ZYBO用ビットマップ・ ディスプレイ・コントローラの作製6(実機動作)
BUFRからBUFGを通す方法でXGAまではうまく動作した。

ZYBO用カメラ表示回路の 作製1(準備編)
ZYBOでカメラ表示をしようということで、カメラ表示回路を作ることにした。
恒例のシングル・バッファのフレーム・バッファを使用したカメラ表示回路を作製することにする。
カメラはMT9D111 を使用し、そのインターフェース・ボードとして、ZedBoard 用のカメラ・インターフェース・ボードを使用する。
ZYBO用カメラ・インター フェースIPの作製1(シミュレーション)
、カメラ・インターフェースIPを作成する、と言うか、ZedBoard用がそのまま使えるは ずなので、それをコピーしてVivado 2014.2 のIPとして作製する。但し、pixel_fifo はVivado で作り直す。
ZYBO用カメラ・インター フェースIPの作製2(IP化)
ZYBO用カメラ・インターフェースIPを IP化した。IP化の過程を書いた。

ZYBO用カメラ表示回路の 作製2(プロジェクト、ブロック・デザイン作製)
”ZYBO用カメラ・インターフェースIPの作製2(IP化)”で出来上がった ZYBO用カメラ・インターフェースIP と”ZYBO用ビットマップ・ディスプレイ・コントローラIP4(IP化)”を使用して、カメラ表示回路のブロッ ク・デザインを作製した。
ZYBO用カメラ表示回路の 作製3(インプリメント)
前回で、ブロック・デザインが出来上がったので、今回は、HDLのラッパー・ファイルを生成し て、インプリメントを行った。
ZYBO用カメラ表示回路の 作製4(実機動作)
Vivado 2014.2 を使用してZYBO用カメラ表示回路を作成している。前回はインプリメントまで終了したので、Vivado でハードウェアをエクスポートしてSDKを立ちあげ、実機で動作を試みた。
画面は真っ暗で動作しなかった。
ZYBO用カメラ表示回路の 作製5(デバック1)
前回、出来上がったZYBO用カメラ表示回路を動作させたら、画面が真っ暗だったので、デバッ クを行った。
カメラ・インターフェースの AXI4 Write トランザクションを拡大してみた。BRESPが 3 (Decode Error)になっている。これはおかしい。
ZYBO用カメラ表示回路の 作製6(デバック2、完成)
ビットマップ・ディスプレイ・コントローラのAXI4 Read トランザクションとカメラ・インターフェースのAXI4 Write トランザクションがどちらもDecode Error(RRESP, BRESPが 3)となってしまった。この原因を追求した。
原因が分かって、バグを修正し、画像を表示できた。

ZYBO用の Embedded Linux チュートリアル1(IPのアップグレード)
ZYBO用のLinuxをビルドしようと思う。Digilent社のZYBOのWebページに 置いてあるPDFファイルの”Embedded Linux® Hands-on Tutorial for the ZYBO™”をやってみようと思っている。一旦、チュートリアルをやってから、好みの設定にしてみようと思っている。
ZYBO Base System DesignをVivado 2014.2 で開いたので、IPのアップグレードを行った。
ZYBO用の Embedded Linux チュートリアル2(myLed IPコアの作製1)
myLed IPコアを作り始めた。
ZYBO用の Embedded Linux チュートリアル3(myLed IPコアの作製2)
myLed IPコアが完成した。
ZYBO用の Embedded Linux チュートリアル4(IP追加、インプリメント)
myLed IPコアをブロック・デザインにインスタンスして、デザインを完成させた。インプリメントを行い、成功した。
ZYBO用の Embedded Linux チュートリアル5(U-Bootのビルド)
前回までで、PL部のハードウェアを構築した。今回は、U-Bootをビルドした。
ZYBO用の Embedded Linux チュートリアル6(BOOT.bin の生成)
”Embedded Linux® Hands-on Tutorial for the ZYBO™”の”3 Generate BOOT.BIN”をやってみた。Boot.bin を作製できた。
ZYBO用の Embedded Linux チュートリアル7(Linuxカーネルのビルド)
Digilent Linuxカーネルをビルドした。uImage が作成された。
ZYBO用の Embedded Linux チュートリアル8(DTB、RAMDISK、Linux起動)
DTSをDTCでコンパイルしてDTBを作った。
RAMDISKを用意した。
Digilent Linuxを起動した。
ZYBO用の Embedded Linux チュートリアル9(Frame Buffer)
前回で、ZYBO で Linux が立ち上がった。今回は、横道にそれて、Frame Buffer (FB) を使って、HDMI や VGA に画像を表示できないかやってみた。
FBのアドレスを知ろうして、FBのアドレスをprintk() で表示しようとしたが表示できなかった。
ZYBO用の Embedded Linux チュートリアル10(myLedのドライバの構築とデバイス・ツリーへの追加)
myLedのドライバを生成して、デバイス・ツリーに追加し、コマンドでLEDを点灯させた。
ZYBO用の Embedded Linux チュートリアル11(ユーザー・アプリを実行)
前回、ドライバを作ったので、今回は、ユーザー・アプリケーションを作って、実行した。
ZYBO用の Embedded Linux(root file system をSDカードの第2パーティションへ)
”ZYBO用のEmbedded Linux チュートリアル”をやったのだが、SDカードの第2パーティションにUbuntuのroot file system を書いて、ブート後に使用するようにしたいと思ってやっていたのだが成功しなかった。
ZYBO用の Embedded Linux での u-boot のログ
”ZYBO用のEmbedded Linux(root file system をSDカードの第2パーティションへ)”で、いろいろとエラーは出ているが、SDカードの第2パーティションをRoot File System としてマウント出来たようだ。
ZYBO用Linaro Ubuntuが立ちあがる状態でのu-boot環境変数とLinuxブートメッセージ
Twitter で ikwzm さんに教えてもらった。u-boot のデフォルト環境変数ファイル nEnv.txt をSDカードの第1パーティションにいれた。
ZYBO用Linaro Ubuntuが立ちあがる状態でのu-boot環境変数とLinuxブートメッセージ2
”ZYBO用Linaro Ubuntuが立ちあがる状態でのu-boot環境変数とLinuxブートメッセージ”の修正版です。
uEnv.txt が間違っていので、修正しました。ブートメッセージの違いがよく分かるので、前のバグあり版も残しておきます。
ZYBO用の Embedded Linux をブートするSDカードの作り方
ZYBO用のEmbedded Linux をブートするSDカードの作り方を書いておきます。(重要)
ZYBO用の Linaro Ubuntu のバージョンを 12.11 から14.04 LTS にアップグレード
Linnaro Ubuntu のバージョンを 12.11 から 14.04 LTS にアップグレードした。この時は失敗しましたが、後で成功しました。

AXI4 Lite Slave ポート付きビットマップ・ディスプレイ・コントローラ IP のシミュレーション
”ZYBO用のEmbedded Linux をブートするSDカードの作り方”で出来上がったZYBO用 Linaro Ubuntu で、ビットマップ・ディスプレイ・コントローラをハードウェアで実装して、Ubuntu からキャラクタを表示してみることにした。
ビットマップ・ディスプレイ・コントローラ IP が出来上がったので、シミュレーションをしてみた。
AXI4 Lite Slave ポート付きビットマップ・ディスプレイ・コントローラ IP の IP化
前回は、AXI4 Lite Slave ポート付きビットマップ・ディスプレイ・コントローラ IP を作製して、シミュレーションを行った。今回はIP化を行った。
ZYBO用の Linaro Ubuntu のPL部にビットマップ・ディスプレイ・コントローラを搭載する1(ブロック・デザイン)
”AXI4 Lite Slave ポート付きビットマップ・ディスプレイ・コントローラ IP の IP化”でビットマップ・ディスプレイ・コントローラ (BMDC) IP のフレーム・バッファのスタート・アドレスを AXI4 Lite Slave バス経由で設定できるように変更した。この BMDC IP を ZYBO用の Linaro Ubuntu のPL部に搭載しようと思う。
論理合成まで終了した。
ZYBO用の Linaro Ubuntu のPL部にビットマップ・ディスプレイ・コントローラを搭載する2(インプリメント)
前回、ブロック・デザインが完成し、論理合成まで終了したので、今回は制約ファイルを作製し、 インプリメントを行った。
ZYBO用の Linaro Ubuntu のPL部にビットマップ・ディスプレイ・コントローラを搭載する3(UIOの設定)
SDKで Linux用ソフトウェアを作製する際に必要な設定をするために、DTSを変更する。
UIO (Userspace I/O) を使用するためにLinux のコンフィギュレーションをチェックして、デバイス・ツリーにUIOを追加する。
BOOT.bin を生成した。
ZYBO用の Linaro Ubuntu のPL部にビットマップ・ディスプレイ・コントローラを搭載する4(UIOの設定2)
前回は、、”How to Design and Access a Memory-Mapped Device in Programmable Logic from Linaro Ubuntu Linux on Xilinx Zynq on the ZedBoard, Without Writing a Device Driver — Part Two”だ。参考にする本はコミケ本で、石原ひでみさんの”Hybrid SoC Design Vol 1.0”を参考にしながら、UIO (Userspace I/O) の設定を行った。画像を表示するFrame Buffer (FB) のアドレスの設定もUIOでできないか?と考えたので、今回は引き続き追加で FB 領域をUIOに設定して見たいと思う。
ZYBO用の Linaro Ubuntu のPL部にビットマップ・ディスプレイ・コントローラを搭載する5(UIOの設定3)
UIOをCプログラムを書いて実際に使用する。具体的に何をやるかというと、ZYBOの4つの LEDを点灯させる。
ZYBO用の Linaro Ubuntu のPL部にビットマップ・ディスプレイ・コントローラを搭載する6(UIOの設定4)
UIOに実装した、ビットマップ・ディスプレイ・コントローラの設定レジスタ、キャラクタ・ ジェネレータROM、ビットマップ・ディスプレイ・コントローラのフレーム・バッファ・メモリ全部をテストするCソフトウェアを作製した。
ZYBO用の Linaro Ubuntu のPL部にビットマップ・ディスプレイ・コントローラを搭載する7(ZYBOで動作確認)
UIOのテストを続けてきて、動作の確認ができたので、いよいよ本番のビットマップ・ディスプ レイ・コントローラに意味のある文字を表示させて見るテストをする。前々から使ってきたビットマップ・ディスプレイ・コントローラにキャラクタ・ジェネレータ ROMのキャラクタ・データを表示するテストを行うことにした。
ZYBO用Linuxカーネ ルにCMA領域を確保1
ZYBOのLinuxカーネルに確実にCMA (Continuous Memory Allocator) 領域を確保して、そこにビットマップ・ディスプレイ・コントローラのベースアドレスを置くことにする。Kernel Configuration でのCMA 領域の確保方法
ZYBO用の Linaro Ubuntu のPL部にビットマップ・ディスプレイ・コントローラを搭載する8(ZYBOで動作確認2)
16MBのCMA領域を確保できたので、もう一度、”ZYBO用の Linaro Ubuntu のPL部にビットマップ・ディスプレイ・コントローラを搭載する7(ZYBOで動作確認)”の./draw_disp_uio コマンドを実行してみることにした。
キャラクタを画面に表示することができた。
ZYBO用のLinaro Ubuntu にOpenCV-2.4.6.1 をインストール
”ZYBO用の Linaro Ubuntu のPL部にビットマップ・ディスプレイ・コントローラを搭載する8(ZYBOで動作確認2)”のZYBO用の Linaro Ubuntu にOpenCV 2.4.6.1 をインストールした。

ZYBOのLinaro Ubuntu のIPアドレスを固定する
ZYBOのLinaro Ubuntu のIPアドレスの取得方法は DHCP で毎回 Tera Termで SSH ログインするときのアドレスが異なる。これを何とかしようとIPアドレスを固定することにした。ZedBoardのIPアドレスが 192.168.3.130 にしてあったので、ZYBO は 192.168.3.131 にすることにした。

ZYBOのLinaro Ubuntu のXウインドウの表示をパソコンで行う(Xmingを使用)
”ZYBOのLinaro Ubuntu のIPアドレスを固定する”でZYBOのLinaro Ubuntu のIPアドレスを固定することができた。これで、SSHで入りやすくなったので、今度は、ZYBOのLinaro Ubuntu のXウインドウをパソコンで表示してみた。

レナ像を使用して OpenCVで顔検出をやってみた(ZYBO Linaro Ubuntu)
”ZYBOのLinaro Ubuntu のXウインドウの表示をパソコンで行う(Xmingを使用)”で、OpenCVの画像出力をパソコンのウィンドウとして表示することが出来たので、例によってレナ像を使用 してOpenCVで顔検出をやってみた。

ZYBO用の Linaro Ubuntu のバージョンを 12.11 から14.04 LTS にアップグレード2
ZYBO用の Linaro Ubuntu のバージョンを 12.11 から14.04 LTS にアップグレードしようとして挫折してしまいましたが、もう一度、Ubuntu 14.04 にアップグレードしようということでやってみました。
なんとか、Ubuntu 14.04 にアップグレードできたようです。

ZYBO用の Linaro Ubuntu 14.04 LTS で OpenCV の顔検出ができた
もう一度、Ubuntu 12.11 を戻して、もう一度、、Ubuntu 14.04 LTS にアップグレードしてみることにした。
Ubuntu 14.04 LTSでOpenCVの顔検出が動作した。

ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する1(準備編)
ドライバなどを作らないといけないという状況は重々承知の上で、CMA領域の先頭番地から使っ ていても、とりあえずは問題ないので、より問題の少ないと思われる真ん中くらいのアドレスを使って、カメラ・コントローラを実装してカメラ画像を Linaro Ubuntu の動作する ZYBO で表示してみたい。
ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する2(IPのシミュレーション)
以前に作ってあったカメラ・コントローラIPを1フレームの画像をキャプチャして止めて置ける ように改造して、シミュレーションを行った。
シミュレーションを行った。最初は、カメラのピクセル値をDDR3 SDRAMへWrite するためのAXI4 Write Transction だ。
ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する3(IP化)
出来上がったカメラ・コントローラIPのIP化を行った。
ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する4(ブロック・デザイン)
前回はカメラ・コントローラIPが出来たので、それとビットマップ・ディスプレイ・コントロー ラIPを組み込んだブロック・デザインを作製した。
ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する5(インプリメント)
前回で、ブロック・デザインが完成したので、今回は論理合成と制約の追加、インプリメントを 行った。
ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する6(BOOT.BINの生成)
前回、カメラ表示システムのインプリメントまで終了した。今回は、BOOT.BINを生成し た。
ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する7(devicetree.dtb)
前回、BOOT.BIN を生成したので、今回は、devicetree.dtb を生成した。
ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する8(実機でテスト)
今回は、devicetree.dtb と BOOT.bin を SDカードに書いて、ZYBOに挿入して確かめてみた。
ディスプレイへ画像出力はされているが、画面は真っ暗だった。
ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する9(デバック)
Vivado logic Analyzer (Hardware manager) を使用 してデバックを行った。
少なくとも、mt9d111_inf_axi_master_0 のAXI4 Lite Slave 番地 0x43C10000 番地に 0x18000000 を書いているので、カメラのデータをDDR3 SDRAMに書いても良さそうなので、もう一度シミュレーションを確かめてみる。
ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する10(デバック2)
前回は、カメラの画像が表示されないので、ZYBOのLinux(Ubuntu) 環境からベアメタル・アプリケーションに変更してデバックを行った。原因は解明できて、ベアメタル・アプリケーションでは動作した。
修正した mt9d111_axi_lite_slave.v と mt9d111_cam_cont.v を貼っておく。
ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する11(Linuxで確認)
ZYBO用のUbuntu14.04 LTS で確認した所、動作してカメラの画像をディスプ レイに表示することができた。
cam_capture.c を作って、画像のキャプチャを行った。と言うか、frame_valid を止めただけなのだが。。。これも成功。。。

ZYBOのUbuntu上で カメラ画像をBMPファイルに変換できた
カメラ画像をUIO領域にDMAし、それをキャプチャ画像として停止することができたので、カ メラ画像をBMPファイルに変換するソフトウェア disp2bmp.c を書いた。disp2bmp.c と bmpheader.h を貼った。
ZYBO用カメラ画像を OpenCVで顔認証した
”ZYBOのUbuntu上でカメラ画像をBMPファイルに変換できた”でカメラ画像をBMPファイルに変換できたので、そのBMPファイルを gimp でJPEGファイルに変換して、OpenCV で顔認証を試みた。成功した。

ZYBO用Ubuntu Linuxの時計のずれ
ZYBO用Ubuntu14.04LTS の時計がずれて、困っている。いろいろとトライしてみた。
ZYBO用Ubuntu Linuxの時計のずれ2(解決編)
時計のズレはDTS (Deviece Tree Source) の設定が原因だった。設定を変更したら時計のズレが修正できた。

Vivado and ZYBO Linux 勉強会
ZYBOボードを使用した Vivado and ZYBO Linux 勉強会 を内部的にやる予定です。開催時期は2月中旬にしようと思っています。

ZYBO用Ubuntu Linux のカメラで撮った画像にラプラシアンフィルタをかける
ZYBO用のUbuntu Linux 上でカメラ画像を取得することができたので、そのカメラ画像にラプラシアンフィルタをソフトウェアでかけた。
ZYBOの Ubuntu14.04LTSにOpenCV-2.4.10をインストール
Ubuntu14.04LTSには、 OpenCV-2.4.6.1 はインストールできなかった。そこで、 OpenCV-2.4.10をインストールした。
OpenCV のコンパイル・スクリプト
OpenCV の C , C++ のプログラムをコンパイルするためのコンパイル・スクリプトを作った。

ひでみさんのZynq本2冊 とMicroSDカードが届いた
昨日、ひでみさんに注文しておいたZynq本2冊とMicroSDカードが届いた。

ZYBOで STREAM を試してみた
ツィッターでなひたふさんが STREAM というツールでZYNQ Linuxのメモリ帯域幅を測っていたので、私もZYBO でやってみた。
ZYBOのUbuntu ブート用のMicroSDカードをバックアップからコピーする手順
ZYBOのUbuntu ブート用のMicroSDカードに不具合が生じてバックアップからコピーする手順の覚書です。

ZYBOのDigilent Linux KernelにARMhfのRoot File Systemsを入れる
”ZYBO用のEmbedded Linux チュートリアル7(Linuxカーネルのビルド)”までで作ったZYBO用のDigilent Linux Kernel にARMhfで見つけたUbuntu Trusty 14.04 LTS とDebian Wheezy 7.5のRoot File Systems を入れてみようと思った。
この時は失敗したと思っていたが、後で動作していることが確認できた。
ZYBOのDigilent Linux KernelにARMhfのRoot File Systemsを入れる2( Debian Wheezy 7.5)
今回、もう一度、 Debian Wheezy 7.5 のRoot File Systems を MicroSDカードの2nd パーティションに入れて、1st パーティションは、Digilent Linux Kernel, BOOT.bin, devicetree.dtb を入れた。
ブートしてみると、シリアルポート接続のTrea Termは、sshd でやはり止まったが、SSHから入って使用できることが分かった。
ZYBOのDigilent Linux KernelにARMhfのRoot File Systemsを入れる3(Ubuntu Trusty 14.04 LTS)
今回、もう一度、 Ubuntu Trusty 14.04 LTS のRoot File Systems を MicroSDカードの2nd パーティションにコピーして、1st パーティションは、Digilent Linux Kernel, BOOT.bin, devicetree.dtb をコピーした。動作させた所、Ubuntu14.04LTSもSSHからログインできることが分かった。
ZYBOのARMhfの Debian Wheezy 7.5にOpenCV 2.4.10をインストール
ZYBOのDigilent Linux KernelにARMhfの Debian Wheezy 7.5 の Root File Systemsを入れて動作した。
今回は、それに、OpenCV 2.4.10 を入れてみた。
ZYBOのARMhfの Ubuntu 14.04 LTS にOpenCV 2.4.10をインストール
ZYBOのARMhfのUbuntu 14.04 LTS にも、OpenCV 2.4.10をインストールした。

Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする1
”Vivado HLS 2014.1でラプラシアン・フィルタ関数をaxi masterモジュールにする1”で使用しているラプラシアンフィルタのCソースを使ってIP化してみた。
Vivado HLS 2014.4では、2014.1まで使っていたAXIバス用のディレクティブが変更になった。
Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする2
前回はC Synthesis アイコンで高位合成を行った。今回は、Export RTL アイコンで IP 化を行った。
Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする3(IP Catalog にVivado HLSのIPを追加)
”Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする2”で、以前からやっているラプラシアンフィルタを Vivado HLS 2014.4 でIP化できた。途中、AXI4バスを生成するディレクティブが変更になっていて戸惑ったが、IP化することができたので、”ZYBO用の Linaro Ubuntu のPL部にカメラ・コントローラを搭載する11(Linuxで確認)”でできたZYBOでカメラ画像を表示するVivado プロジェクトを Vivado 2014.4 にアップデートして、今回作製したVivado HLS 2014.4 のラプラシアンフィルタIPを追加することにした。
Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする4(ブロックデザインにVivado HLSのIPを追加、インプリメント)
Vivado HLSで作製したラプラシアンフィルタIPを V_ZYBO_CAMDfLブロックデザイン上にインスタンスして論理合成、インプリメントを行った。
Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする5(BOOT.bin, devicetree.dtb の生成)
Vivado HLSで作製したラプラシアンフィルタIPを V_ZYBO_CAMDfLブロックデザイン上にインスタンスして論理合成、インプリメントを行った。今回は、SDKを立ちあげてBOOT.binを作製した。
Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする6(/sys, /devディレクトリ)
前回、Vivado HLS 2014.4 で作製したラプラシアンフィルタIPが入ったBOOT.bin とそのUIOの項目を追加したで devicetree.dtb を作製した。今回は、その BOOT.bin と devicetree.dtb を MicroSDカードの第1パーティション ZYBO_BOOT に入れて、ZYBOに挿入して電源をONし、起動するかどうか?を確かめてみた。

Vivado and ZYBO Linux勉強会を開催
2015年(平成27年)2月16日(月)と2月17日(火)で、Vivado and ZYBO Linux勉強会を開催しました。
Vivado and ZYBO Linux勉強会用のソースファイル
Vivado and ZYBO Linux勉強会の必要なソースファイルを貼っておきます。

Linaro Ubuntu14.04LTSが動作してるZYBOへWindowsのSDKからリモートデバックする
今回はパソコンのSDKからSSHでリモートデバックしてみようと思う。これは確か、前にやっ てみた時にデバック時にエラーが出たのだが、今回もう一度確かめてみようと思う。
やはり、エラーでSDKデバックできなかった。

ZYBO Linux (Ubuntu 14.04 LTS) 上でMakefile を作ってラプラシアンフィルタIPの制御ソフトをコンパイル
ZYBO のLinux 上でVivado HLSで生成された制御ソフト(Cドライバー・ソフトウェア)をコンパイルして動作させることにした。
ZYBO Linux (Ubuntu 14.04 LTS) 上でMakefile を作ってラプラシアンフィルタIPの制御ソフトをコンパイル2
前回、Vivado HLS 2014.4 で作製したラプラシアンフィルタIPのAXI4 Lite Slave ポートにアクセスしたが、バスエラーになってしまった。今回はその原因を探った。
画像が表示されたが、28秒かかってしまった。原因はVivado HLSのラプラシアンフィルタのCソースコードが間違っていたことだった。訂正記事へのリンクあり。
ZYBO Linux (Ubuntu 14.04 LTS) 上でMakefile を作ってラプラシアンフィルタIPの制御ソフトをコンパイル3
Vivado HLS 2014.1 でラプラシアンフィルタIPを作って、Vivado 2014.4 のプロジェクトを新規作成し、ブロック・デザインを構築していく過程で、ラプラシアンフィルタ IP のAXI4 Master バスは、カメラ・コントローラー IPとビットマップ・ディスプレイ・コントローラー IP のAXI4 Master が入っている AXI Interconnect に入っている。これをラプラシアンフィルタ IP 独自の AXI Interconnect にして、Zynq PS の AXI HP2 ポートに入れたらどうだろう?と考えた。
AXI4のバス帯域を考察してみた。

Vivado HLS 2014.1で生成したラプラシアンフィルタIPをZYBOのカメラ表示システム上で使用する1
Vivado HLS 2014.1 のプロジェクトを作製して、以前のVivado HLS 用のラプラシアンフィルタのCソースコードをプロジェクトに入れた。そして、高位合成して、IP化を行った。
バグフィックス版へのリンクあり
Vivado HLS 2014.1で生成したラプラシアンフィルタIPをZYBOのカメラ表示システム上で使用する2
今回は、Vivado HLS 2014.1 で作製したラプラシアンフィルタ IP を ZYBO のVivado 2014.4 にプロジェクトのブロック・デザインの中に入れて論理合成、インプリメント、ビットストリームの生成後、BOOT.binの作製を行った。
Vivado HLS 2014.1で生成したラプラシアンフィルタIPをZYBOのカメラ表示システム上で使用する3
今回は、BOOT.binをMicro SDカードにコピーして、ZYBOに挿入して電源ONを行った。
制御用ソフトウェアを起動したら、ラプラシアンフィルタ処理のDONE待ち関数から1秒間帰ってこなかった。

Vivado HLS 2014.1で生成したラプラシアンフィルタIPをシミュレーション1(mem_sim_axi_slave IP の作製)
前回、Vivado HLS 2014.1 で作製したラプラシアンフィルタ IP が動作しなかったので、シミュレーションを行う。シミュレーションをしたのはZedBoardの時で、AXI4 Slave を持った汎用メモリモデル IP の mem_sim_axi_slave と設定レジスタを設定する AXI Lite Master IP の reg_set_axi_lite_master を使用する。
Vivado HLS 2014.1で生成したラプラシアンフィルタIPをシミュレーション2(reg_set_axi_lite_master IP の作製)
設定レジスタを設定する AXI Lite Master IP の reg_set_axi_lite_master を作製した。
Vivado HLS 2014.1で生成したラプラシアンフィルタIPをシミュレーション3( mem_sim_axi_slave IP の変更1)
”Vivado HLS 2014.1で生成したラプラシアンフィルタIPをシミュレーション1”で作った mem_sim_axi_slave IP のコードを少し修正することにした。
次に、Vivado HLS 2014.1 で作製したラプラシアンフィルタIP のシミュレーションをする予定なのだが、ラプラシアンフィルタIP のレジスタを設定する reg_set_axi_lite_master IP とメモリIP の mem_sim_axi_slave だけでは、メモリの値を書き換えるIP が存在しない。現在では、mem_sim_axi_slave の memory_8bit.v の中でメモリの初期値はオール 0 にクリアされているので、ラプラシアンフィルタIP でカメラデータを Read するために DMA しても、ラプラシアンフィルタ処理後のデータを Write するために DMA しても全て 0 のみとなる。これでは寂しいので、せめて、メモリの初期値を変更できるように、memory_8bit.v のメモリの初期値を変更できるようにした。
Vivado HLS 2014.1で生成したラプラシアンフィルタIPをシミュレーション4(mem_sim_axi_slave IP の変更2)
”Vivado HLS 2014.1で生成したラプラシアンフィルタIPをシミュレーション3”の mem_sim_axi_slave プロジェクトで IP を再IP化した。
Vivado HLS 2014.1で生成したラプラシアンフィルタIPをシミュレーション5(シミュレーション用プロジェクトの作製)
これで必要なIPが揃ったので、Vivado 2014.1 で作製したラプラシアンフィルタIP をシミュレーションするためのVivado 2014.4 のプロジェクトを作製した。

Vivado 2014.4でのVerilog HDLで記述したROM の初期化データの扱い
”Vivado HLS 2014.1で生成したラプラシアンフィルタIPをシミュレーション5(シミュレーション用プロジェクトの作製)”でシミュレーション用のプロジェクトが完成したので、シ ミュレーションを行った。
しかし、”Vivado HLS 2014.1で生成したラプラシアンフィルタIPをシミュレーション2(reg_set_axi_lite_master IP の作製)”で、Vivado のIPとしたreg_set_axi_lite_master.v のrom 配列にラプラシアンフィルタIP を初期化して、ラプラシアンフィルタ処理をスタートする処理を書き込むことが出来ない。これは、”AXI VDMAのレジスタ設定用AXI Lite Master IPの作製2(シミュレーション)”に詳しく書かれているが、rom という2次元配列に initial 文で $readmemh("vdma_reg_set.txt", rom, 0, 255); を使用して、vdma_reg_set.txt に書いたアドレスとデータを読み込むようになっている。
今回は、vdma_reg_set.txt では、名前が良くないので、reg_set.txt に変更してある。
reg_set.txt をシミュレーションの時の work フォルダに置けば読まれるはずなのだが、プロジェクト内の何処においても読まれない。とっても困ってしまった。
解決方法としては、絶対パスのフルパスを書くことだった。

Vivado HLS 2014.1で生成したラプラシアンフィルタIPをシミュレーション6(シミュレーション)
前回はシミュレーション用プロジェクトを作成できたので、シミュレーションを行った。
Vivado HLS 2014.1 で高位合成したラプラシアンフィルタIPに設定することはできて、lap_fil_hls_sim_i -> lap_filter_axim_0 -> inst -> lap_filter_axim_LiteS_if_U の I_ap_start は 1 になったのだが、その後の cam_fb のAXIバスのReadが始まらない。

Vivado HLS 2014.4で生成したラプラシアンフィルタIPをシミュレーション1
”Vivado HLS 2014.1で生成したラプラシアンフィルタIPをシミュレーション6(シミュレーション)”で Vivado HLS 2014.1 で新たに作製したラプラシアンフィルタIP が動作しなったので、今度は、Vivado HLS 2014.4 で作製したラプラシアンフィルタIP をシミュレーションすることにした。
”Vivado HLS 2014.1で生成したラプラシアンフィルタIPをシミュレーション5(シミュレーション用プロジェクトの作製)”と同様にVivado 2014.4 のプロジェクトを作製し、シミュレーションを行った。
Vivado HLS 2014.4で生成したラプラシアンフィルタIPをシミュレーション2
前回、Vivado HLS 2014.4 でせいせいしたラプラシアンフィルタIP をVivado 2014.4 で、メモリIP やレジスタ値設定用IP などを追加して、ブロック・デザインを生成してシミュレーションを行った。
今回は、シミュレーションをもっと長く行って、ラプラシアンフィルタIP の実行時間が約27秒も掛かる原因を追求した。

Vivado HLS 2014.4で生成したラプラシアンフィルタIPをシミュレーション3(原因が分かった)
おるさんのおかげで、1ヶ月半くらいの間、悩んできた Vivado HLS 2014.4 で生成したラプラシアンフィルタIP の原因が分かりました。おるさんありがとうございました。
それは、古いバグありのラプラシアンフィルタのCソースコードを使用してしまったからです。正しいCソースコードはあったのですが、Vivado HLS プロジェクトの外に出してあって、バージョンの違うVivado HLS プロジェクトで使えるようになっていました。古いバグありCソースコードがプロジェクト内に残っていたので勘違いしてしまいました。反省しております。。。
新しいラプラシアンフィルタIP のCソースコードを貼っておきます。シミュレーションも行った。

ZYBO Linux (Ubuntu 14.04 LTS) 上でMakefile を作ってラプラシアンフィルタIPの制御ソフトをコンパイル4(うまく行った)
ラプラシアンフィルタIP のバグもフィックスできたので、もう一度、”Vivado HLS 2014.4でラプラシアン・フィルタ関数をaxi masterモジュールにする4(ブロックデザインにVivado HLSのIPを追加、インプリメント)”のラプラシアンフィルタ IP をバグ無しのものにすげ替えて、ラプラシアンフィルタのIPを更新し、もう一度、論理合成、インプリメント、ビットストリームの生成を行い、実機で確かめたところ問題なく 動作した。処理時間は約 95.4 ms だった。

Vivado HLS 2014.4 でAXI4-Stream版ラプラシアンフィルタIP を作製する1(C++ ソースコードの公開)
1次元の俺様フィルタを元にラプラシアンフィルタを作製する。
tu1978 さんのサンプルをほとんどコピーしながらも、自分なりのAXI4-Stream版ラプラシアンフィルタのC++ ソースコードを作製した。
Vivado HLS 2014.4 でAXI4-Stream版ラプラシアンフィルタIP を作製する2(C++シミュレーション、高位合成)
前回は、AXI4-Stream 版のラプラシアンフィルタIP のC++ ソースコードを公開した。但し、シミュレーションを速くするために、HORIZONTAL_PIXEL_WIDTH = 50、VERTICAL_PIXEL_WIDTH = 10 とした。今回は、そのC++シミュレーションと高位合成を行った。
Vivado HLS 2014.4 でAXI4-Stream版ラプラシアンフィルタIP を作製する3(RTLシミュレーション)
RTLシミュレーションを行って、ハードウェアでの動作を確認した。その際に、RTLのトレー スファイルを出力させて、Vivado でシミュレーション波形の表示を行った。
Vivado HLS 2014.4 でAXI4-Stream版ラプラシアンフィルタIP を作製する4(RTLシミュレーション2)
前回は、クロック周期を 10 ns つまり 100 MHz で高位合成を行った。今回は、動作周波数の限界に挑戦してみようと思う。
Vivado HLS 2014.4 でAXI4-Stream版ラプラシアンフィルタIP を作製する5(IP化)
前回は、動作周波数を 100 MHz から 150 MHz にすることで、性能が 1.49 倍に向上した。今回は、シミュレーション用に少ないピクセルの行列でやっていたのを 800 x 600 ピクセルに戻して、高位合成、IP 化を行った。

カメラ-AXI4- Stream出力IPの作製1(プロジェクト作製とpixel_fifo)
”AXI4-Stream版ラプラシアンフィルタIPのカメラ表示システム1(構想編)”のブ ロック図のカメラ-AXI4-Stream出力IPを作製する。
Vivado 2015.1 でZYBOに搭載されているZynq の xc7z010clg400-1 のプロジェクトを作製し、pixel_fifoを生成した。
カメラ-AXI4- Stream出力IPの作製2(論理シミュレーション)
前回は論理合成用とシミュレーション用のソースを作り、Vivado 2015.1 のプロジェクトを作製した。今回は、論理シミュレーションを行った。
カメラ-AXI4- Stream出力IPの作製3(論理合成用HDLソースの公開)
今回は、前回の論理シミュレーションで問題なかった論理合成用のHDLソースコードを貼ってお く。
カメラ-AXI4- Stream出力IPの作製4(シミュレーション用HDLソースの公開)
今回は、カメラ-AXI4-Stream出力IPのシミュレーション用 Verilog HDL のソースコードを貼っておく。
カメラ-AXI4- Stream出力IPの作製5(IP化)
カメラ-AXI4-Stream出力IPのプロジェクトをIP化していなかったので、IP化を 行った。
Vivado 2015.1 でIP化したことがないので、丁寧に説明していく。

AXI4-Stream Switcher IP の製作1(CPP ソースコードの公開)
AXI4-Stream Switcher IP の製作を行う。
AXI4-Stream Switcher IP は、”AXI4-Stream版ラプラシアンフィルタIPのカメラ表示システム1(構想編)”のブロック図に示してあるが、ラプラシアンフィルタを通した画像データの AXI4-Steram とカメラの画像データのAXI4-Steram を切り替える。
AXI4-Stream Switcher IP の製作2(Cシミュレーションと高位合成)
前回、貼ったC++のソースコードを使用して、今回は、Cシミュレーションと高位合成を行っ た。
AXI4-Stream Switcher IP の製作3(C/RTLコシミュレーションとIP化)
前回は、Cシミュレーションと高位合成を行った。今回は、C/RTLコシミュレーションをし て、その波形をVivado 2015.1で観察し、IP化を行った。

AXI4-Stream版ラ プラシアンフィルタIPのカメラ表示システム1(構想編)
FPGAの部屋のブログで書いてきた Vivado HLS で作製したAXI4-Stream版ラプラシアンフィルタ IP を使用したカメラ表示システムを作製しようと思う。
ブロック図を示した。
AXI4-Stream版ラ プラシアンフィルタIPのカメラ表示システム2(Vivado 2015.1でプロジェクトを作製)
必要なIPが全て揃ったので、Vivado 2015.1で V_ZYBO_CAMDS_151 を作製して、AXI4-Stream版ラプラシアンフィルタ IP を使用したカメラ表示システムを作っていくことにした。
AXI4-Stream版ラ プラシアンフィルタIPのカメラ表示システム3(ブロックデザイン1)
前回は、必要なIPをIP Catalog に登録した。今回は、V_ZYBO_CAMDS というブロックデザインを作っていく。
AXI4-Stream版ラ プラシアンフィルタIPのカメラ表示システム4(ブロックデザイン2)
前回はブロックデザインの途中までだったので、今回はブロックデザインを完成させた。
AXI4-Stream版ラ プラシアンフィルタIPのカメラ表示システム5(制約ファイル、インプリメント)
前回はブロックデザインを完成させたのだが、ブロックデザインの名前が間違っていたので、 V_ZYBO_CAMDS を新規作成して、ブロックデザインをコピーした。
制約ファイルを作り、インプリメントを行った。
AXI4-Stream版ラ プラシアンフィルタIPのカメラ表示システム6(SDK1)
前回はインプリメントして、ビットストリームの生成まで終了したので、今回はハードウェアをエ クスポートして、SDKを立ちあげプロジェクトを生成する。
AXI4-Stream版ラ プラシアンフィルタIPのカメラ表示システム7(実機動作)
前回は、SDKで、cam_disp プロジェクトとcam_disp_bsp プロジェクトを作製した。今回は、ソフトウェアを作製して実機動作テストを行ったが、表示結果がおかしかった。
AXI4-Stream版ラ プラシアンフィルタIPのカメラ表示システム8(デバック)
実機動作でうまく動作しなかったので、Vivado Analyzer を使ってデバックを行った。まだ原因はわからない。
AXI VDMAのドライバによるレジスタの設定値
AXI VDMAのドライバを使って書いてみたが、実際にどのようにレジスタを設定しているか?を見ていく。Vivado Logic Analyzer でAXI VDMAの設定用のAXI4 Lite Slave バスを観察して、どのレジスタを設定しているのかを見ていこう。
これでバグの原因が分かった。
AXI4-Stream版ラ プラシアンフィルタIPのカメラ表示システム9(カメラ画像表示は完成)
”AXI VDMAのドライバによるレジスタの設定値”で画像のフレームバッファのアドレスが 0 番地になっていたのを 0x10000000 番地にしたら表示が出た。
AXI4-Stream版ラ プラシアンフィルタIPのカメラ表示システム10(ラプラシアンフィルタ処理)
AXI VDMAを使用してカメラ画像をディスプレイに表示することができた。今回は2つのAXI4-Stream Switch を切り替え、ラプラシアンフィルタIPの連続処理を設定して、ラプラシアンフィルタ処理後の画像をディスプレイに表示する。
ラプラシアンフィルタ処理に切り替えたところ、青いエッジが見えた。RGBにラプラシアンフィルタ出力値をコピーしないで、Bのみにコピーしたためだった。
AXI4-Stream版ラ プラシアンフィルタIPのカメラ表示システム11(ベアメタル・アプリ版完成)
前回はAXI4-Stream版のラプラシアンフィルタ処理を行ったところ、エッジが青く表示 されてしまった。これはAXI4-Stream版のラプラシアンフィルタIP のバグだったので、修正を行って、完成した。

ラプラシアンフィルタのソフ トウェアとハードウェアの速度の比較
Vivado HLSで使用したCソースコードを使用したらソフトウェアでは、どのくらい速くなるのかやってみた。
今まで、ソフトウェアでの結果とハードウェアにオフロードした時の結果を比較していたが、ソフトウェアはいかにもソフトウェアで書くようなコードで比較してい て、ハードウェア化するコードではなかった。ハードウェア化するコードをソフトウェアで実行するとどのくらいの性能になるかを検証することにした。
ラプラシアンフィルタのソフ トウェアとハードウェアの速度の比較2
前回は2つのVivado HLS 2014.4 で使用した2つのCソースコードをソフトウェアに適用したら、どの程度の処理速度になるかを調べた。Vivado HLS 2014.4 で使用したコードをソフトウェアに移行したら速くなることが分かった。更に、ほとんど同一のCソースコードによるソフトウェアとハードウェアでのラプラシアンフィルタの処 理速度の違いを測定した。
ソフトウェアのCソースコー ドをVivado HLS 2014.4 で高位合成したIPをシミュレーション
今回は、”ラプラシアンフィルタのソフトウェアとハードウェアの速度の比較2”で高位合成した IPをシミュレーションしてみた。
ラプラシアンフィルタのソフ トウェアとハードウェアの速度の比較3
今回はVivado HLS 2014.4 で最速の性能をたたき出しているCソースコードをZYBOのLinuxで動作するソフトウェアとして性能を測定した。

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 使用した時では、あまり速度差が無いと言える。

ZYBOのHDMI入力を使 用する(概要)
ZYBOのHDMIはSource と Sink 両方使用することができる。つまりHDMI入力にもなれば、HDMI出力にすることもできる。これは、HDMIの信号がバッファを通したのみで Zynq-7010 チップに接続されているからなのだが、この性質を利用して、ZYBO同士を通信させようと思っている。その代わり、HDMIの8B10Bデコードなどは、自分で作る必要が ある。
ZYBOのHDMI入力を VGA出力に出力する1(プロジェクトの作製)
”ZYBOのHDMI入力を使用する(概要)”の知見をベースにHDMI入力から入力されたビ デオ信号をVGAポートに出力するVivado 2015.2 のプロジェクトを作り、論理合成が終了した。
ZYBOのHDMI入力を VGA出力に出力する2(制約ファイル)
前回は、Vivado 2015.2 のプロジェクトを作製して、ブロックデザインを作製し、論理合成を行った。今回は、制約ファイルを生成した。
インプリメントを行ったら、place でエラーが出てしまった。
ZYBOのHDMI入力をVGA出力に出力する3(バグフィックス?)
今回はバグフィックスを行った。
TMDS_Clk_p が 6.060 ns つまり 165 MHz に制約されているので、 8.334 ns , 120 MHz に変更したところ、ビットストリームの生成まで成功した。
ZYBOのHDMI入力をVGA出力に出力する4(実機テスト)
ZYBOのHDMI入力からVGA出力に出力する回路が出来上がったので、動かしてみようと思 う。
マスタ側の ZYBO を起動して、(Ubuntu 14.04 LTS) Apps ディレクトリに移動して、カメラ出力のコマンド ./cam_disp_uio を実行したら、なんと、スレーブ側のVGAポートからマスタ側のカメラ画像が出ました。。。やった~~~。とっても嬉しいです。。。と喜んでいるが、この後は、SVGAで は画像が出なかった。
ZYBOのHDMI入力を VGA出力に出力する5(dvi2vga IPの信頼性)
昨日、1日いろいろとパラメータを変えながらやってみたが、どうやら、たまたまHDMIで画像を転送できる時もあるが、転送できない時のほうが圧倒的に多いよ うだ。昨日は1回しか転送できなかった。
dvi2vga IP はSVGA では上手く画像データを受信することができなかった。XGA以上でないと受信できないようだ。
ZYBOのHDMI入力をVGA出力に出力する6(dvi2rgb IPの信頼性2)
自作のカメラ画像出力の800x600 解像度のHDMI 信号がまずいのかも知れない?ということで、Digilent 社のZYBO ページのZYBO Base System Design で画像を出力してみることにした。
やはり、800x600 60p ではslave 側にVGA画像が出力されない。
しかし、dvi2rgb IP を 60MHz 720p に設定して、ZYBO Base System Design で 1280x720 60p を指定すると、コンフィグレーションの順番に関係なく、100発100中でVGA端子から画像が出力された。但し、9秒ほど表示するまでの時間がかかっている。
ZYBOのHDMI入力を VGA出力に出力する7(ラプラシアンフィルタIPを除いたシステム)
現在のdvi2rgb IP はDigilent フォーラムの”Help With A Zybo Video Design”の mwingerson さんの書き込みに従って"dvi2rgb.xdc"を修正してある。それに、dvi2rgb IP に hdmi_hpd と hdmi_out_en 端子を追加した。
これで、ビットストリームの生成まで行って、ノートパソコンをHDMIに接続して解像度を変え て試してみた。SVGA以外はOK。
ZYBOのHDMI入力を VGA出力に出力する8(ラプラシアンフィルタIP付き)
前回、ラプラシアンフィルタを除いたVideo In to AXI4-Stream IP と AXI4-Stream to Video Out IP、Video Timing Controller (VTC)を接続したが、正常に画像が表示できた。
今回は、Video In to AXI4-Stream IP と AXI4-Stream to Video Out IPの間のAXI4-Stream インターフェースの間にラプラシアンフィルタIP を挿入した。
ZYBOのHDMI入力を VGA出力に出力する9(プロジェクトの公開)
”ZYBOのHDMI入力をVGA出力に出力する8(ラプラシアンフィルタIP付き)”で出来 上がったプロジェクトをGitHubで公開した。

ZYBOのHDMI入力画像 にラプラシアンフィルタ処理を行う1(構想編)
RGB信号入力からラプラシアンフィルタ処理をしてVGAポートに出力してみよう。
ZYBOのHDMI入力画像 にラプラシアンフィルタ処理を行う2(高位合成)
ZYBOの xc7z010clg400-1 のVivado HLS 2014.4 プロジェクトを作製して、lap_filter_rgb.cpp を作り、CからHDLへの合成を行った。

ビデオ信号にAXI4 Stream版のラプラシアンフィルタを通して画像出力1(準備編)
AXI4-Stream版ラプラシアンフィルタIP を使用して、ビデオ信号から AXI4 Stream に変換して、ラプラシアンフィルタ処理を行い、その出力の AXI4 Stream をビデオ信号に変換する。
ビデオ信号にAXI4 Stream版のラプラシアンフィルタを通して画像出力2(Vivado HLS)
Vivado HLS でAXI4 Stream 版のラプラシアンフィルタIP をAXI4 Lite Slave を使わない形にする。更に、1ビットの lap_fil_enable を作って、lap_fil_enable = 1 の時だけラプラシアンフィルタ処理を行い、それ以外の時はビデオ信号をそのまま出力するように変更する。lap_fil_enable はスイッチに割り当てる予定である。ソースコード有り
ビデオ信号にAXI4 Stream版のラプラシアンフィルタを通して画像出力3(Vivadoプロジェクト)
ブロックデザインを完成させた。ビットストリームを生成し、実機テストしてもVGAに画像は出 なかった。

Vivado HLS によるアンシャープマスクキング・フィルタの作製5(Vivado プロジェクトの作製)
前回、アンシャープマスキング・フィルタ IP が作成できたので、Vivado 2015.2 でプロジェクトを作製して動作をチェックする。
プロジェクトは、”ZYBOのHDMI入力をVGA出力に出力する8(ラプラシアンフィルタIP付き)”のプロジェクトを使用する。ラプラシアンフィルタ IP の部分だけをアンシャープマスキング・フィルタ IP に交換する。
Vivado HLS によるアンシャープマスクキング・フィルタの作製6(実機確認)
前回はVivado 2015.2 のブロックデザインを作製し、アンシャープマスキング・フィルタIP をHDMI 入力 - HDMI 出力のAXI4 Stream 間に挿入した。
今回は、制約ファイルを作製してから、プロジェクトを論理合成、インプリメント、ビットストリームの生成を行って、実機で検証して、上手く行った。

ZYBOにHDLで書いたラ プラシアンフィルタを実装する1(FIFO の生成1)
以前、ZedBoard 用にHDLで書いたラプラシアンフィルタのIP があった。(”AXI4 Master アクセスのラプラシアン・フィルタ IP9(できた。完成)”)
これをZYBO用にVivado 2015.3 で再度実装してみたいと思う。
ZYBOにHDLで書いたラ プラシアンフィルタを実装する2(FIFO の生成2)
前回は、write_adfifo の生成を行ったが、今回はその続きで、Write関連のFIFOの生成を行う。
ZYBOにHDLで書いたラ プラシアンフィルタを実装する3(FIFO の生成3)
前回まででは、Write用のFIFO を生成したので、今回はRead用のFIFO を生成する。
ZYBOにHDLで書いたラ プラシアンフィルタを実装する4(シミュレーション)
前回で、FIFO IPの生成は終了した。今回は、シミュレーションを行う。
ZYBOにHDLで書いたラ プラシアンフィルタを実装する5(IP化)
前回、シミュレーションで動作を確認できたので、今回はIP化を行う。使用するVivado のバージョンは 2015.3 だ。
ZYBOにHDLで書いたラ プラシアンフィルタを実装する6(Vivado のブロックデザインにIPを追加)
前回は、HDLで書いたラプラシアンフィルタIP をIP化することができたので、今回は、”IPをVivadoの IPIに追加して、BOOT.binとデバイスツリーを作り、ZYBO のLinuxでアプリケーションを作る作り方”のVivado 2015.3 のプロジェクトのブロックデザインに追加する。(V_ZYBO_CAMDfL144_tu_2 をコピーしてVivado 2015.3 のプロジェクトとした)
ZYBOにHDLで書いたラ プラシアンフィルタを実装する7(インプリメント)
前回では、ブロックデザインが完成した。今回はインプリメントを行う。
ZYBOにHDLで書いたラ プラシアンフィルタを実装する8(ビットストリーム生成、BOOT,bin の生成)
前回はインプリメントは終了したが、タイミング違反が出ていたので、ストラテジーを変更したイ ンプリメントを行った。その結果、タイミングを満足したインプリメント結果が得られた。SDKを立ちあげて、BOOT.bin を生成した。
ZYBOにHDLで書いたラ プラシアンフィルタを実装する9(devicetreeの生成、/sys, /devディレクトリ)
今回は、devicetree.dtb を生成して、Micro SDカードに、BOOT.bin と devicetree.dtb を書き込んで、ZYBOに挿入してUbuntu をブートし、/sys ディレクトリと /dev ディレクトリを観察した。
ZYBOにHDLで書いたラ プラシアンフィルタを実装する9(制御ソフトウェアを作製して実機確認)
今回は、制御ソフトウェアを作製してZYBO でHDLで書いたラプラシアンフィルタを動作させ た。
バグというかパーミッションの設定忘れが残っている。
ZYBOにHDLで書いたラ プラシアンフィルタを実装する10(UIOの最大数を10に変更する)
UIOの最大数を増やす目的でやったのだが、どうやら、UIOのアドレスマップの最大数を決め る定数のようだ。結論から言うと、これはUIOの最大数には関係ないようだ。Linuxカーネルのリビルド方法。
ZYBOにHDLで書いたラ プラシアンフィルタを実装する11(バグはあるけど完成)
前回はUIOの最大数を 10 にしたつもりだったが、もしかしたらUIOのアドレス領域を 10 に増やしただけかもしれない?
原因は、/dev/uio5 のパーミッションが 600 だったことだった。パーミッションを 666 にしておけば、uImage も Vivado HLS で出力したドライバもそのまま動作した。

次の目標(並列ステレオカメ ラによる距離の測定)
次のお題だが、こういうのを考えている。
ZYBOを2台使用し、それぞれにカメラを搭載して、1台のカメラの画像をラプラシアンフィルタ変換を行い、HDMIでもう一台に送信する。
もう1台のZYBOでのHDMI信号を受けて、自分のカメラの画像のラプラシアンフィルタ変換画像と比較して、距離を計算する。
距離は色としてラプラシアンフィルタ画像にアルファブレンドする。
つまり、ステレオカメラからの距離によって、色が変化する画像をやってみたい。
ステレオカメラはZYBOに1台ずつ付けたカメラを2台のZYBOを使ってステレオカメラとする。
並列ステレオカメラによる距 離の測定1(ブロック図)
今回はステレオカメラによる距離の測定装置のブロック図を書いてみた。ブロック図を貼った。
並列ステレオカメラによる距 離の測定2(ZYBO 0 のハードウェア1)
今回は、ステレオカメラによる距離の測定装置のブロック図のZYBO 0 のハードウェアを作っていくことにする。
今回作製するブロックデザインは、”AXI4-Stream版ラプラシアンフィルタIPのカメラ表示システム4(ブロックデザイン2)”で大体出来上がってい る。これに、bitmap_disp_cntrler_axi_master を追加して、XGA解像度でHDMI を出力させれば完成する。元からある bitmap_disp_cntrler_axi_master_0 はHDMI ポート出力をオープンにする。
並列ステレオカメラによる距 離の測定3(ZYBO 0 のハードウェア2)
今回は、ZYBO_0 にXGA 解像度のビットマップ・ディスプレイ・コントローラを追加して、HDMIポートに接続した。ブロックデザインを完成させてビットストリームの生成までを行ったが、 タイミングエラーが出てしまった。
並列ステレオカメラによる距 離の測定4(ZYBO 0 のハードウェア3)
タイミング違反を確認して、タイミング違反がInter-Clock Path だったら、False Path を設定して、もう一度、インプリメント、ビットストリームの生成を行い、成功した。SDKを立ち上げた。
並列ステレオカメラによる距 離の測定5(ZYBO 0 のハードウェア4)
SDK上でアプリケーション・プロジェクトを作製して、ソフトウェアを作り、ZYBO上で動作 させた。VGAポートにはカメラ画像が出力された。
並列ステレオカメラによる距 離の測定6(ZYBO 0 のハードウェア5)完成
カメラ画像出力はできたのだが、タイミング違反が出ていたので、それを解消してから、ラプラシ アンフィルタ出力するようにソフトウェアを追加した。ラプラシアンフィルタ画像出力をすることができた。
並列ステレオカメラによる距 離の測定7(ZYBO 0 のハードウェア6)完成2
前回はZYBO でUbuntu を起動して、そこからカメラ出力かラプラシアンフィルタ出力かを選択できるようにしようということで終わったが、ベアメタル・アプリとしてスイッチでカメラ出力とラプラシ アンフィルタ出力を切り替えても良いのじゃないか?ということで、スライドSWの 0 番めが 0 だったらカメラ出力、1 だったらラプラシアンフィルタ出力にすることにした。
並列ステレオカメラによる距 離の測定8(Ubuntuで動作するアプリケーションを作る1)
Linuxを起動しなくても問題ないように standalone で動作するラプラシアンフィルタのアプリケーションを作製したが、やはり今後のためにもZYBO 上のUbuntu 14.04 LTS で動作するアプリケーションを作製しようと思う。
そのためには、最初にSDK でBOOT.bin を作製し、パソコンのVirtualBox 上のUbuntu 14.04 LTS で devicetree を作製しMicro SD カードにコピーした。
並列ステレオカメラによる距 離の測定9(Ubuntuで動作するアプリケーションを作る2)
ZYBO 上で動作するUbuntu 14.04 LTS 上でUIO ドライバを使用してカメラ画像を表示できる用にソフトウェア (cam_disp_vdma.c) を書いた。
並列ステレオカメラによる距 離の測定10(Ubuntuで動作するアプリケーションを作る3)
前回は、カメラ画像を表示するアプリケーションをUbuntu 14.04 LTS 上で作製した。できたと思っていたのだが、カメラ画像が1回しか書かれていなくて、連続して表示されていなかった。昨日修正したが、原因はフレームバッファの3フレーム目 のスタートアドレスを書くレジスタ (0xB4) にアドレスを間違えて書いてなかったためだった。AXI VDMAは 3 面以上のフレームバッファを使用しないと連続して画像を書けない様だ。(S2MM の場合)
今回は、ZYBO のUbuntu 14.04 LTS 上で、ラプラシアンフィルタ処理してその表示を行う lap_fil_on_axis.c とラプラシアンフィルタ表示からカメラ表示に戻す cam_return_axis.c を貼っておく。どちらも動作した。

SlideShare の Vivado and zybo linux勉強会資料を更新しました
yama さんから Vivado and zybo linux勉強会資料の更新情報を頂いたので、SlideShare の Vivado and zybo linux勉強会資料2 と Vivado and zybo linux勉強会資料3 を更新しました。

HDMI入力XGA表示回路 1(構想編)
ZYBO_0 はUbuntu 14.04 LTS からも制御できるようになって、完成した。次は、ZYBO_1 の方を作る。
なお、”並列ステレオカメラによる距離の測定1(ブロック図)”に書いたブロック図をもう一度示す。
HDMI入力XGA表示回路 2(Vivado プロジェクトの作製)
前回はHDMIから入力したSVGA画像をDDR3 SDRAMにバッファして、そこからディスプレイに表示するという構想を示した。今回は、実際にVivado 2015.4 のプロジェクトの作製を行った。
HDMI入力XGA表示回路 3(インプリメント)
前回は、ZYBO_1_XGA_test ブロックデザインを作製したところまでだったので、今回は、論理合成、インプリメント、ビットストリームの生成を行って、成功した。
HDMI入力XGA表示回路 4(実機で確認)
前回は、HDMI 端子から入力したXGAの画像をDDR3 SDRAM のフレームバッファにバッファして、SVGAで表示する回路のビットストリームを生成する事ができた。今回は、SDKでソフトウェアを作製して、実機でテストを行ったが、 上手く表示されなかった。
HDMI入力XGA表示回路 5(デバック1)
正常に動作すれば、XGA画像をHDMI から取り込んで、VGAの画面としてディスプレイに表示するはずなんだが、表示しない。そこで、Vivado Analayzer でデバックを試みることにした。
HDMI入力XGA表示回路 6(デバック2)
前回は、v_vid_in_axi4s_0 の AXI4-Stream の aclk クロックは FCLK_CLK_0 だが、axi_vdama_0 の s_axis_s2mm_aclk は dvi2rgb_0 の PixelClk だった。AXI4-Stream のMaster とSlave でクロックが違っていた。
それで、v_vid_in_axi4s_0 の AXI4-Stream の aclk クロックを dvi2rgb_0 の PixelClk に接続した。
HDMI入力XGA表示回路 7(完成)
v_vid_in_axi4s_0 の AXI4-Stream の aclk クロックとaxi_vdama_0 の s_axis_s2mm_aclk をPS のFCLK_CLK0 に接続してビットストリームを生成した。SDKでビットストリームをZYBO にダウンロードして、アプリケーションを走らせたが、うまく行かない。。。
PL に接続された125 MHz の水晶発信器からのクロックをPLL を介して200 MHz に変換したクロックを dvi2rgb IP の RefClk に接続したら、うまく行った。

ZYBO_0 と ZYBO_1_XGA_test との接続テスト
”HDMI入力XGA表示回路7(完成)”で、ZYBO_1_XGA_test が完成したので、”並列ステレオカメラによる距離の測定9(Ubuntuで動作するアプリケーションを作る2)”で完成したZYBO_0 をHDMI ケーブルで接続してテストすることにした。
送り元のZYBO_0 で VGAポートから出力し、それをZYBO_1_XGA_test で表示すると、黄色がピンク、ピンクが黄色になってしまうようだ。となると、緑と青が入れ替わっているっぽい。そこで色を入れ替えた。

ZYBO_0 を変更1(ブロックデザインの修正)
”ZYBO_0 と ZYBO_1_XGA_test との接続テスト”でZYBO を使用して、HDMI 出力から画像を出力して、HDMI 入力で入力して表示することは出来たのだが、どうもHDMI 間の転送がミスしているビットがあるようだ。
そこで、Digilent Vivado library のrgb2dvi IP を使用してHDMI 出力することにした。そのためには、bitmap_disp_cntrler_axi_master IP のTMDSインターフェースをDigilent 社のRGBインターフェースに変更する必要がある。また、今まで、bitmap_disp_cntrler_axi_master IP は25MHzのクロックを入れて、内部のMMCMで必要なピクセルクロックを生成していたが、外部からピクセルクロックを入力する方式に変更する。
ZYBO_0 を変更2(インプリメント)
前回はZYBO_0 のDigilent 社のrgb2dvi IP を使用したブロックデザインが完成した。今回は、それをインプリメントして、ビットストリームを生成した。

ZYBO_0_2 と ZYBO_1_XGA_test との接続テスト
以前、”ZYBO_0 と ZYBO_1_XGA_test との接続テスト”でもやったのだが、ZYBO_0_2 と ZYBO_1_XGA_test をHDMI で接続してテストしてみた。
うん、やはり、ZYBO_0 よりもZYBO_0_2 の方が安定している印象だ。こちらを使うことにしようと思う。
ZYBO_0_2 と ZYBO_1_XGA_test との接続テスト2
おるさんにコメントでご指摘頂いたので、右目カメラ画像の黒いドットは、ビットマップ・ディス プレイ・コントローラの画像用FIFOのアンダーフローではないか?と思い、FIFOの容量を変えるか?それともAXI4 Master のバス周波数を変えてみることにした。影響は無かった。

ZYBO_0 を変更3(Ubuntu 14.04 LTSのBOOT.binを変更)
”ZYBO_0_2 と ZYBO_1_XGA_test との接続テスト”で上手く行ったので、”並列ステレオカメラによる距離の測定8(Ubuntuで動作するアプリケーションを作る1)”で作製したBOOT.bin をもう一度、再生成した。
Ubuntu 14.04 も無事起動したし、カメラ画像も写った。もう1つのZYBO にZYBO_1_XGA_test を入れて、接続テストも行った所、成功した。

ZYBO_0_2 と ZYBO_1_XGA_test との接続テスト時の画像のバグのデバック1(HDMI 出力の確認)
”ステレオカメラによる距離測定テスト5(インプリメント成功)”まで作っておいて何だが、や はり、”ZYBO_0_2 と ZYBO_1_XGA_test との接続テスト”で左端に出ている余計な画像と画像中の黒いドットが気になる。左端の画像は距離を測定する上で問題になるかもしれないので、もう一度、回路を検証してみる ことにした。
HDMI 出力は問題無さそうに見える。
ZYBO_0_2 と ZYBO_1_XGA_test との接続テスト時の画像のバグのデバック2(アプリの変更)
前回は、ZYBO_0_2 から出力されるHDMI 出力はどうやら良さそうだ。ということが分かった。今回は、HDMI を受ける側のZYBO_1_XGA_test を変更して、バグが直るかどうかを確認したが、やはり黒いドットは表示されている。(ZYBO_0_2 のビットマップ・ディスプレイ・コントローラのバグフィックス2でバグフィックスできた)

udmabuf を使用したZYBO_0_2 のアプリケーション
”デバイスドライバ udmabuf を使用する2”でZYBO_0_2 (カメラ画像のHDMI 出力装置)の cam_disp_vdma アプリケーションが udmabuf デバイス・ドライバを使用して動作した。(ZYBO_0_2 の情報は”ZYBO_0 を変更3(Ubuntu 14.04 LTSのBOOT.binを変更)”辺りを参照のこと)
他のラプラシアンフィルタ画像出力アプリケーション lap_fil_on_axis やラプラシアンフィルタ画像を出力している時に生のカメラ画像に戻るアプリケーションの cam_return_axis を試してみた。

ZYBO_0_2のビット マップ・ディスプレイ・コントローラのバグフィックス
ZYBO_0_2 のビットマップ・ディスプレイ・コントローラのワードレーンがおかしいようなので修正を行った。
ZynqのPSのユニットはすべてリトル・エンディアンだったが、ビットマップ・ディスプレイ・コントローラで使用している入力64ビット幅、出力32ビット 幅の非同期FIFOはXilinx社の仕様からビック・エンディアンだった。つまり、ワード(32ビット)単位でレーンがひっくり返る訳である。以前はカメ ラ・インターフェース・モジュールも64ビット幅でカメラ・データを転送していたので、ワード・レーンはビック・エンディアンだったが、問題が無かった。その 時は、ARMプロセッサから画像データを読む際には、4 と排他的論理和を取ったアドレスから読んでいた。つまりワード・レーンをひっくり返していた(32ビット単位で隣のアドレスとひっくり返した)わけだ。
StereoCamTest のビットマップ・ディスプレイ・コントローラのバグフィックス
”ZYBO_0_2のビットマップ・ディスプレイ・コントローラのバグフィックス”で右目カメ ラ画像をHDMIで送り出すためのZYBO_0_2 プロジェクトのビットマップ・ディスプレイ・コントローラのバグをフィックスした。今度は、右目カメラ画像をHDMI経由で受けて、左目カメラ画像を取り込む StereoCamTest プロジェクトのビットマップ・ディスプレイ・コントローラのバグを同様にフィックスすることにした。
StereoCamTest プロジェクトのデバック1
StereoCamTest プロジェクトで、HDMI経由で転送されてきた右目カメラ画像に黒いドットが入っているバグがあるので、修正を試みた。バグを確認した。
StereoCamTest プロジェクトのデバック2
前回は、dvi2rgb IP から出ている出力がSVGA だったというのがショックだった。XGA サイズの画像をHDMI で出力しているのだが。。。そのデバックをしてみた。このバグは解消されたようだ。
ZYBO_0_2のビット マップ・ディスプレイ・コントローラのバグフィックス2
今回は、右目カメラ画像に出ている黒いドットを消すことができた。良かった。非常に嬉しい。

ZYBO ボードの状況
スイッチが壊れたので、交換した。

AXI VDMAのMM2Sを使用してビデオ出力1(構想編)
現在のMT9D111 カメラのフレームレートは 800 x 600 の 15 fps なのだが、AXI VDMA IPでカメラ画像のAXI4-Stream から DMA する時に 3 つ以上のフレームバッファの時にしかDMA されない。ビデオ出力は私の作ったbitmap_disp_cntrler_axi_master で出力しているのだが、それは 1 つのフレームバッファにしか対応していない。よって、AXI VDMA IP で書かれた 3 つのフレームバッファの内の最初の 1 つをbitmap_disp_cntrler_axi_master で表示している。したがって、フレームレートが 1/3 になってしまう。
今回は、今まで S2MM のみ使用したAXI VDMA のMM2S も使って、ビデオ出力をしようと思う。
AXI VDMAのMM2Sを使用してビデオ出力2(Vivadoのブロックデザイン)
前回、AXI VDMA のMM2S も使いたいという話をしたが、今回は、Vivado 2016.1 でプロジェクトを作成して、ブロックデザインを完成させた。
AXI VDMAのMM2Sを使用してビデオ出力3(シミュレーション1)
前回、AXI VMDA の S2MM と MM2S を両方使用したブロックデザインを作製した。今回は、そのブロックデザインをシミュレーションしようと思う。だが、Zynq のPS はプロセッサのモデルが無くてそのままではシミュレーションが出来ない。そこで、reg_set_axi_lite_master IP を使用する。このIP は言ってみれば、設定ファイル(vdma_reg_set.txt)の設定内容(2行構成で、最初の行がアドレス、次の行が書き込むデータの2行構成の組がある)を AXI4 Lite Master でIP のレジスに書き込むIP である。もう1つメモリのモデルの mem_sim_axi_slave を使用する。これは、汎用のメモリ・モデルだ。
AXI VDMAのMM2Sを使用してビデオ出力4(シミュレーション2)
前回はシミュレーション時にエラーが出てしまった。今回はシミュレーション時のエラーを解消し た。具体的には、rgb2dvi IP を削除した。

AXI VDMA を使用したカメラ表示システムのフレームレートを 5 fps から 15 fps にする
AXI VDMA の S2MMで、3 フレームバッファ以上しか設定できないので、カメラの画像を 3 つのフレームバッファに入力していた。それを 1 つのフレームバッファしか扱えない自作のビットマップ・ディスプレイ・コントローラで画像を表示したので、3 つのフレームバッファの内の 1 つのフレームバッファしか表示用に使用できないので、フレームレートが 1/3 になっていた。
カメラのフレームレートは 15 fps なので、実質、5 fps になっていたわけだ。
今のところ、3 つのフレームバッファは連続的にアドレスを割り振っている。今日、シミュレーション用の設定定義ファイルを書いていた時に、気がついた。3 つのフレームバッファのアドレスをビットマップ・ディスプレイ・コントローラのアドレスだけにすればフレームレートは 1/1 じゃないか?と。。。つまり、3 つのフレームバッファのアドレスを同一にする訳だ。

AXI VDMAのMM2Sを使用してビデオ出力5(シミュレーション3)
reg_set_axi_lite_master IP のレジスタ設定ファイル vdma_reg_set.txt にアドレスと設定値を入れて、シミュレーションを行った。
最初はAXI VDMA の MM2S の設定で、その後は、AXI4-Stream Switcher の設定がある。
AXI VDMAのMM2Sを使用してビデオ出力6(インプリメントしたがエラー)
前回、v_axis_vid_out IP が出力していないのが不安ではあるが、AXI VDMA からは出力が出ているので、ZYBO 実機で試してみようということで、ブロックデザインを修正して論理合成、インプリメントしてみたが、エラーが出てしまった。シミュレーションを元にブロックデザインを修正 した。
AXI VDMAのMM2Sを使用してビデオ出力7(実機でテスト)
前回はビットストリームの生成まで出来たので、今回は、アプリケーションを作って、ZYBOの 実機でテストした。
cam_disp_axis.c を AXI VDMA の MM2S を使う仕様に変更して、ZYBO実機でテストしてみたが、何も表示されない。
AXI VDMAのMM2Sを使用してビデオ出力8(シミュレーション4)
前回はZYBOを使って実機でテストしてみたが、画像は出力されなかった。今回はシミュレー ションをもう一度やってみた。
AXI VDMAのMM2Sを使用してビデオ出力9(プロジェクト休止)
前回、シミュレーションで、AXI GPIO をVTC の aresetn に追加して、1 フレーム目にAXI VMDA のMM2S が出力された。
今回は実機でVivado Analyzer を使って実際にどうなっているかを確かめてみた。
やはり、どうにもAXI VDMA は相性が悪いみたいで、どうもうまく行かない。中止にすることにした。

ZYBO 上のOpenCV で白線検出1(equalizeHist() を使用した場合)
”Vivado HLS を使用した車の白線検出9(Canny フィルタ3)”で、大体Vivado HLS による C シミュレーションでは白線検出が出来てきたと思うので、本命のZYBO のOpenCV 環境でまずはソフトウェアで、どのくらいの速度で白線検出をできるかどうかをテストしてみた。
ZYBO 上のOpenCV で白線検出2(equalizeHist() を使用した場合2)
前回は、equalizeHist() を使用し、Canny フィルタを掛けて、HoughLine 変換で道路の白線検出を行った。しかし、画像を読み込む時点で白黒画像に変換していた。ハードウェアでは、カメラで撮影した画像を白黒変換して、Canny フィルタを掛ける予定なので、白黒画像変換の部分の経過時間も測る必要がある。それでC++ ソースコードを修正した。更に、白黒画像変換+Canny フィルタの経過時間を測定した。
ZYBO 上のOpenCV で白線検出3(Canny フィルタのみの場合)
今回は前回のコードはそのままに、10行目の”#define HIST”をコメントアウトして、equalizeHist() を使用しないで、Canny フィルタのみで白線検出を行うことにする。なお、Canny フィルタのスレッショルドは、試行錯誤して、最適化したつもりだ。

Vivado HLS で生成した AXI4 Master DMA IP を使用したカメラ画像表示システム3(ILAコアの挿入)
前にやったのは半年くらい前だが、DMA Read IPが動作しないということで止まっていた。しかし、”「Vivado HLS で DMA Read IP を作る2(絶対アドレス指定版)」を使って合成後の機能シミュレーション3”で論理合成しても機能シミュレーションが問題なくなったということで、もう一度やってみようと 思う。
Vivado HLS で生成した AXI4 Master DMA IP を使用したカメラ画像表示システム4(ILAコアの挿入2)
DMA_Read_addr_0 の m_axi_in_r と outs は波形が出ていて動作しているようだった。よって今回は、AXI4-Stream 版のビットマップ・ディスプレイ・コントローラの内部信号をVivado Analyzer で確認してみよう。
Vivado HLS で生成した AXI4 Master DMA IP を使用したカメラ画像表示システム5(ILAコアの削除)
前回、Vivado HLS で生成した AXI4 Master DMA IP を使用したカメラ画像表示システムが動作した。しかし、ブロックデザイン上で挿入したILA コアとネットリストの信号を観察するため入れたILA コアが残ってしまっている。それを削除した。
Vivado HLS で生成した AXI4 Master DMA IP を使用したカメラ画像表示システム6(アプリの変更と30fpsへ)
前回は、Vivado HLS で生成した AXI4 Master DMA IP を使用したカメラ画像表示システムから 2 つの ILA コアを削除した。今回は、アプリケーションソフトを整備した後で、15 fps のカメラのフレームレートを 30 fps に変更する。

”ZYBOのクロス開発環境の構築 (2017年10月時点)”をやってみました
”ZYBOのクロス開発環境の構築 (2017年10月時点)”が出ていたので、ZYBO のYocto を久しぶりにビルドしてみました。

ZYBOでUbuntu を起動したらネットワークがつながらない
Zynq+Vivado HLS勉強会は 7 回から 8 回に変更になった。最後の回は、任意精度固定小数点データ型とVivado HLS のOpenCV対応を追加した。今日はZYBO でUbuntu 14.04 を立ち上げて、その上で、Vivado HLS で生成したAXI4 Lite Slave インターフェースのIP を使う方法をやる予定だ。
その下準備をしていたところ、ZYBO のボード・ファイルを使用して作成したブロック・デザインで、ネットワークが動作しなかった。いろいろとやってみたが、どうにも動作しない。もしかしてということで、 ZYBO Z7-20のネットワークがつながらなかった例を思い出した。

ZYBO Z7-20 の PS の UART のビットレートを変更する(ベアメタル・アプリケーション)
ZYBO Z7-20 の PS の UART のビットレートは 115200 bps に設定されている。これではスピードが足りないので、もっと高いビットレートを設定することにした。




inserted by FC2 system