ZedBoard

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

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

 WebPACK14.2 でZedBoardのHello Worldチュートリアルをやってみた1(エラー発生)
ZedBoradを使えるようになったので、ISE WebPACK14.2でHello Worldチュートリアルをやってみた。XPSを起動するところでライセンス違反で怒られた。XPSを起動するところでライセンス違反で怒られた。
 WebPACK14.2 でZedBoardのHello Worldチュートリアルをやってみた2(Logic EditionでXPS) 
アドバイスを元にISE14.2 WebPACKをアンインストールして、ISE14.2 Logic Edition をインストールして、WebPACKのライセンスで動かした。エラーは出るが、WebPACKでXPSプロジェクトを作成、編集できた。
 WebPACK14.2 でZedBoardのHello Worldチュートリアルをやってみた3(SDK)
前回はXPSプロジェクトの設定を行った。今回はSDKを使用して Hello World を Tera Term に表示できた。

 WebPACK14.2 でZedBoardのPS & PLチュートリアルをやってみた1(XPSプロジェクトの生成) 
”ZedBoard: Zynq-7000 AP SoC Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design 8/22/2012”の次のチュートリアル、25ページからの”Chapter 3 Embedded System Design Using the Zynq Processing System and Programmable Logic”をやってみることにした。
XPSでのZynqの設定まで。
 WebPACK14.2 でZedBoardのPS & PLチュートリアルをやってみた2(IPの追加) 
 AXI General Purpose IO、AXI Timer/Counter、ChipScope AXI Monitor、ChipScope Integrated Controller をXPSプロジェクトに追加した。
 WebPACK14.2 でZedBoardのPS & PLチュートリアルをやってみた3(IPの設定)
AXI General Purpose IO、AXI Timer/Counter、ChipScope AXI Monitor、ChipScope Integrated Controller の設定を行った。
 WebPACK14.2 でZedBoardのPS & PLチュートリアルをやってみた4(インプリメント)
PlanAheadプロジェクトに戻って、論理合成、インプリメントを行った。
 WebPACK14.2 でZedBoardのPS & PLチュートリアルをやってみた5(SDK)
PlanAheadでのインプリメントを終了したので、ハードウェアをエクスポートして、 SDKを立ち上げた。
 WebPACK14.2 でZedBoardのPS & PLチュートリアルをやってみた6(実機でテスト)
SDKでコンパイルが終了したので、今回は実機で動作を確認した。無事に動作した。
 WebPACK14.2 でZedBoardのPS & PLチュートリアルをやってみた7(SDKデバック)
SDKでのデバックのやり方を確認した。
 WebPACK14.2 でZedBoardのPS & PLチュートリアルをやってみた8(ChipScopeによるデバック) 
”ZedBoard: Zynq-7000 AP SoC Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design 8/22/2012”の36ページの”4.2 Take a Test Drive! Debugging Hardware Using ChipScope Software”をやってみた。要するにChipScope Analyzer でAXI4バスの様子を確かめてみた。

 ZedBoard のGetting Started Guideをやってみた1
ZedBoard.org のSupport -> Documentation ページの ZedBoard Getting Started Guide をやってみた。
ス イッチの値の表示(Demo 1 – Interacting with GPIO Switches and LEDs )、OLEDの制御(Demo 2 – OLED Display)、VGA表示(Demo 3 – VGA Display )、HDMI表示(Demo 4 – HDMI Display)
 ZedBoard のGetting Started Guideをやってみた2 
イーサネットへの接続(Demo 5 – Ethernet)、SSHターミナルデモ、Demo 6 – USB-OTG 、SDカード(Demo 7 – SD Card)

 ZedBoard にキャラクタ・ディスプレイ・コントローラを追加する1(XPSプロジェクト)
ZedBoardにキャラクタ・ディスプレイ・コントローラを追加しようと思う。キャラクタ・ ディスプレイ・コントローラからVGA端子に出力しようと思っている。
PlanAheadプロジェクトを作成し、XPSプロジェクトを作成して、独自IPのcdc_axi_slave_v1_00_a をAdd IPした。
 ZedBoard にキャラクタ・ディスプレイ・コントローラを追加する2(インプリメント)
前回は、キャラクタ・ディスプレイ・コントローラを追加したXPSプロジェクトを作製した。今 回はインプリメントを行った。
cdc_axi_slave.vhd のソースファイルとUCFファイルを貼ってある。
 ZedBoard にキャラクタ・ディスプレイ・コントローラを追加する4(ChipScopeデバック1)
VGA画面に文字は表示されなかったので、ChipScopeでデバックを行った。 ChipScope とSDKのデバックモードは競合してしまい、同時に使用できない。
 ZedBoard にキャラクタ・ディスプレイ・コントローラを追加する5(完成)
ィスプレイにキャラクタの表示が出ないというバグで悩んでいたが、バグが解消してキャラクタが ディスプレイに表示できるようになった。

 ZedBoard にビットマップ・ディスプレイ・コントローラを追加する1(XPSの設定1)
ビットマップ・ディスプレイ・コントローラとキャラクタROMのIPをZedBoardのプロ ジェクトに追加することにした。
ZedBoard用のPlanAheadプロジェクトを生成し、EDK(XPS)プロジェクトを追加して、axi_timer の設定まで終了。
 ZedBoard にビットマップ・ディスプレイ・コントローラを追加する2(XPSの設定2)
XPSの設定の続き。XPSの設定は終了して、PlanAheadに戻った。
 ZedBoard にビットマップ・ディスプレイ・コントローラを追加する3(インプリメント1)
前回でXPSプロジェクトの設定が終了したので、今回はインプリメントを行った。ビットスト リームまで生成できた。
 ZedBoard にビットマップ・ディスプレイ・コントローラを追加する4(SDK)
ビットマップ・ディスプレイ・コントローラをインプリメントすることが出来。今回はSDKでソ フトウェアを作って、以前同様にキャラクタROMからキャラクタデータを読み込んで、ビットマップ・ディスプレイ・コントローラに表示してみることにした。
ビ デオ信号がディスプレイに行っていないようだ。キャラクタ・ディスプレイ・コントローラの時は、デバックモードを起動したらディスプレイにビデオ信号が 入った。多分、High Performance AXI 32b/64b Slave Ports のところがうまくいっていないのか?ChipScopeをかけて調べてみることにした。
 ZedBoard にビットマップ・ディスプレイ・コントローラを追加する5(ChipScopeデバック) 
前回、ディスプレイに映像信号が出ていないようなので、ChipScopeを入れて検証してみ ることにした。
やはり何も動作していないようだ。
 ZedBoard にビットマップ・ディスプレイ・コントローラを追加する6(完成とは言えない) 
あ れからいろいろデバックをしてきたが、原因がよく分からなかった。最初のAXI4バスのRead address channelのやり取りは完了している様な波形だったので、スタートのAXI4バス、Read address channelのRead要求をみるために、85秒間のWaitを回路に挿入してみた。そうしたところ、ビットマップ・ディスプレイ・コントローラが動作 し始めた。
でもまだ、描画がおかしい。
 ZedBoard にビットマップ・ディスプレイ・コントローラを追加する7(GPIOを使ってBDCをスタート)
前 回は、ビットマップ・ディスプレイ・コントローラが動いたけど、最初にリセットが解除されてから85秒間のWaitが必要だった。それはとっても面倒なの で、ARMの初期化ルーチンが終了してから、ビットマップ・ディスプレイ・コントローラが動作するように変更した。GPIOを使用して、ARMのソフト ウェアでビットマップ・ディスプレイ・コントローラのスタートの合図をすることにした。
動作するようになった。
 ZedBoard にビットマップ・ディスプレイ・コントローラを追加する8(ACPを使用)
前 回はディスプレイに表示しているキャラクタがおかしかった。それを直すためにARMプロセッサに接続するAXIポートを変更してみた。今までは、High Performance AXI 32b/64b Slave Portst越しにDDR3 SDRAMをビットマップ・ディスプレイ・コントローラから使用していたが、今度は64b AXI ACP Slave Portを使ってDDR3 SDRAMからピクセルデータを読むことにした。うまく行かなかった。後で、設定が間違っていることがわかった。
 ZedBoard にビットマップ・ディスプレイ・コントローラを追加する9(MBを追加)
前 回はACPポートにビットマップ・ディスプレイ・コントローラを接続したがHP0ポートの時と変化がなかった。ACPポートからHP0ポートに戻した。次 は、ビットマップ・ディスプレイ・コントローラの動作を確かめるためにPL部にMicroBlazeを入れて、そこからフレームバッファのDDR3 SDRAMにキャラクタを書き込んでみることにした。
SDKからARMとMicroBlaze の両方を操作する方法がわからないため、この方法は断念した。
 ZedBoard にビットマップ・ディスプレイ・コントローラを追加する10(char_wirte_axi_master IPを追加1)
ビッ トマップ・ディスプレイ・コントローラのXPSプロジェクトにMicroBlazeを入れると、SDKでどうしてもARM-A9のブートコードが動作しな いようだ。PL部にクロックが回っていない。方法が見つからないので、MicroBlazeを全部抜いてしまって、ビットマップ・ディスプレイ・コント ローラのフレームバッファのDDR3 SDRAMにキャラクタをWriteするIPを作ることにした。仕様を決定した。
 ZedBoard にビットマップ・ディスプレイ・コントローラを追加する11(char_wirte_axi_master IPを追加2)
DDR3 SDRAMのフレーム・バッファにキャラクタを書き込むchar_write_axi_master IP ができた。単体シミュレーションを行った。
 ZedBoard にビットマップ・ディスプレイ・コントローラを追加する12(char_wirte_axi_master IPを追加3)
前回、DDR3 SDRAMのフレーム・バッファにキャラクタを書き込むchar_write_axi_master IPの単体シミュレーションが出来たので、XPSプロジェクトにAdd IPした。S_AXI_HP0に接続した。動作しなかった。
 ZedBoard にビットマップ・ディスプレイ・コントローラを追加する13(char_wirte_axi_master IPを追加4)
前 回は単体シミュレーションがうまく行ったDDR3 SDRAMのフレーム・バッファにキャラクタを書き込むchar_write_axi_master IPをXPSプロジェクトに組み込んだが、うまく行かなかった。今回はトラブルシュートしてみた。バグを修正できて、動作するようになった。
 ZedBoard にビットマップ・ディスプレイ・コントローラを追加する14(ソースの公開)
ハードウェアでキャラクタを書き込むバージョンのビットマップ・ディスプレイ・コントローラ IP のHDLコードを公開した。
 ZedBoard にビットマップ・ディスプレイ・コントローラを追加する15(ChipScope での評価)
DDR3 SDRAMのフレーム・バッファにキャラクタを書き込むchar_write_axi_master IPのChipScope による評価を行った。
キャ ラクタをキャラクタROMから読んで、AXIバスでDDR3 SDRAMにWriteし終わるまでに掛かった時間は306クロックだ。クロックの周波数は100MHz、クロック周期は10nsec だから、306クロック x 10nsec = 3.06usec となる。
 ZedBoard にビットマップ・ディスプレイ・コントローラを追加する16(ARMのソフトからキャラクタを書けた)
実 は、アナデバのリファレンス・デザインを見ていたが、HDMIの出力画像はARMのソフトウェアから書いてあった。それだと、”ZedBoardにビット マップ・ディスプレイ・コントローラを追加する6(完成とは言えない)”の様にキャッシュ?のために表示がおかしくなるはずなのに正常に表示されている。 その違いはどこなのか、ソフトウェアを調べてみた。
そうすると、メモリに書いた後に、Xil_DCacheFlush(); を実行していました。これだ~~~と思いましたね。。。
ARMのソフトウェアからキャラクタをディスプレイに書くことができました。
 ZedBoard にビットマップ・ディスプレイ・コントローラを追加する17(ARMのソフトからキャラクタを書けた2) 
前 回、ZynqのARMプロセッサのソフトウェアからビットマップ・ディスプレイ・コントローラに文字を書くことが出来た。その際使用した関数は Xil_DCacheFlush(); だった。これはソースを読んでみるとL1, L2キャッシュをすべてフラッシュするようだ。これでは、画像フレームバッファをキャッシュするキャッシュラインだけでなく他のキャッシュラインもフラッ シュされてしまう。これでは無駄が大きい。その内に、Xil_DCacheFlushLine((unsigned int)addr); という関数をツイッターで教えて頂いた。これだったら、当該キャッシュラインだけをフラッシュすることができるはずだ。
問題なく文字が表示された。やはり文字を表示するのが速い。
 ZedBoard にビットマップ・ディスプレイ・コントローラを追加する18(再度ACPポートを使用)
ツ イッターでACPポートの使用方法がTRMに書いてあると教えてもらったで、やってみることにした。ARVALID と一緒に ARUSER[0] = 1 および ARCACHE[1] = 1をアサートするそうだ。だいぶまともになったが、まだ、描画したキャラクタの最初が乱れる。

 ZedBoard でHDMI出力1(アナデバのリファレンス・デザイン)
ZedBoard に付いているHDMIポートから画像を出力してみたい。ZedBoard.orgのCommunity Projects のリンクからANALOG DEVICESのReference Design をダウンロードして、サンプルを試してみた。サンプル・デザインは動作した。
 ZedBoard でHDMI出力2(ChipScope AXI Monitor でAXIバスを観察1)
XPS プロジェクト上の axi_vdma_0 のHP0バスと、axi_hdmi_tx_16b_0 とaxi_vdma_0 間のAXI Stream バスにChipScope AXI Monitor をつないで信号を観測してみることにした。接続してインプリメントを行った。
 ZedBoard でHDMI出力3(ChipScope AXI Monitor でAXIバスを観察2) 
アナデバのZedBoard HDMI出力回路のAXIバスの波形をChipScope AXI Monitor をつないで観測した。
 ZedBoard でHDMI出力4(ChipScope AXI Monitor でAXIバスを観察3)
VDMAからaxi_hdmi_tx_16b_0 につながっているAXI-streamバスのトランザクションを見た。
 ZedBoard でHDMI出力5(BDC の作製1)
HDMI出力とVGA出力を同時に出来るBitmap Display Controller (BDC) を作ることにした。今までのBDC は、VGA出力だけだったが、それにHDMI出力を追加する。ブロック図を書いて仕様の検討。
 ZedBoard でHDMI出力6(ADV7511の勉強)
ADV7511の機能について探っていく覚書の最初
 ZedBoard でHDMI出力7(ADV7511のレジスタ設定1)
ANALOG DEVICESのリファレンス・デザインにおける画像の主要なADV7511のレジスタ設定を見ていきます。
 ZedBoard でHDMI出力8(ADV7511のレジスタ設定2)
 ZedBoard でHDMI出力9(ADV7511のレジスタ設定3)
 ZedBoard でHDMI出力10(ADV7511のピクセル入力レジスタ設定)
自分でADV7511を使うという視点からADV7511にピクセルデータを入力する信号につ いてまとめた。
 ZedBoard でHDMI出力11(ビットマップ・ディスプレイ・コントローラ単体テスト)
ADV7511のことが大体わかったので、HDMI出力回路をビットマップ・ディスプレイ・コ ントローラに付けることにした。
bitmap_disp_cntrler_axi_master.v にconv_hdmi_out.v を追加した。bitmap_disp_cntrler_axi_master.v を示した。conv_hdmi_out.v を示した。単体テストはOKだ。
 ZedBoard でHDMI出力12(ビットマップ・ディスプレイ・コントローラのインプリメント) 
HDMI出力付きBDC のインプリメントを行った。使用しているバージョンはPlanAhead 14.3。
リ ファレンス・デザインのADV7511の設定をHDMIからDVIに変更してやってみたところ、HDMIから出力はされたのだが、色がおかしくなってし まった。VGAへの出力の色は問題ない。現在の解像度はVGA画像(640x480)で、ピクセルクロックは25MHzだ。
 ZedBoard でHDMI出力13(HDMIに出力できた)
ADV7511のマニュアルにバグがあったので、修正したらHDMIに表示することが出来た。 HDMIモードでは正常に表示できたが、DVIモードでは正常に表示ができなかった。
 ZedBoard でHDMI出力14(YCbCr4:2:2 変換)
YCbCr4:2:2 の変換方式について検討した。アナデバのリファレンス・デザインのYCbCr4:2:2 の変換方式の方が良いという結果になった。

ZedBoard用CMOS カメラボードの作製1(カメラモジュールの検討)
ZedBoard用にCMOSカメラを付けることにしたので、カメラを選定し、MT9D111 に決定した。
ZedBoard用CMOS カメラボードの作製2(基板の発注)
日昇テクノロジに発注したMT9D111メガピクセルカメラモジュール が、昨日届きました。同時に設計していた基板も出来上がり、今日、FusionPCBに発注しました。
ZedBoard用CMOS カメラボードの作製3(MT9D111の設定値の決定)
MT9D111の設定方法は大体理解したので、設定方法を決定しようと思う。
ZedBoard用CMOS カメラボードの作製3(MT9D111用基板が到着)
今日、MT9D111用基板が到着しました。12月9日に発注したので、13日で届きました。 2週間かかっていないので、早いです。頼んだのはFusionPCBです。
ZedBoard用CMOS カメラボードの作製4(これからの方針)
ZedBoard用CMOSカメラボードが来たので、ハンダ付けをして1つ作ってみたい。
カメラ用FPGA回路の検討
ZedBoard用CMOS カメラボードの作製5(カメラボード完成)
昨日、FPGA-CAFEで2列のヘッダを購入してきたので、カメラボードの部品をハンダ付け して完成しました。カメラボードの写真。
ZedBoard用CMOS カメラボードの作製6(カメラボード改)
ZedBoard 用CMOSカメラ回路の作製9(ともかく写った)でカメラの上下を間違えてしまったので、基板を作りなおした。
ZedBoard用CMOS カメラボードの作製7(カメラボード改が来ました)
カメラの上下が正常なCMOSカメラボードがFusionPCBから到着した。

ZedBoard用カメラ回 路のソフトウェアを書く上でのまとめ
今までのMT9D111のまとめ記事やAXI IICの使い方の勉強の記事を見やすいように、まとめた。

ZedBoard用CMOS カメラ回路の作製1(単体シミュレーション)
ZedBoard用CMOSカメラ回路を作っていた。大体できたので、AXI4 Slave BFMを使って単体テストをした。
ZedBoard用CMOS カメラ回路の作製2(HDLソースの公開1)
mt9d111_inf_axi_master.vhd、 mt9d111_cam_cont.v、pixel_fifo.xco のHDLソースを公開した。
ZedBoard用CMOS カメラ回路の作製3(HDLソースの公開2)
mt9d111_inf_axi_master_tb.v、mt9d111_model.v、 AXI Slave Bus Function Mode (BFM)のHDLソースを公開した。
ZedBoard用CMOS カメラ回路の作製4(XPSプロジェクトの作製)
ZedBoard用のカメラ回路IPが出来たので、XPSプロジェクトでプロジェクトに追加を 行った。 MT9D111用の信号のIOパッドを固定するところまで。
ZedBoard用CMOS カメラ回路の作製5(制約、インプリメント)
 PlanAheadプロジェクトでタイミング制約を作成してからインプリメントを 行った。
ZedBoard用CMOS カメラ回路の作製6(実機で動作確認、動作しない)
前回、インプリメントが終了した。次に、SDKにエクスポートし、ZynqのFPGA部分をコ ンフィギュレーションしてから、ソフトウェアを起動して動作させた。
しかし、カメラの画像は表示されなかった。残念。。。
ZedBoard用CMOS カメラ回路の作製7(バグ発見)
バグを発見した。
ZedBoard用CMOS カメラ回路の作製8(バグ修正)
前回見つかったバグを修正した。
ZedBoard用CMOS カメラ回路の作製9(ともかく写った)
カメラの上下を間違えてしまったが、バグを修正したらカメラ画像をディスプレイに表示できた。
ZedBoard用CMOS カメラ回路の作製10(画像の上下を反転)
C_UPSIDE_DOWN パラメータを追加して、TRUEだったら、カメラ画像の上下を反転することにした。正常な画像になったがノイズが見える。
ZedBoard用CMOS カメラ回路の作製11(正常に写った)
前回、正しい上下関係でCMOSカメラの画像を表示することが出来たが、ノイズが見えた。今回 はその原因を探って、バグをフィックスし、正常に表示することが出来た。
ZedBoard用CMOS カメラ回路の作製12(ChipScopeで検証)
 前回、正常にカメラ画像をディスプレイに表示することが出来たが、AXIバスの データ転送がシングル転送ということで、途中に入っている非同期FIFOが溢れていないかどうかをChipScopeを入れて確かめてみた。
ZedBoard用CMOS カメラ回路の作製13(カメラのテストパターンや特殊効果)
今回はカメラのテストパターンや特殊効果を試してみた。
ZedBoard用CMOS カメラ回路の作製14(カメラボード改2)
ZedBoard 用CMOSカメラボードの作製7(カメラボード改が来ました)で正常なカメラ基板が来た。これを使用して、フレームバッファの下位番地からテータ を転送することができるようになった。カメラ画像も表示できた。
ZedBoard用CMOS カメラ回路の作製15(ビットマップ・ディスプレイ・コントローラIPの変更)
Linux用の回路で画像が正常に表示できなかったので、Bare Metal アプリのZedBoard用 CMOSカメラ回路の作製14(カメラボード改2)の回路のフレームバッファのスタートアドレスを0x1A000000 に変更してやってみたところ、成功した。

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

カメラ回路を WebPACK14.4でインプリメントしてみた
完成したカメラ回路プロジェクトをWebPACK14.4でインプリメントできるかどうかやっ てみた。

ZedBoard Linuxの勉強1
ZedBoard のLinux から勉強していこうと思う。Digilent社のZedBoard_OOB_Designをやってみる。

ZedBoard Linux のフレームバッファにカメラ画像を表示1(ChipScopeで観察1)
Digilent 社のZedBoard 付属のLinuxはHDMI 出力に2頭のペンギンを表示している。この画像は1920x1080のHD画像だが、そこに800x600のカメラ画像を表示しようと思う。
そのために、VDMA がどのアドレスからペンギン画面を読んでいるかのアドレスが必要となるので、ChipScope AXI Monitor を入れて確かめてみることにした。
ZedBoard Linux のフレームバッファにカメラ画像を表示2(ChipScopeで観察2)
SDカードのLinuxブートイメージを作成した。SDカードをZedBoard に入れて電源ONしたら、無事にLinux が起動して、HDMI出力のペンギン画面も出力されていた。
ZedBoard Linux のフレームバッファにカメラ画像を表示3(ChipScopeで観察3)
今回はChipScope Pro Analyzer を使用して、実際のAXI VDMA のAXIバスのアクセスの様子を見た。
ZedBoard Linux のフレームバッファにカメラ画像を表示4(XPSで接続)
前回、Digilent社のLinuxのHDMIフレームバッファのアドレスがわかっ たので、そのアドレス (0x1A000000~0x1A7E9000) にカメラ画像を表示することにした。カメラ回路のフレームバッファ・アドレスと、ビットマップ・ディスプレイ・コントローラのスタートアドレスを 0x1A000000 からに変更した。
ZedBoard Linux のフレームバッファにカメラ画像を表示5(BitGen Error)
XPSプロジェクトをPlanAheadプロジェクトの下に入れたが、BitGenがエラーで ビットストリームを生成できなかった。
ZedBoard Linux のフレームバッファにカメラ画像を表示6(ISEでインプリメント)
前回、PlanAheadでバグっていたので、ISEプロジェクトでやってみた。ビットスト リームが生成できたが、画像が正常に表示されない。
ZedBoard用CMOS カメラ回路の作製15(ビットマップ・ディスプレイ・コントローラIPの変更)
Linux用の回路で画像が正常に表示できなかったので、Bare Metal アプリのZedBoard用 CMOSカメラ回路の作製14(カメラボード改2)の回路のフレームバッファのスタートアドレスを0x1A000000 に変更してやってみたところ、成功した。
ZedBoard Linux のフレームバッファにカメラ画像を表示7(AXI4バスをChipScopeで観測)
前回、カメラ画像のディスプレイ表示がおかしかったので、AXI4バスにChipScope AXI Monitor を入れてAXI4バスの波形を観察することにした。ChipScopeで見て、バグを捉えたので、修正を行った。
ZedBoard Linux のフレームバッファにカメラ画像を表示8(カメラ画像表示成功)
バグを修正し、インプリメントを行なって、回路動作を確かめてみたところ、Linuxは起動し ていない状態のBare Metalアプリでカメラ画像が表示できた。
ZedBoard Linux のフレームバッファにカメラ画像を表示9(SDKリモートデバック)
今回は、SDK14.4を使用して、パソコンのWindows 上のSDK14.4から、ZedBoardのLinuxにリモートデバックを行った。カメラ画像は表示されなかった。
ZedBoard Linux のフレームバッファにカメラ画像を表示10(SDKリモートデバック2)
PLLの周波数がおかしいことがわかったので、動作周波数を修正した。カメラ画像は表示された が、YUVモードになっていて、Linuxは応答がなくなってしまった。Linuxのワークメモリにカメラ画像を書いてしまった。
ZedBoard Linux のフレームバッファにカメラ画像を表示11(SDKリモートデバック3)
ZedBoard Linux のフレームバッファにカメラ画像を表示10(SDKリモートデバック2)と同じ設定で、カメラ画像が表示できた。後に、カメラ画像が 表示できるのは確率の問題だということがわかる。画像のフレームバッファのアドレスは動的に取られているらしい。cam_disp3_linux.c のソースコードあり。
ZedBoard Linux のフレームバッファにカメラ画像を表示12(SDカードのイメージ変更)
SDカードのイメージにカメラレジスタ設定プログラムを追加して、Linuxのブート時に自動 的に起動するように設定を行った。
ZedBoard Linux のフレームバッファにカメラ画像を表示13(未完成)
SDカードでLinuxを起動して、カメラ表示回路を生かしている状態で、Linux が死んでしまう確率は1/3だった。この時は画像のフレームバッファのアドレスが移動してしまっているようだ。カメラ表示回路のアドレスは固定。 Linuxのカーネルをいじって、画像のフレームバッファを固定するか、画像のフレームバッファのアドレスをカメラ表示回路に通知できるようにする必要が ある。
ZedBoard Linux のフレームバッファにカメラ画像を表示14(ChipScope波形)
前回、Camera Controller とBitmap Display Controller のレイテンシを測定したのは、Linux が動作していない状態だった。今回は、Linuxが動作して、HDMIにフルHDの画像を表示したり、Linuxが動作していて、DDR3 SDRAMの帯域を使っている状態だ。それで、どのくらい前回からレイテンシが伸びているかを測定した。

ZedBoardの Linuxカーネルコンパイルのテスト
ARMのツールチェーンを使用してZedBoardのカーネルコンパイルを行なって、成功し た。

SDKでDevice Treeを生成する1(Device Tree の概要)
Device Tree とは、Linuxカーネルにハードウェアの情報を伝えるファイルのことだそうだ。Device Tree を生成してみた。
SDKでDevice Treeを生成する2(SDKでxilinx.dtsを生成)
SDKからDevice Tree を生成した。
DTCでDevice Tree をコンパイルする1
DTC (Device Tree Compiler) を使って、xilinx.dts をコンパイルして、xilinx.dtb を生成して、実際にDevice Tree として使えるかどうかを確かめた。
DTCでDevice Tree をコンパイルする2
xilinx.dts をDTCでコンパイルすることができたが、それをdevicetree_ramdisk.dtb をとしてSDカードに入れて使用するとエラーになった。バグを修正して、もう一度、やってみるとフレームバッファの領域を確保することができなかった。そ こで、axi_iic_mt9d111 の .dts 上の記述を、元々Digilentから配布されているdevice_ramdisk.dts に追加してしまうことにした。
ZedBoard用 Digilent LinuxのSysfs
DTCファイルを読み込んでSysfs を作るようなので、Sysfs を実際に見てみた。
XPSプロジェクトにカスタ ムAX Slave Lite IPを追加してSysfsを見る
XPSプロジェクトにカスタムAX Slave Lite IP(char_wirte_axi_master)を追加して、同様にSysXPSプロジェクトのカスタムIPのMPDファイルの書き方を書いておこう と思う。MPDファイルはXPSプロジェクトのカスタムIPのパラメータやIOポートの情報などを書いておくファイルだ。XPSプロジェクトのカスタム IPのMPDファイルの書き方を書いておこうと思う。MPDファイルはXPSプロジェクトのカスタムIPのパラメータやIOポートの情報などを書いておく ファイルだ。fsを見るとどうなるか確かめてみた。

AX4 Master IPにAXI4 Lite Slave インターフェースを追加1(仕様の検討)
CMOSカメラ・インターフェース回路とビットマップ・ディスプレイ・コントローラに フレームバッファのスタートアドレスを指定するためのレジスタを付けようと思っている。このレジスタへのアクセスは、AXI4 Lite Slave バスを経由してARMプロセッサが行う。つまり、AXI4 Master と AXI4 Lite Slave の2つのAXI4バスを持つIPとなる。

カメラ・インターフェース IPにAXI4 Lite Slave インターフェースを追加1(ISimでエラー)
AXI4 Lite Slave インターフェース回路を作成した(HDLコードあり)。シミュレーションをしようとしたがエラーだった。エラーの原因はバスが長すぎることだった。
カメラ・インターフェース IPにAXI4 Lite Slave インターフェースを追加2(シミュレーション)
浅い階層にプロジェクトを移動してISimでシミュレーションを行った。成功した。テストベン チ、AXI4 Lite Slave インターフェースのHDLコードあり。
カメラ・インターフェース IPにAXI4 Lite Slave インターフェースを追加3(MPD, MUIファイルの作製)
MPDファイルとMUIファイルのソースコードあり。
カメラ・インターフェース IPにAXI4 Lite Slave インターフェースを追加4(XPSプロジェクト)
XPSプロジェクトでカメラ・インターフェースIPをAdd IPして、バスやポートを接続した。Design Rule Check を実行するまで。

ビットマップ・ディスプレ イ・コントローラIPにAXI4 Lite Slave バスを追加1(シミュレーション)
ビットマップ・ディスプレイ・コントローラIP (bitmap_disp_cntrler_axi_master.v) にAXI4 Lite Slave バスのシミュレーションを行った。
ビットマップ・ディスプレ イ・コントローラIPにAXI4 Lite Slave バスを追加2(XPSプロジェクト)
MPDファイルとMUIファイルを修正して、XPSプロジェクトにAdd IPした。

AXI4 Master IP にAXI4 Lite Slave を追加1(インプリメント)
ZedBoard_OOB_Desgin に、AXI4 Lite Slave によるレジスタを追加した CamInf IP と BDC IP を追加できたので、とりあえずWindows7 上でインプリメントを行った。
AXI4 Master IP にAXI4 Lite Slave を追加2(SDK)
インプリメントが終了したので、今度はSDKを立ちあげてソフトウェアをリコンパイルした。 DTSもうまく生成された。Linux環境に変更した。
AXI4 Master IP にAXI4 Lite Slave を追加3(DTSをコンパイル)
今回は、前回作った xilinx.dts をDTCでコンパイルした。
AXI4 Master IP にAXI4 Lite Slave を追加4(FSBLとBOOT.binの生成)
FSBL (First Stage Bootloader) と BOOT.bin を生成した。
AXI4 Master IP にAXI4 Lite Slave を追加5(Linuxを起動)
SDカードにdevicetree_ramdisk.dtb と BOOT.bin が書けたので、SDカードをZedBoard に挿入して電源をONしてLinux を起動してみた。
次に、Sysfs を確認した。カメラ・インターフェースIPとビットマップ・ディスプレイ・コントローラIP の項目があった。
AXI4 Master IP にAXI4 Lite Slave を追加6(Cテストプログラム)
SDKを立ちあげ、テストプログラムを作製して、AXI Lite Slave インターフェースの動作を調べようとしている。今回はC言語で書いたテストプログラムを書いた。
AXI4 Master IP にAXI4 Lite Slave を追加7(SDKリモートデバッグ)
C言語で書いたソフトウェアをVirtualBox 上に実装したUbuntu12.10 のSDKからZedBoardのディレクトリへダウンロードして、リモートデバッグを行った。動作しなかった。
AXI4 Master IP にAXI4 Lite Slave を追加8(ChipScopeデバッグ)
前回、カメラ・インターフェイスIPとビットマップ・ディスプレイ・コントローラIP のAXI4 Lite Slave バスに接続されたレジスタにRead/Write を行った。Readで読めた値は 0x1A000000 のはずが 0x00000000 だった。Writeで値を書き込むとZedBoardのLinux が死んでしまった。今回は、ChipScope AXI Monitor IP を入れて、AXI4バスに何が怒っているかを検証した。
AXI4 Master IP にAXI4 Lite Slave を追加9(バグフィックス)
前回のバグがわかったので、バグをフィックスできた。
AXI4 Master IP にAXI4 Lite Slave を追加10(ハードウェア完成)
前回の記事でバグをフックスしたので、今回はインプリメントし、SDKで BOOT.bin を生成して、SDカードにコピーしてZedBoardで確かめてみた。カメラ・インターフェイスIPとビットマップ・ディスプレイ・コントローラIPの両 方共、レジスタに書かれたフレームバッファにアドレスを使っていた。成功だ。

ZedBoard Linux のフレームバッファにカメラ画像を表示15(Linux既存のFBを使用)
前回、AXI4 Master バスと AXI4 Lite Slave バスを持つXPSプロジェクトのカスタムIPを作ることが出来た。今回は、Cプログラムを作って起動時にLinuxのペンギンが写っている既存のフレーム バッファをアドレスを取得して、カメラ・インターフェイスIPとビットマップ・ディスプレイ・コントローラIPのフレームバッファ・スタート・アドレス・ レジスタにWriteすることが出来た。

Triple Frame Buffer Controller の追加1(仕様の検討)
”画像のフレームバッファ”と”画像のフレームバッファ2(ライフサイクルをシミュ レーション)”で分かったことを、実際のZedBoard カメラ回路で確かめてみることにした。使用するのは、カメラ表示回路のベアメタル・アプリケーション版の”ZedBoard用CMOSカメラ回路の作製 14(カメラボード改2)”の回路に変更を施すことにした。
Triple Frame Buffer Controller の追加2(ポートの追加)
カメラ・インターフェイスIPとビットマップ・ディスプレイ・コントローラIPの前回の図に示 したポートを追加した。
Triple Frame Buffer Controller の追加3(単体シミュレーション)
HDLファイルを書いて、単体でシミュレーションを行った。書いたVerilog HDLファイルは、triple_fb_state.v、triple_fb_cntrler.v、それにテストベンチの triple_tb_cntrler_tb.v だ。
Triple Frame Buffer Controller の追加4(IPの追加)
XPSプロジェクトに、Triple Frame Buffer Controller IP を追加した。MPDファイルと、MUIファイルを貼った。
Triple Frame Buffer Controller の追加5(インプリメント、実機検証)
インプリメントを行なって実機で試してみた。ディスプレイで正常に表示された。手を画面上で動 かしても横筋は見えない。しかし、たまにおかしくなる時があった。まだバグが有る。(ブログには書いてないが、検証の結果そうなった)
カメラのクロックをオシロスコープで測定してみた。カメラから出力されるPCLK は、17.857MHz だった。

AXI VDMAを使ったカメラ表示回路の作製1(構想)
トリプルバッファリングを行うことができるAXI VDMAを使って、現在、ZedBoardでカメラ画像を表示ているシステムを構成してみようと思う。ブロック図を示した。

ZedBoard用フルカ ラーDVI出力アダプタ
エム・アイ・エーにZedBoard用フルカラーDVI出力アダプタを注文して届きました。

カメラ、ビデオ表示カスタム IPを AX4-Stream に変更1(使用するIPの検討)
AXI4 Master バスを使用して、PS部のDDR3 コントローラにAXI HPポート経由で画像データを書き込んでいたカメラ・インターフェイスIPを、AXI4-Streamバス対応に変更しようと思う。これは、AXI VDMAを使用して、画像データをDMAしようと思っているからだ。
使用するIPについて検討した。
カメラ、ビデオ表示カスタム IPを AX4-Stream に変更2(カメラ・インターフェースIP)
カメラモジュールのインターフェース用のIPについて検討した。

カメラ・インターフェース用 AXI4-Stream IPの作製1(仕様の検討)
カメラ、ビデオ表示カスタムIPを AX4-Stream に変更2(カメラ・インターフェースIP)”で仕様 を検討したカメラ・インターフェース用のAXI4-Stream IPを作製しようと思う。仕様を検討した。
カメラ・インターフェース用 AXI4-Stream IPの作製2(pixel_fifo の生成)
同期FIFOが必要になったので、pixel_fifo を生成した。
カメラ・インターフェース用 AXI4-Stream IPの作製3(シミュレーション)
HDLファイルを書いて、シミュレーションを行った。書いたHDLファイルは、カメラ のコントロールをする mt9d111_cam_conts.v と、その上の階層で、AXI4-Stream IPの mt9d111_inf_axi_stream.vhd、AXI4-Stream Slave のBFM(と言ってもTREADYに応答するだけ)axi4s_slave_BFM.vhd、元々作ってあったMT9D111カメラモジュールのモデルの mt9d111_model.v、それにテストベンチの mt9d111_inf_axi_stream_tb.v だ。
カメラ・インターフェース用 AXI4-Stream IPの作製4(HDLソース1)
”カメラ・インターフェース用AXI4-Stream IPの作製3(シミュレーション)”でシミュレーションしたHDLソースを貼っておきます。
mt9d111_cam_conts.v 、トップのVHDLファイルの mt9d111_inf_axi_stream.vhd
カメラ・インターフェース用 AXI4-Stream IPの作製5(HDLソース2)
シミュレーション用のHDLファイルを貼った。AXI4-Streamマスタの mt9d111_inf_axi_stream.vhd からのAXI4-Stream に接続し、TREADYを返すだけの axi4s_slave_bfm 、MT9D111のモデル、mt9d111_model.v
カメラ・インターフェース用 AXI4-Stream IPの作製6(AXI4-Stream IPの設定)
カメラ・インターフェース用AXI4-Stream IPの作製1(仕様の検討)”に書かれているように、 ar37425.zip を解凍して、ar37425/axi_stream フォルダをテンプレートとして、カメラ・インターフェース用のAXI4-Stream IP用に変更していく様子を示した。

Custom Video Timing Controller の作製1(仕様の検討)
AXI4-Stream to Video Outを使用するために、VTC(Video Timing Controller)の代わりになるものとして、Custom Video Timing Controller を作ろうと思う。仕様を検討した。
Custom Video Timing Controller の作製2(シミュレーション)
Verilog HDLで書いて完成したので、シミュレーションを行った。成功した。custom_vtc.v と custom_vtc_tb.v を貼った。
Custom Video Timing Controller の作製3(XPSにAdd IP)
XPSプロジェクトにAdd IPを行った。PAOファイル、MPDファイル、MUIファイルを貼った。

ZedBoard用画像出力 IPの作製1(仕様の検討)
ZedBoardのVGAコネクタと、HDMIコネクタに画像信号を出力するIP (video_out_zed) を作製する。
ZedBoard用画像出力 IPの作製2(シミュレーション)
”ZedBoard用画像出力IPの作製1(仕様の検討)”で仕様の検討が終了したの で、テストベンチを作製してシミュレーションを行った。シミュレーションの際には、custom_vtc.v も入れてテストベンチを作製した。video_out_zed.v と video_out_zed_tb.v を貼った。
ZedBoard用画像出力 IPの作製3(Add IP)
シミュレーションが終了したので、XPSプロジェクトへAdd IPした。PAOファイル、MPDファイル、MUIファイルを貼っておく。

AXI VDMAのレジスタ設定用AXI Lite Master IPの作製1(仕様の検討)
AXI VDMAのレジスタを設定するコントローラを AXI Lite Master として作製する。MicroBlaze でも良いのだが、MicroBlaze を実装すると大げさになってしまうし、ソフトウェアを初期値としてRAMにロードする手間も必要になる。AXI VDMAのレジスタを設定するだけの AXI Lite Master インターフェースを有した簡単なコントローラを自作することにする。
AXI VDMAのレジスタ設定用AXI Lite Master IPの作製2(シミュレーション)
AXI VDMAのレジスタを設定するコントローラのVerilog HDLコードとAXI4 Lite Master用AXI4 Lite Slave BFM(簡易版だけど)を作製できたので、シミュレーションを行った。reg_set_axi_lite_master.v のVerilog HDLコードを貼った。
AXI VDMAのレジスタ設定用AXI Lite Master IPの作製3(HDLソースの公開)
reg_set_axi_lite_master_tb.v 、axi_lite_slave_BFM.v のVerilog HDLコードを貼った。
AXI VDMAのレジスタ設定用AXI Lite Master IPの作製4(XPSへAdd IP)
、AXI4 Lite Master IPの reg_set_axi_lite_master を上に書いたシミュレーション用のXPSプロジェクト VDMA_test に、Add IPした。

AXI4 Slave インターフェースのメモリ・シミュレーション用 IP の作製1
AXI VDMAをシミュレーションするために何が足りないかというと、メモリのシミュレーション・モデルということになる。
AXI4 Slave インターフェースのメモリ・シミュレーション用 IP の作製2(シミュレーション)
OVLライブラリもISim で使用可能になったので、出来上がったAXI4 Slave インターフェースのメモリ・シミュレーション用 IPをシミュレーションしてみた。
AXI4 Slave IPのシミュレーション用メモリモジュール、mem_sim_axi_slave.v とmem_sim_axi_slave.v の下位モジュールの memory_8bit.v を貼った。
AXI4 Slave インターフェースのメモリ・シミュレーション用 IP の作製3(テストベンチ)
前回、ブログに貼れなかったテストベンチとOVLチェッカーを貼っておく。テストベンチ (mem_sim_axi_slave_tb.v ) とOVLチェッカー (OVL_Checker.v) を貼った。
AXI4 Slave インターフェースのメモリ・シミュレーション用 IP の作製4(Add IP)
出来上がったAXI4 Slave インターフェースのメモリ・シミュレーション用 IP をVDMAテスト用XPSプロジェクトにAdd IPする。

AXI VDMAのシミュレーション1
AXI VDMAシミュレーションをするために、今まで、いろいろとXPSプロジェクトのカスタムIPを作ってきた。それらのIPを集めて、AXI VDMAをシミュレーションするために、Project Navigator のプロジェクト(VDMA_test)を作った。
AXI VDMAのシミュレーション2(Generate Netlist)
デザイン・ルール・チェックが通ったので、ネットリストを生成してみた。失敗した。
AXI VDMAのシミュレーション3(Generate Netlist2)
前回、ネットリストが生成できなかったので、もう一度、プロジェクトを作り直した。ネットリス トを生成することが出来た。
AXI VDMAのシミュレーション4(インプリメント)
ほとんどのカスタムIPはインプリメントする予定なので、Project Navigator に戻ってインプリメントしてみた。
AXI VDMAのシミュレーション5(こんどこそシミュレーション)
インプリメントをしてみたので、こんどこそISim14.5でシミュレーションを行った。
AXI VDMAのシミュレーション6(reg_set_axi_lite_master のバグ)
AXI VDMAの設定レジスタに設定値を入れる必要がある。それにはどうするかというと、reg_set_axi_lite_master IPの vdma_reg_set.txt に設定するレジスタのアドレスと設定データを書いて、AXI VDMAの設定レジスタに書き込む必要がある。その、reg_set_axi_lite_master IPにバグが有ったので修正した。
AXI VDMAのシミュレーション7(v_axi4s_vid_out)
v_axi4s_vid_outだが、AXI4 Stream の s_axis_video_tdata と s_axis_video_tuser の値が X になっている。
AXI VDMAのシミュレーション8(とりあえず休止)
いろいろとAXI VDMAのシミュレーションのために頑張ってきたが、どうやら AXI VDMAの m_axis_mm2s_tdata, m_axis_mm2s_tkeep, m_axis_mm2s_tuser が 'X' になる状況は解決できないようだ。AXI4-Streamのデータ幅が24ビットの場合はXになってしまう。
AXI VDMAのシミュレーション9(v_axi4s_vid_outの変更)
s_axis_video_tdata のMM2Sのデータ幅を24ビットから32ビットに変更した。
AXI VDMAのシミュレーション10(シミュレーション成功)
カメラ・インターフェース回路のmt9d111_inf_axi_stream のデータバス幅を24ビット幅から32ビット幅に変更した。シミュレーションができるようになった。(しかし、v_axi4s_vid_out のビデオ信号出力が出ないので自作することにした)
AXI VDMAのシミュレーション11(シミュレーション成功2)
前回、シミュレーションが成功したと書いたが、v_axi4s_vid_out IP の video_... の信号が出て無かった。従って、HDMIの信号が出力されていない。
そこで、v_axi4s_vid_out IP と互換(あくまで私が想定する用途ではということです)のカスタムIPを自分で作った。
シミュレーションすることができたが、13msecほどシミュレーションすると、ISimが落ちてしまう
AXI VDMAのシミュレーション12(ハードウェア協調シミュレーション)
ISimのハードウェア協調シミュレーションを試みたができなかった。
AXI VDMAのシミュレーション13(Questaでシミュレーション)
AXI VDMA回路のシミュレーションをQuesta で行った。成功した。

ZedBoard Linux上でカメラの画像を処理する1(準備編)
ZedBoard Linux上でカメラ画像を処理しようと思う。まずは現状確認と手段の検討をした。
ZedBoard Linux上でカメラの画像を処理する2(準備編2)
今回は、フレーム・バッファのアドレスをファイルに書いておくようにするのが目的だ。 ZedBoardのLinux起動時に、Linuxのペンギンが写っている既存のフレームバッファをアドレスを取得して、カメラ・インターフェイスIPと ビットマップ・ディスプレイ・コントローラIPのフレームバッファ・スタート・アドレス・レジスタにWrite するようなCソフトウェアを実行している。そのソフトウェアでフレーム・バッファの開始アドレスをfb_start_addr.txt というファイルに書いておくようにしようと思う。そのために起動時のCソフトウェアを変更した。
今のところ、SDKリモートデバッグ経由だが、ZedBoardのLinux上で起動して、fb_start_addr.txt に開始アドレスが入るのを確認できた。
ZedBoard Linux上でカメラの画像を処理する3(ラプラシアンフィルタ1)
ラプラシアンフィルタを実行するCのソフトウェア(Laplacian_Filter.c)を作製した。ISE14.4だとデバックができない。
ZedBoard Linux上でカメラの画像を処理する4(ラプラシアンフィルタ2)
”ZedBoard Linux上でカメラの画像を処理する3(ラプラシアンフィルタ1)”でどうしても、ラプラシアン・フィルタのソフトウェアで、fb_start_addr.txt をオープンすることが出来なかった。今回は、修正済みのカメラ画像表示用ソフトウェアの cam_disp3_linux.elf を予めSDカードに書き込んでから、ラプラシアン・フィルタのソフトウェアをSDKリモートデバッグすることにした。
SDK14.6 にして、何度かビルドしてやってみたら、デバックができるようになった。

ZedBoardのRevisionの違い
前から使用しているZedBoardはRev.Cです。もう1枚、ZedBoardを最近購入して、それは、Rev.Dでした。

AXI VDMAを使ったカメラ画像回路の作製1(プロジェクトの作製)
”Vivado 2013.4でAXI VDMAを使ったカメラ表示回路の作製17(ハードウェアのデバック5)”まで、Vivado 2013.4でAXI VDMA を使ったカメラ画像回路を作ってきたが、Vivado 2013.4だと、動作が重いので、ISEで試作してみようと思った。

inserted by FC2 system