FC2カウンター FPGAの部屋 2012年09月
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

ZedBoardにビットマップ・ディスプレイ・コントローラを追加する6(完成とは言えない)

ZedBoardにビットマップ・ディスプレイ・コントローラを追加する5(ChipScopeデバック)”の続き。

あれからいろいろデバックをしてきたが、原因がよく分からなかった。最初のAXI4バスのRead address channelのやり取りは完了している様な波形だったので、スタートのAXI4バス、Read address channelのRead要求をみるために、85秒間のWaitを回路に挿入してみた。そうしたところ、ビットマップ・ディスプレイ・コントローラが動作し始めた。多分、DDR3 SDRAMコントローラをARMが設定する期間(トレーニングシーケンスが終了するまでかも?)はAXI_HP0に要求出してはダメなのかも知れない?init_done の様な信号があるかな?と思って探してみたのだが、見つからない。ARESETNがディアサートされてから、すぐ始めてはダメなのだと思う。どの位Waitすれば良いかは分からない?とりあえず、85秒Waitすれば動作することはわかった。

・SDKのデバックモードではCソフトウェアの最初の行で停止している。
ZedBoad_BitMap_DispCnt_59_120930.png

・その時の画面の様子を下に示す。ランダムなデータの画面だ。
ZedBoad_BitMap_DispCnt_69_120930.jpg

・VGAの画面を全てクリアする予定のルーチンを実行した。
ZedBoad_BitMap_DispCnt_60_120930.png

・Atlysボードではうまく動いたと思ったのだが、ZedBoardのARMでは、途中だけクリアされていた。
ZedBoad_BitMap_DispCnt_70_120930.jpg

・VGA画面いっぱいにキャラクタを描画するルーチンを実行した。
ZedBoad_BitMap_DispCnt_61_120930.png

・画面いっぱいに字は書かれているようなのだが、おかしいのがわかる。
ZedBoad_BitMap_DispCnt_71_120930.jpg

・もう一度、画面にキャラクタを描画すると、状況が変わった。ただし、画面は揺らいでいないので、ビットマップ・ディスプレイ・コントローラがDDR3 SDRAMのフレームバッファからReadしたデータは一定していると思われる。
ZedBoad_BitMap_DispCnt_72_120930.jpg

・ChipScopeの画面を示す。最初に、画像フレームが始まった時の64ビット幅のデータをDDR3 SDRAMから128バーストで読んでくる時のものだ。S_AXI_HP0はAXI3で16バーストしかバーストしないが、どうやらAXIインターコネクトで、その辺を吸収してくれているようだ。
ZedBoad_BitMap_DispCnt_62_120930.png

・前のWaveウインドウの前の部分を拡大するとこうなる。要求してからデータが来るまでに約20クロック、200nsec かかっていた。
ZedBoad_BitMap_DispCnt_63_120930.png

・通常の動作では、ピクセルデータでReadしたデータを出力して、ピクセルを貯めておくFIFOが半分になると、容量の半分だけDDR3 SDRAMからReadする。その状況を下に示す。
ZedBoad_BitMap_DispCnt_64_120930.png

・XカーソルとOカーソルの差分が63なので、64クロック期間データを読んできている。
ZedBoad_BitMap_DispCnt_65_120930.png

・Readバースト間のクロック数は513クロックなので、64 / 513 x 100 = 12.5% バス帯域の占有率は12.5% だった。(VGA (640x480ピクセル)解像度です。1ピクセル = 32bit (4Bytes))
ZedBoad_BitMap_DispCnt_66_120930.png

次に、キャラクタがおかしい原因を追求しようと思ったが、先に確実に動作するようにしようか?と思う。(実はやってみたい、良いと思われる案があるのだ)
  1. 2012年09月30日 17:58 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

Zynq-7000のHigh Performance AXI 32b/64b Slave PortsはAXI3バスだった

ZedBoardでビットマップ・ディスプレイ・コントローラを作っているが、このためには、ARMプロセッサ側につながれているDDR3 SDRAMをHigh Performance AXI 32b/64b Slave Portst越しにProgram Logic (PL) 部から使う必要がある。
ZedBoad_BitMap_DispCnt_67_120930.png

このHigh Performance AXI 32b/64b Slave Portstは、実はAXI3バスでした。てっきりハイパフォーマンスと歌われているので、AXI4バスだとばかり思っていたのだが。。。
ZedBoad_BitMap_DispCnt_68_120930.png

AXI3バスはAWLEN, ARLENが4ビットで最大16バーストだ。ビットマップ・ディスプレイ・コントローラでは、最大128バーストしているので、ビットマップ・ディスプレイ・コントローラIPの書き直しが必要かと思ったが、AXIインターコネクトでよしなに処理してくれるようで、AXI4マスタ側では気にしなくても大丈夫のようだ。実際に動作していると思う。(弱気なのは動作が少しおかしいからだ)

LogiCORE IP Processing System 7 (v4.00.a)の34ページから49ページに記載されいてる。(S_AXI_HP0, S_AXI_HP1, S_AXI_HP2, S_AXI_HP3)
  1. 2012年09月30日 08:38 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:0

ZedBoardにビットマップ・ディスプレイ・コントローラを追加する5(ChipScopeデバック)

ZedBoardにビットマップ・ディスプレイ・コントローラを追加する4(SDK)”の続き。

前回、ディスプレイに映像信号が出ていないようなので、ChipScopeを入れて検証してみることにした。

・PlanAheadでChipScopeを掛けた。そしてインプリメントを行い、ChipScopeを起動した。(”PlanAhead14.1でChipScope Proを試してみた1(ChipScope の設定)”と”PlanAhead14.1でChipScope Proを試してみた2(ChipScope Analyzer)”を参考にした)

・ChipScope PROのコアを挿入して、PlanAheadでインプリメント完了したところからブログを始める。

・Atlysボードの電源をONする。

・File メニューからExport -> Export Hardware for SDK... を選択した。

・Export Hardware ダイアログが開く。Launch SDKにチェックを入れて、OKボタンをクリックした。

・SDKが立ち上がり、Updata .bit and .bmm filesダイアログが出た。アップデートを反映するので、Yesボタンをクリックした。
ZedBoad_BitMap_DispCnt_50_120928.png

・SDKのProjectメニューからClean...を選択して、すべての生成ファイルをCleanした。リコンパイルが始まって終了した。

・SDKのXilinx Toolsメニューから Program FPGA を選択した。

・Program FPGA ダイアログが出た。Program ボタンをクリックした。ビットファイルがダウンロードされ、PLファブリックがプログラムされる。
ZedBoad_BitMap_DispCnt_42_120925.png

・PlanAheadの左のProgram and Debug からChipScope Analyzer をクリックする。
ZedBoad_BitMap_DispCnt_51_120928.png

・ChipScope Analyzerが立ちあがった。左上のOpen Cable/Search JTAG Chain アイコンをクリックする。
PlanAhead141_134_120525.png

・Zynqが見つかった。ZynqはARMプロセッサとFPGAの2つから出来ているのよく分かる。
ZedBoad_BitMap_DispCnt_56_120928.png

・ダイアログのOKボタンをクリックした。ChipScope Pro Analyazer の状態を下に示す。まだ、信号はDataPortと表示されているだけで、正しい信号名を表示していない。
ZedBoad_BitMap_DispCnt_57_120928.png

・ZedBoard_BitMap_DispCont_142\ZedBoard_BitMap_DispCont_142.runs\impl_1 のdebug_nets.cdc を指定した。debug_nets.cdc にどのDataPortがどの信号に対応するかが書いてある。
ZedBoad_BitMap_DispCnt_52_120928.png

・これでChipScope Analyzer のWaveウインドウに信号名が入った。
ZedBoad_BitMap_DispCnt_58_120928.png

・SDKの drawn_disp プロジェクトの右クリックメニューから Debug As -> Debug Configurations... を選択した。

・Debug Configurations ダイアログが開く。Debugボタンをクリックした。
ZedBoad_BitMap_DispCnt_53_120928.png

・ここではデバックモードに移行するのに失敗してしまった。

・もう一度、SDKのXilinx Toolsメニューから Program FPGA を選択し、ビットストリームをZynqにダウンロードしてから、SDKをデバックモードにするとSDKがデバックモードになった。
ZedBoad_BitMap_DispCnt_54_120928.png

・デバックモードにした時点で、PL部へのクロックが設定されてChipScopeが表示できるようになった。
ZedBoad_BitMap_DispCnt_55_120928.png

う~ん。やはり何も動作していないようだ。

なお、”ZedBoardにキャラクタ・ディスプレイ・コントローラを追加する4(ChipScopeデバック1)”でmicroUSBケーブルでZedBoardのPROGポートに接続しただけでは、ChipScopeとSDKのデバックモードの両方は使用することができなかった。K林さんにヒントを頂いて、解消することが出来た。それは、”14.2 SDK - Simultaneous SDK and ChipScope debug causes system to crash”にリンクが示されている51534.zip をダウンロードする。それを解凍するとxmd.exeが出てくるので、それをWindows 32ビット版を使っている人は、Xilinx\14.2\ISE_DS\EDK\bin\nt\unwrapped に入れる。Windows 64ビット版を使っている人は、Xilinx\14.2\ISE_DS\EDK\bin\nt64\unwrapped にも入れる。そうすると、パソコンからmicroUSBケーブルでZedBoardのPROGポートに接続しただけで、ChipScopeとSDKのデバックモードの両方を使用することが出来た。現在それでデバックしている。
  1. 2012年09月29日 05:07 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:4

ZedBoardにビットマップ・ディスプレイ・コントローラを追加する4(SDK)

ZedBoardにビットマップ・ディスプレイ・コントローラを追加する3(インプリメント1)”の続き。

ビットマップ・ディスプレイ・コントローラをインプリメントすることが出来。今回はSDKでソフトウェアを作って、以前同様にキャラクタROMからキャラクタデータを読み込んで、ビットマップ・ディスプレイ・コントローラに表示してみることにした。
SDKがデバックモードに入らなくなってしまって1日潰してしまった。今も原因は良くわからない?SDKは不安定がことが多いので、日頃から何回かやり直しているが、ここまでダメだったのは初めてだ。もしSDKの動作がおかしい時には、一旦SDKを終了して、xmdやjavaw? などのプロセスが残っていないことを確認してから、再度SDKを立ちあげて、Program FPGAを実行してからデバックしている。

・PlanAheadのFile メニューからExport -> Export Hardware for SDK... を選択した。

・Export Hardware ダイアログが開く。Launch SDKにチェックを入れて、OKボタンをクリックした。

・Hardware 構成をExport してSDKが立ち上がった
ZedBoad_BitMap_DispCnt_36_120925.png

・FileメニューからNew -> Xilinx C Projectを選択した。

・New Projectダイアログが開いた。Empty Application を選択して、Project Name をdrawn_disp とした。
ZedBoad_BitMap_DispCnt_37_120925.png

・次のダイアログで、Board Support Package をdrawn_disp_bsp_0 としてFinish ボタンをクリックした。
ZedBoad_BitMap_DispCnt_38_120925.png

・各プロジェクトが作成された。
ZedBoad_BitMap_DispCnt_39_120925.png

・drawn_disp プロジェクトのsrc フォルダの右クリックメニューから New -> Source File を選択した。
ZedBoad_BitMap_DispCnt_40_120925.png

・ファイル名をdrawn_disp.c に指定した。
ZedBoad_BitMap_DispCnt_41_120925.png

・Xilinx Toolsメニューから Program FPGA を選択した。

・Program FPGA ダイアログが出た。Program ボタンをクリックした。ビットファイルがダウンロードされ、PLファブリックがプログラムされる。(これもFailした時があったので、その時はiMPACTからPLをコンフィグした)
ZedBoad_BitMap_DispCnt_42_120925.png

・SDKの draw_disp プロジェクトの右クリックメニューから Debug As -> Debug Configurations... を選択した。
ZedBoad_BitMap_DispCnt_43_120926.png

・Debug Configurations ダイアログが開く。Xilinx C/C++ ELF を右クリックして、右クリックメニューからNew を選択した。
ZedBoad_BitMap_DispCnt_44_120926.png

・Applyボタンをクックしてから、Debug ボタンをクリックした。

・そうするとReset Statusダイアログが出てきた。今までどおりデフォルト値でやっているのだが、OKボタンをクリックした。
ZedBoad_BitMap_DispCnt_46_120926.png

・Error Launch Program ダイアログが出てきた。エラーになってしまった。
ZedBoad_BitMap_DispCnt_47_120927.png

ず~と、昨日はこの様な調子で全くデバックができなかった。更に、キャラクタ・ディスプレイ・コントローラをやってみても同様になってしまっていた。しばらくいろいろやって見たが、どうにもこうにも埒が明かない。それで、”WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた6(実機でテスト)”の104.~106.でRun Configuration を作っている。これを作ってみたらどうか?ということで作ってみたら、デバックモードでデバックがうまくいくようになった。
ZedBoad_BitMap_DispCnt_49_120927.png

これでデバックモードを起動してみたが、ビデオ信号がディスプレイに行っていないようだ。キャラクタ・ディスプレイ・コントローラの時は、デバックモードを起動したらディスプレイにビデオ信号が入った。多分、High Performance AXI 32b/64b Slave Ports のところがうまくいっていないのか?ChipScopeをかけて調べてみることにした。

  1. 2012年09月27日 05:36 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

ZedBoardにビットマップ・ディスプレイ・コントローラを追加する3(インプリメント1)

”ZedBoardにビットマップ・ディスプレイ・コントローラを追加する2(XPSの設定2)”の続き。

前回でXPSプロジェクトの設定が終了したので、今回はインプリメントを行う。

・PlanAheadでトップファイルを作成する。Sources ウインドウでsystem.xmp を選択し、右クリックメニューからCreate Top HDL をクリックした。

・system_stub.v が生成され、トップファイルとなった。
ZedBoad_BitMap_DispCnt_29_120924.png

・制約ファイルを生成した。
ZedBoad_BitMap_DispCnt_30_120924.png

・制約ファイル system_stub.ucf に、キャラクタ・ディスプレイ・コントローラの時と同じ制約をコピーした。
ZedBoad_BitMap_DispCnt_31_120924.png

・論理合成を行ったところ、成功した。

・インプリメントを行ったところでcritical warning が出た。RAMB16BWER を使っているというワーニングだった。bitmap_afifo.ngc を生成した時はAtlysボード用だったので、Zynqでは対応していないプリミティブを使ってしまったようだった。キャラクタ・ディスプレイ・コントローラの時もAtlysボード用のNGCファイルだったのだが、そっちは問題なかった。
ZedBoad_BitMap_DispCnt_32_120924.png

・PlanAhead でもエラーが出てしまった。これはFIFOのIPコアを再生成する必要がある。
ZedBoad_BitMap_DispCnt_33_120925.png

・ビットマップ・ディスプレイ・コントローラ IPの単独の検証環境をProject Navigator で作ってあるので、Atlysボード用のプロジェクトをZedBoardのフォルダにコピーしてFPGAデバイスをZynqに変更した。
ZedBoad_BitMap_DispCnt_34_120925.png

・bitmap_afifo をRemove して、新たにもう一度、CoreGen でbitmap_afifo を作った。設定は以前と同じにした。

・PlanAheadのXPSプロジェクトを起動して、ProjectメニューからRescan User Repositories を選択した。

・ProjectメニューからClean All Generated Files を選択した。

・XPSを閉じて、PlanAheadで論理合成、インプリメントを行った。更にビットストリームも生成できた。
ZedBoad_BitMap_DispCnt_35_120925.png

  1. 2012年09月25日 05:57 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

ZedBoardにビットマップ・ディスプレイ・コントローラを追加する2(XPSの設定2)

ZedBoardにビットマップ・ディスプレイ・コントローラを追加する1(XPSの設定1)”の続き。

引き続きXPSの設定を行う。

・最初にNameなどのバーを右クリックして、右クリックメニューからNet を選択した。
ZedBoad_BitMap_DispCnt_19_120924.png

・これでNetが表示された。
ZedBoad_BitMap_DispCnt_20_120924.png

・Portsタブで、bitmap_disp_cntrler_axi_master_0 の外部ポートを接続した。
ZedBoad_BitMap_DispCnt_15_120924.png

・次にpixclk に25MHzを入力する必要がある(今回のビットマップ・ディスプレイ・コントローラはVGA解像度)。processing_system7_0 を開いて、FCLK_CLK1のNetでNew Connection を選択した。
ZedBoad_BitMap_DispCnt_18_120924.png

・FCLK_CLK1 に新しいネット名 processing_system7_0_FCLK_CLK1 が割り当てられた。
ZedBoad_BitMap_DispCnt_21_120924.png

・bitmap_disp_contler_axi_master_0 の pixclk をprocessing_system7_0_FCLK_CLK1 に接続した。Netの下向き山印で選択する。
ZedBoad_BitMap_DispCnt_22_120924.png

・ZynqタブのClock Generation をクリックした。
ZedBoard_CDC_SVGA_8_120916.png

・Clock WizardでFCLK_CLK1を25MHzに設定した。
ZedBoad_BitMap_DispCnt_16_120924.png

・設定後にLog が出た。いろいろなクロックの情報が見えた。
ZedBoad_BitMap_DispCnt_17_120924.png

・Portsタブに戻って、Processing_system7_0 のIRQ_F2P がNo Connection なのでaxi_timer_0のInterrupt に接続する。 L to H: No Connection をクリックする。

・Interrupt Connection Dialog で、 axi_timer_0のInterruptを矢印で Connected Interrrpt(s) ペインに移動した。OKボタンをクリックした。
ZedBoad_BitMap_DispCnt_23_120924.png

・Processing_system7_0 のIRQ_F2P がL to H: axi_timer_0_Interrupt に接続された。
ZedBoad_BitMap_DispCnt_24_120924.png

・ProjectメニューからDesign Rule Check を選択した。
ZedBoad_BitMap_DispCnt_25_120924.png

エラーが出てしまった。HP0に関するエラーのようだ。

・エラーが解消できた。ZynqタブのHigh Performance AXI 32b/64b Slave Ports をクリックした。

・XPS Core Configダイアログが開く。HP0 Base Address とHP0 High Addess のAuto を外して、HP0 Base Address に0x10000000 を入れてOKボタンをクリックしてから、もう一度、XPS Core Configダイアログを立ちあげて、0x00000000 に戻した。
ZedBoad_BitMap_DispCnt_26_120924.png

・もう一度、ProjectメニューからDesign Rule Check を選択した。
ZedBoad_BitMap_DispCnt_27_120924.png

エラーは無くなった。

・XPSを閉じて、PlanAheadに戻った。
ZedBoad_BitMap_DispCnt_28_120924.png
  1. 2012年09月24日 05:21 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

ZedBoardにビットマップ・ディスプレイ・コントローラを追加する1(XPSの設定1)

前回でZedBoardにキャラクタ・ディスプレイ・コントローラを移植できた。AXI4バスのIPにしておいたので、簡単に移植できた(バグがなければ)。今度は、ビットマップ・ディスプレイ・コントローラとキャラクタROMのIPをZedBoardのプロジェクトに追加しようと思っている。ついでにaxi_timer も追加したい。

ZedBoard用のPlanAheadプロジェクトを生成し、EDK(XPS)プロジェクトを追加して、ZedBoardのPS設定のXMLファイルをロードした。この辺のやり方は、”WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた1(XPSプロジェクトの生成)”を参照した。ただし、今回もWebPACKを使用していない。
ZedBoad_BitMap_DispCnt_1_120923.png

今回はHigh Performance AXI 32b/64b Slave Ports にビットマップ・ディスプレイ・コントローラを接続して、DDR3 SDRAMを使う予定なので、どのくらいのレイテンシがあるか、とっても楽しみだ。キャラクタROM IPは、32b AXI Master Ports に接続する。

・H:\HDL\FndtnISEWork\Spartan6\Atlys\test\Atlys_XPS_CamDisp_PA_142\Atlys_XPS_CamDisp_PA_142.srcs\sources_1\edk\system\pcores からbitmap_disp_cntrler_axi_master_v1_00_a とchar_rom_axi_lite_v1_00_a をK:\HDL\FndtnISEWork\Zynq-7000\ZedBoard\ZedBoard_BitMap_DispCont_142\ZedBoard_BitMap_DispCont_142.srcs\sources_1\edk\system\pcores にコピーした。

・bitmap_disp_cntrler_axi_master_v1_00_a を、HDMI端子出力用からVGA端子出力用に書き換えた。dvi_disp.vhd やDigilent社のライブラリを削除して、その他のHDLファイルを書き換えた。

・bitmap_disp_cntrler_axi_master_v1_00_a の.mpd, .pao ファイルを書き換えた。

・char_rom_axi_lite_v1_00_a は修正点は無い。

・IP Catalog にUSERが増えて、その中にbitmap_disp_cntrler_axi_master とCharROM AXI Lite Slave が追加された。最初にbitmap_disp_cntrler_axi_master を右クリックメニューからAdd IPを行う。
ZedBoad_BitMap_DispCnt_2_120923.png

・確認のダイアログが出る。Yesボタンをクリックした。

・XPS Core Config ダイアログが出る。System タブでC_M_AXI_DATA_WIDTH を64にした。(ビットマップ・ディスプレイ・コントローラのAXI4バスの幅は64ビット長)また、C_M_AXI_SUPPORTS_WRITE のチェックを外した。ビットマップ・ディスプレイ・コントローラはピクセルデータをDDR3 SDRAMからReadするだけで、Writeはしない)
ZedBoad_BitMap_DispCnt_3_120923.png

・XPS Core Config ダイアログのOKボタンをクリックした。

・IPコアをどのプロセッサに接続するかを決めるダイアログが出る。processing_system7_0 が選ばれている。
ZedBoad_BitMap_DispCnt_4_120923.png

・S_AXI_HP0 でプロセッサと接続された。
ZedBoad_BitMap_DispCnt_5_120923.png

・Zynqタブで見ると、確かにHigh Performance AXI 32b/64b Slave Ports の1つのポートを使用している。
ZedBoad_BitMap_DispCnt_6_120923.png

・次に、CharROM AXI Lite Slave の右クリックメニューからAdd IPを行う。

・確認のダイアログが出る。Yesボタンをクリックした。

・XPS Core Config ダイアログが出る。そのままOKボタンをクリックした。
ZedBoad_BitMap_DispCnt_7_120923.png

・IPコアをどのプロセッサに接続するかを決めるダイアログが出る。processing_system7_0 が選ばれている。
ZedBoad_BitMap_DispCnt_8_120923.png

・キャラクタROM IP は、M_AXI_GP0 で接続された。
ZedBoad_BitMap_DispCnt_9_120923.png

・Zynqタブでも、32b AXI Master Ports にキャラクタROM IPが接続されていた。
ZedBoad_BitMap_DispCnt_10_120923.png

・IP Catalog のDMA and Timer を開いて、AXI Timer/Counter をAdd IPした。
ZedBoad_BitMap_DispCnt_11_120923.png

・確認のダイアログが出る。Yesボタンをクリックした。

・XPS Core Config ダイアログが出る。そのままOKボタンをクリックした。
ZedBoad_BitMap_DispCnt_12_120923.png

・IPコアをどのプロセッサに接続するかを決めるダイアログが出る。processing_system7_0 が選ばれている。
ZedBoad_BitMap_DispCnt_13_120923.png

・axi_timer が、M_AXI_GP0 に接続された。
ZedBoad_BitMap_DispCnt_14_120923.png


今回は64ビット幅のデータバスだったから、素直にHigh Performance AXI 32b/64b Slave Ports に接続されたと思う。だが、High Performance AXI 32b/64b Slave Ports に接続したいAXI4 Master IPはどうやって指定するのだろう?32ビットデータバス幅のAXI4 Master IPは32b GP AXI Slave Ports に接続されないのだろうか?

ZedBoardにビットマップ・ディスプレイ・コントローラを追加する2(XPSの設定2)”に続く。

  1. 2012年09月23日 05:55 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

ZedBoardにキャラクタ・ディスプレイ・コントローラを追加する5(完成)

”ZedBoardにキャラクタ・ディスプレイ・コントローラを追加する4(ChipScopeデバック1)”の続き。

前回、ディスプレイにキャラクタの表示が出ないというバグで悩んでいたが、バグが解消してキャラクタがディスプレイに表示できるようになった。

バグは何だったかというと、CharDispCtrler.v のところでVGA信号の出力ポートにつないでいるVerilogコードがあった。それを下に示す。

assign VGA_RED = {red_node,0};
assign VGA_GREEN = {green_node,0};
assign VGA_BLUE = {blue_node,0};


red_node, green_node, blue_node は3ビット長の信号で、それを4ビット長のVGA_RED, VGA_GREEN, VGA_BLUE に接続するために下に1ビットの0を付けるはずだったのが、0と書いてしまったので、32ビット幅に拡張されてしまったようだ。それで、VGA_RED, VGA_GREEN, VGA_BLUE はいつでも0になってしまった。これを下のように書きなおした。

assign VGA_RED = {red_node,1'b0};
assign VGA_GREEN = {green_node,1'b0};
assign VGA_BLUE = {blue_node,1'b0};


これで、論理合成、インプリメントを行い、ハードウェアをSDKにエクスポートしてやってみるとディスプレイに文字が表示された。
ZedBoard_CDC_SVGA_40_120921.jpg

表示したプログラムを下に示す。
ZedBoard_CDC_SVGA_41_120921.png

#include "xparameters.h"

int main()
{
    int *cdc_addr = (int *)XPAR_CDC_AXI_SLAVE_0_S_AXI_RNG00_BASEADDR;
    int i, charval;

    for (i=0, charval=0xffc1; i<7500; i++){
        *(volatile unsigned int *)(cdc_addr++) = charval++;
    }

    return 0;
}


注:キャラクタのデータ (chaval) のフォーマットは、15ビット目~13ビット目の3ビットがRedの明るさ、12ビット目から10ビット目の3ビットがGreenの明るさ、9ビット目から7ビット目の3ビットがBlueの明るさ、6ビット目から0ビット目の7ビットがアスキー・コードです。
charval = 0x41; にして、'A'を表示しようとしても、RGBの値が0なので表示しません。RGBの明るさも設定して下さい。


同時にChipScopeもS_AXI_AWVALID でトリガをかけてあった。ChipScope Analyzer Pro のWaveform ウインドウを下に示す。
ZedBoard_CDC_SVGA_42_120921.png

さすが、667MHzのARM9でバスアクセスを出しているだけあって、Writeアクセスが密に並んでいる。今度は前の部分を拡大してみた。
ZedBoard_CDC_SVGA_43_120921.png

AXI4バスのWriteアクセスの間隔は12クロックだった。クロックは100MHzなので、1クロックは10nsec、12クロックで120nsec 間隔でWriteしている。

もし需要があれば、GitHub辺りにプロジェクトを置いておこうかと思いますが、需要はありますか?

(追加)
GitHubは設定が難しかったので、YahooボックスでISE14.2 ZedBoard用のキャラクタ・ディスプレイ・コントローラIPを公開します。その他の設定はブログの通りに設定してください。なお、保証はありません。自己責任でお使いください。
ダウンロードして動かした方は動作したかどうか?などの感想をコメントで教えて下さい。

(2012/10/01:追記)
コメントされた方はダウンロードされたと思うので、YahooボックスのISE14.2 ZedBoard用のキャラクタ・ディスプレイ・コントローラIPのリンクを削除しました。コメントが無いのが寂しいです。

(2012/10/14:追記)
キャラクタ・ディスプレイ・コントローラIPの情報は全て公開してあると思いますが、IPとしてフォルダごと欲しいという方は使用したい理由を書いて、ご連絡ください。(理由は興味があるからとかでもOKです)
  1. 2012年09月22日 05:09 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:6

ZedBoardにキャラクタ・ディスプレイ・コントローラを追加する4(ChipScopeデバック1)

ZedBoardにキャラクタ・ディスプレイ・コントローラを追加する3(SDK)”の続き。

前回、VGA画面に文字は表示されなかったので、ChipScopeでデバックを行うことにした。

・PlanAheadでChipScopeを掛けた。そしてインプリメントを行い、ChipScopeを起動した。(”PlanAhead14.1でChipScope Proを試してみた1(ChipScope の設定)”と”PlanAhead14.1でChipScope Proを試してみた2(ChipScope Analyzer)”を参考にした)
ZedBoard_CDC_SVGA_35_120921.png

この状態では、T! アイコンのTriger Immediate をクリックしてもWaveウインドウに波形が出てこない。クロックが止まっているということになる。”ZedBoardにキャラクタ・ディスプレイ・コントローラを追加する1(XPSプロジェクト)”でも設定したように、AXI4バスのクロックに processing_system7_0::FCLK_CLK0 、キャラクタ・ディスプレイ・コントローラのピクセルクロックに processing_system7_0::FCLK_CLK1 を使用している。これは、ARMプロセッサの初期化ルーチンを起動するまでクロックが来ないようだ。SDKでデバックモードでデバックを始めるとクロックが来て、Triger Immediate でトリガするようになった。
これは、ハードウェア単体で実装されるべき機能では注意する必要があると思う。その様な回路はZedBoardのPL部に接続してある100MHzのクロック・ジェネレータを使用するのが妥当であると考える。

・ChipScopeで、S_AXI_AWVALID でトリガをかけた。
ZedBoard_CDC_SVGA_36_120921.png

・SDKを立ちあげて、デバックモードにした。

・XMDで、キャラクタ・ディスプレイ・コントローラへのWriteアクセスを行ったところ、XMDが強制終了されてしまった。エラーも出ている。下にエラーを示す。
ZedBoard_CDC_SVGA_37_120921.png

04:02:24 INFO : ps7 initialization is done.
04:03:17 INFO : FPGA Cable Disconnected. All active launches will be terminated.
04:03:17 WARN : Terminating existing sessions on processor ps7_cortexa9_0
04:03:17 ERROR : Unexpected Interrupt before obtaining results for {"command": "targets 64"}, java.lang.InterruptedException.


・Xilinxのアンサーを検索してみたところ、”14.2 - SDK - SDK および ChipScope デバッグを同時に実行するとシステムが停止する”というアンサーが見つかった。
それによると、Digilent 社のケーブルでは、SDKとChipScopeデバックを同時にできないそうだ。アンサーの結果と今回の結果は異なるが、不具合が発生するということでは同じだ。。

・ChipScopeでJTAG Chain -> Get Cable Infomation を実行した。その結果を下に示す。

COMMAND: get_cable_information
INFO: 
    Name:         Digilent Zed
    Port:         0
    Frequency:     10000000 Hz
    Target UID:     00E00153

    Vendor:         Digilent, Inc.
    Target Name:     digilent_plugin
    Plugin Name:     libCseDigilent
    Plugin Version:     2.2.10
    Driver Version:     
    Firmware Version:     0103


やはり、Digilent社のケーブルだった。
アンサーによると、Xilinxの純正ケーブルを使用すると問題ないとのことだ。

(追加)
XUP USB-JTAG Programming Cableがあったので、ZedBoardのPROGポートにUSBケーブルを付ける代わりに、XUP USB-JTAG Programming Cableを使ったら、SDK、ChipScopeともに使用することが出来た。
ZedBoard_CDC_SVGA_38_120921.png

ZedBoard_CDC_SVGA_39_120921.png

ZedBoardにキャラクタ・ディスプレイ・コントローラを追加する5(完成)”に続く。

  1. 2012年09月21日 05:20 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:3

ZedBoardにキャラクタ・ディスプレイ・コントローラを追加する3(SDK)

ZedBoardにキャラクタ・ディスプレイ・コントローラを追加する2(インプリメント)”の続き。

PlanAheadでのインプリメントを終了したので、ハードウェアをエクスポートして、SDKを立ち上げる。

40.File メニューからExport -> Export Hardware for SDK... を選択した。

41.Export Hardware ダイアログが開く。Launch SDKにチェックを入れて、OKボタンをクリックした。

42.Hardware 構成をExport してSDKが立ち上がった。
ZedBoard_CDC_SVGA_22_120918.png

43.FileメニューからNew -> Xilinx C Projectを選択した。

44.New Projectダイアログが開いた。Empty Application を選択して、Project Name をcdc_testとした。
ZedBoard_CDC_SVGA_23_120919.png

45.次のダイアログで、Board Support Package をcdc_test_bsp_0 としてFinish ボタンをクリックした。
ZedBoard_CDC_SVGA_24_120919.png

46.各プロジェクトが作成された。
ZedBoard_CDC_SVGA_25_120919.png

47.cdc_testプロジェクトのsrc フォルダの右クリックメニューから New -> Source File を選択した。
ZedBoard_CDC_SVGA_26_120919.png

48.ファイル名を、cdc_test.c に指定した。
ZedBoard_CDC_SVGA_27_120919.png

HDLが間違っていたのがわかったので、修正後、ハードウェアをエクスポートして、もう一度SDKを立ちあげた。

49.キャラクタ・ディスプレイ・コントローラに'A'からキャラクタを書くCコードを書いた。
ZedBoard_CDC_SVGA_28_120919.png

50. Xilinx Toolsメニューから Program FPGA を選択した。

51. Program FPGA ダイアログが出た。Program ボタンをクリックした。ビットファイルがダウンロードされ、PLファブリックがプログラムされる。
ZedBoard_CDC_SVGA_29_120920.png

52.SDKの cdc_test プロジェクトの右クリックメニューから Debug As -> Debug Configurations... を選択した。
ZedBoard_CDC_SVGA_30_120920.png

53.Debug Configurations ダイアログが開く。Xilinx C/C++ ELF を右クリックして、右クリックメニューからNew を選択した。
ZedBoard_CDC_SVGA_31_120920.png

54.Applyボタンをクックしてから、Debug ボタンをクリックした。
ZedBoard_CDC_SVGA_32_120920.png

55.Confirm Perspective Switch ダイアログが開く。Yesボタンをクリックした。(もしこの画面で出てくなくてエラーになる場合は、”WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた6(実機でテスト)”の104.~106.でRun Configuration を作っている。これを作ってみたら、デバックモードでデバックがうまくいくようになるかもしれない?)
ZedBoard_CDC_SVGA_33_120920.png

56.Debug画面になった。
ZedBoard_CDC_SVGA_34_120920.png

return 0; まで実行したが、VGA画面に文字は表示されなかった。VGA画面は真っ暗なままだった。信号が入っていないという画面にはなっていないので、同期信号はきちんと入っているようだ。
なぜ?ということでChipScope を入れてデバックすることにした。

ZedBoardにキャラクタ・ディスプレイ・コントローラを追加する4(ChipScopeデバック1)”に続く。
  1. 2012年09月19日 05:42 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

ZedBoardにキャラクタ・ディスプレイ・コントローラを追加する2(インプリメント)

ZedBoardにキャラクタ・ディスプレイ・コントローラを追加する1(XPSプロジェクト)”の続き。

前回は、キャラクタ・ディスプレイ・コントローラを追加したXPSプロジェクトを作製した。今回はインプリメントを行った。

20.PlanAheadでトップファイルを作成する。Sources ウインドウでsystem.xmp を選択し、右クリックメニューからCreate Top HDL をクリックした。

21.system_stub.v が生成され、トップファイルとなった。
ZedBoard_CDC_SVGA_14_120916.png

22.制約ファイルを生成した。
ZedBoard_CDC_SVGA_15_120916.png

33.Synthesis を行ったが、エラーが出てしまった。前のcdc_axi_slave.vhd だとAWIDの値を1と指定してしまっていた。1以上になるようなので、C_S_AXI_ID_WIDTHを使用して書きなおした。下に示す。

-----------------------------------------------------------------------------
--
-- AXI Slave
--
-----------------------------------------------------------------------------
-- 2012/02/25 : S_AXI_AWBURST=1 (INCR) にのみ対応、AWSIZE, ARSIZE = 000 (1byte), 001 (2bytes), 010 (4bytes) のみ対応。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

--library unisim;
--use unisim.vcomponents.all;

entity cdc_axi_slave is
  generic (
    C_S_AXI_ID_WIDTH     : integer := 1;
    C_S_AXI_ADDR_WIDTH   : integer := 32;
    C_S_AXI_DATA_WIDTH   : integer := 32;
    C_S_AXI_AWUSER_WIDTH : integer := 1;
    C_S_AXI_ARUSER_WIDTH : integer := 1;
    C_S_AXI_WUSER_WIDTH  : integer := 1;
    C_S_AXI_RUSER_WIDTH  : integer := 1;
    C_S_AXI_BUSER_WIDTH  : integer := 1
    );
  port(
    -- System Signals
    ACLK    : in std_logic;
    ARESETN : in std_logic;

    -- Slave Interface Write Address Ports
    S_AXI_AWID     : in  std_logic_vector(C_S_AXI_ID_WIDTH-1 downto 0);
    S_AXI_AWADDR   : in  std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
    S_AXI_AWLEN    : in  std_logic_vector(8-1 downto 0);
    S_AXI_AWSIZE   : in  std_logic_vector(3-1 downto 0);
    S_AXI_AWBURST  : in  std_logic_vector(2-1 downto 0);
    S_AXI_AWLOCK   : in  std_logic_vector(2-1 downto 0);
    S_AXI_AWCACHE  : in  std_logic_vector(4-1 downto 0);
    S_AXI_AWPROT   : in  std_logic_vector(3-1 downto 0);
    S_AXI_AWREGION : in  std_logic_vector(4-1 downto 0);
    S_AXI_AWQOS    : in  std_logic_vector(4-1 downto 0);
    S_AXI_AWUSER   : in  std_logic_vector(C_S_AXI_AWUSER_WIDTH-1 downto 0);
    S_AXI_AWVALID  : in  std_logic;
    S_AXI_AWREADY  : out std_logic;

    -- Slave Interface Write Data Ports
    S_AXI_WID    : in  std_logic_vector(C_S_AXI_ID_WIDTH-1 downto 0);
    S_AXI_WDATA  : in  std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
    S_AXI_WSTRB  : in  std_logic_vector(C_S_AXI_DATA_WIDTH/8-1 downto 0);
    S_AXI_WLAST  : in  std_logic;
    S_AXI_WUSER  : in  std_logic_vector(C_S_AXI_WUSER_WIDTH-1 downto 0);
    S_AXI_WVALID : in  std_logic;
    S_AXI_WREADY : out std_logic;

    -- Slave Interface Write Response Ports
    S_AXI_BID    : out std_logic_vector(C_S_AXI_ID_WIDTH-1 downto 0);
    S_AXI_BRESP  : out std_logic_vector(2-1 downto 0);
    S_AXI_BUSER  : out std_logic_vector(C_S_AXI_BUSER_WIDTH-1 downto 0);
    S_AXI_BVALID : out std_logic;
    S_AXI_BREADY : in  std_logic;

    -- Slave Interface Read Address Ports
    S_AXI_ARID     : in  std_logic_vector(C_S_AXI_ID_WIDTH-1 downto 0);
    S_AXI_ARADDR   : in  std_logic_vector(C_S_AXI_ADDR_WIDTH-1 downto 0);
    S_AXI_ARLEN    : in  std_logic_vector(8-1 downto 0);
    S_AXI_ARSIZE   : in  std_logic_vector(3-1 downto 0);
    S_AXI_ARBURST  : in  std_logic_vector(2-1 downto 0);
    S_AXI_ARLOCK   : in  std_logic_vector(2-1 downto 0);
    S_AXI_ARCACHE  : in  std_logic_vector(4-1 downto 0);
    S_AXI_ARPROT   : in  std_logic_vector(3-1 downto 0);
    S_AXI_ARREGION : in  std_logic_vector(4-1 downto 0);
    S_AXI_ARQOS    : in  std_logic_vector(4-1 downto 0);
    S_AXI_ARUSER   : in  std_logic_vector(C_S_AXI_ARUSER_WIDTH-1 downto 0);
    S_AXI_ARVALID  : in  std_logic;
    S_AXI_ARREADY  : out std_logic;

    -- Slave Interface Read Data Ports
    S_AXI_RID    : out std_logic_vector(C_S_AXI_ID_WIDTH-1 downto 0);
    S_AXI_RDATA  : out std_logic_vector(C_S_AXI_DATA_WIDTH-1 downto 0);
    S_AXI_RRESP  : out std_logic_vector(2-1 downto 0);
    S_AXI_RLAST  : out std_logic;
    S_AXI_RUSER  : out std_logic_vector(C_S_AXI_RUSER_WIDTH-1 downto 0);
    S_AXI_RVALID : out std_logic;
    S_AXI_RREADY : in  std_logic;
    
    -- VGA Signals
    pixclk        : in    std_logic;
    vga_red : out std_logic_vector(3 downto 0);
    vga_green : out std_logic_vector(3 downto 0);
    vga_blue : out std_logic_vector(3 downto 0);
    vga_hsync : out std_logic;
    vga_vsync : out std_logic
    );

end cdc_axi_slave;

architecture implementation of cdc_axi_slave is
component CharDispCtrler
    port(
        axi4clk : in std_logic;
        pixclk : in std_logic;
        reset : in std_logic;
        
        processor_addr : in std_logic_vector(12 downto 0);
        processor_din : in std_logic_vector(15 downto 0);
        processor_dout : out std_logic_vector(15 downto 0);
        processor_we : in std_logic;
        
        VGA_RED : out std_logic_vector(3 downto 0);
        VGA_GREEN : out std_logic_vector(3 downto 0);
        VGA_BLUE : out std_logic_vector(3 downto 0);
        VGA_HSYNC : out std_logic;
        VGA_VSYNC : out std_logic;
        display_enable : out std_logic
    );
end component;
COMPONENT afifo_sm
  PORT (
    clk : IN STD_LOGIC;
    rst : IN STD_LOGIC;
    din : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
    wr_en : IN STD_LOGIC;
    rd_en : IN STD_LOGIC;
    dout : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
    full : OUT STD_LOGIC;
    almost_full : OUT STD_LOGIC;
    overflow : OUT STD_LOGIC;
    empty : OUT STD_LOGIC;
    almost_empty : OUT STD_LOGIC;
    underflow : OUT STD_LOGIC
  );
END COMPONENT;

constant    AxBURST_FIXED    : std_logic_vector := "00";
constant    AxBURST_INCR    : std_logic_vector := "01";
constant    AxBURST_WRAP    : std_logic_vector := "10";

constant    RESP_OKAY        : std_logic_vector := "00";
constant    RESP_EXOKAY        : std_logic_vector := "01";
constant    RESP_SLVERR        : std_logic_vector := "10";
constant    RESP_DECERR        : std_logic_vector := "11";

-- for write transaction
type write_transaction_state is (idle_wr, awr_wait, awr_accept, wr_burst);
type write_response_state is (idle_wres, bvalid_assert);
type write_wready_state is (idle_wrdy, wready_assert);
signal wrt_cs : write_transaction_state;
signal wrres : write_response_state;
signal wrwr : write_wready_state;

-- for read transaction
type read_transaction_state is (idle_rd, arr_wait, arr_accept, rd_burst);
type read_last_state is (idle_rlast, rlast_assert);
signal rdt_cs : read_transaction_state;
signal rdlast : read_last_state;

signal reset_1d, reset_2d, reset : std_logic := '1';

signal awready         : std_logic;
signal wr_addr         : std_logic_vector(12 downto 0);
signal wr_bid         : std_logic_vector(C_S_AXI_ID_WIDTH-1 downto 0);
signal wr_bresp     : std_logic_vector(1 downto 0);
signal wr_bvalid     : std_logic;

signal arready         : std_logic;
signal rd_addr         : std_logic_vector(12 downto 0);
signal rd_axi_count    : std_logic_vector(7 downto 0);
signal rd_cdc_count    : std_logic_vector(8 downto 0);
signal rdfifo_din    : std_logic_vector(15 downto 0);
signal rdfifo_wr_en    : std_logic;
signal rdfifo_rd_en    : std_logic;
signal rdfifo_full, rdfifo_empty    : std_logic;
signal rdfifo_almost_full, rdfifo_almost_empty : std_logic;
signal rdfifo_overflow, rdfifo_underflow : std_logic;
signal rvalid        : std_logic;
signal rlast        : std_logic;
signal cdc_addr        : std_logic_vector(12 downto 0);
signal display_enable : std_logic;
signal cdc_we : std_logic;
signal rdfifo_wr_en_node : std_logic;

begin
    -- ARESETN をACLK で同期化
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            reset_1d <= not ARESETN;
            reset_2d <= reset_1d;
        end if;
    end process;
    reset <= reset_2d;
    
    -- AXI4バス Write Transaction State Machine
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            if reset='1' then
                wrt_cs <= idle_wr;
                awready <= '0';
            else
                case (wrt_cs) is
                    when idle_wr =>
                        if S_AXI_AWVALID='1' then -- S_AXI_AWVALID が1にアサートされた
                            if rdt_cs=idle_rd then -- Read Transaction が終了している(Writeの方が優先順位が高い)
                                wrt_cs <= awr_accept;
                                awready <= '1';
                            else -- Read Transaction が終了していないのでWait
                                wrt_cs <= awr_wait;
                            end if;
                        end if;
                    when awr_wait => -- Read Transaction の終了待ち
                        if rdt_cs=idle_rd or rdt_cs=arr_wait then -- Read Transaction が終了
                            wrt_cs <= awr_accept;
                            awready <= '1';
                        end if;
                    when awr_accept => -- S_AXI_AWREADY をアサート
                        wrt_cs <= wr_burst;
                        awready <= '0';
                    when wr_burst => -- Writeデータの転送
                        if S_AXI_WLAST='1' and S_AXI_WVALID='1' then -- Write Transaction 終了
                            wrt_cs <= idle_wr;
                        end if;
                end case;
            end if;
        end if;
    end process;
    S_AXI_AWREADY <= awready;
    S_AXI_WREADY <= '1' when wrt_cs=wr_burst else '0';
    cdc_we <= '1' when wrt_cs=wr_burst and S_AXI_WVALID='1' else '0';
    
    -- wr_addr の処理
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            if reset='1' then
                wr_addr <= (others => '0');
            else
                if wrt_cs=awr_accept then
                    wr_addr <= S_AXI_AWADDR(14 downto 2); -- 32ビット幅データのため
                elsif wrt_cs=wr_burst and S_AXI_WVALID='1' then -- アドレスを1つ進める
                    wr_addr <= wr_addr + 1;
                end if;
            end if;
        end if;
    end process;
    
    -- wr_bid の処理
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            if reset='1' then
                wr_bid <= (others => '0');
            else
                if wrt_cs=awr_accept then
                    wr_bid <= S_AXI_AWID;
                end if;
            end if;
        end if;
    end process;
    S_AXI_BID <= wr_bid;
    
    -- wr_bresp の処理
    -- S_AXI_AWBURSTがINCRの時はOKAYを返す。それ以外はSLVERRを返す。
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            if reset='1' then
                wr_bresp <= (others => '0');
            else
                if wrt_cs=awr_accept then
                    if S_AXI_AWBURST=AxBURST_INCR then -- バーストタイプがアドレス・インクリメントタイプ
                        wr_bresp <= RESP_OKAY; -- Write Transaction は成功
                    else
                        wr_bresp <= RESP_SLVERR; -- エラー
                    end if;
                end if;
            end if;
        end if;
    end process;
    S_AXI_BRESP <= wr_bresp;
    
    -- wr_bvalid の処理
    -- Write Transaction State Machineには含まない。axi_master のシミュレーションを見ると1クロックで終了しているので、長い間、Master側の都合でWaitしていることは考えない。
    -- 次のWrite転送まで遅延しているようであれば、Write Transaction State Machine に入れてブロックすることも考える必要がある。
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            if reset='1' then
                wr_bvalid <= '0';
            else
                if S_AXI_WLAST='1' and S_AXI_WVALID='1' then -- Write Transaction 終了
                    wr_bvalid <= '1';
                elsif wr_bvalid='1' and S_AXI_BREADY='1' then -- wr_bvalid が1でMaster側のReadyも1ならばWrite resonse channel の転送も終了
                    wr_bvalid <= '0';
                end if;
            end if;
        end if;
    end process;
    S_AXI_BVALID <= wr_bvalid;
    S_AXI_BUSER <= (others => '0');
    
    
    -- AXI4バス Read Transaction State Machine
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            if reset='1' then
                rdt_cs <= idle_rd;
                arready <= '0';
            else
                case (rdt_cs) is
                    when idle_rd =>
                        if S_AXI_ARVALID='1' then -- Read Transaction 要求
                            if wrt_cs=idle_wr and S_AXI_AWVALID='0' then -- Write Transaction State Machine がidle でWrite要求もない
                                rdt_cs <= arr_accept;
                                arready <= '1';
                            else -- Write Transaction が終了していないのでWait
                                rdt_cs <= arr_wait;
                            end if;
                        end if;
                    when arr_wait => -- Write Transaction の終了待ち
                        if wrt_cs=idle_wr and S_AXI_AWVALID='0' then -- Write Transaction State Machine がidle でWrite要求もない
                            rdt_cs <= arr_accept;
                            arready <= '1';
                        end if;
                    when arr_accept => -- S_AXI_ARREADY をアサート
                        rdt_cs <= rd_burst;
                        arready <= '0';
                    when rd_burst => -- Readデータの転送
                        if rd_axi_count=0 and rvalid='1' and S_AXI_RREADY='1' then -- Read Transaction 終了
                            rdt_cs <= idle_rd;
                        end if;
                end case;
            end if;
        end if;
    end process;
    S_AXI_ARREADY <= arready;
    
    -- rd_addr の処理
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            if reset='1' then
                rd_addr <= (others => '0');
            else
                if rdt_cs=arr_accept then
                    rd_addr <= S_AXI_ARADDR(14 downto 2); -- 32ビット幅データのため
                elsif rdt_cs=rd_burst and rdfifo_almost_full='0' and rd_cdc_count/=0 then -- rdfifoに余裕があるときにはアドレスを1つ進める
                    rd_addr <= rd_addr + 1;
                end if;
            end if;
        end if;
    end process;
    
    -- Read用FIFOのインスタンス
    rdfifo : afifo_sm PORT MAP (
        clk => ACLK,
        rst => reset,
        din => rdfifo_din,
        wr_en => rdfifo_wr_en,
        rd_en => rdfifo_rd_en,
        dout => S_AXI_RDATA(15 downto 0),
        full => rdfifo_full,
        almost_full => rdfifo_almost_full,
        overflow => rdfifo_overflow,
        empty => rdfifo_empty,
        almost_empty => rdfifo_almost_empty,
        underflow => rdfifo_underflow
    );
    S_AXI_RDATA(31 downto 16) <= (others => '0');
    rvalid <= not rdfifo_empty;
    S_AXI_RVALID <= rvalid;
    
    rdfifo_wr_en_node <= '1' when rdt_cs=rd_burst and rdfifo_almost_full='0' and rd_cdc_count/=0 else '0';
    -- BlockRAMのReadは1クロック遅延するため、1クロック遅延させる。
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            if reset='1' then
                rdfifo_wr_en <= '0';
            else
                rdfifo_wr_en <= rdfifo_wr_en_node;
            end if;
        end if;
    end process;
        
    rdfifo_rd_en <= '1' when rdt_cs=rd_burst and rvalid='1' and S_AXI_RREADY='1' else '0';
    
    -- rd_cdc_count の処理(CDC側のデータカウント)
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            if reset='1' then
                rd_cdc_count <= (others => '0');
            else
                if rdt_cs=arr_accept then -- ロード
                    rd_cdc_count <= ('0'& S_AXI_ARLEN) + 1;
                elsif rdt_cs=rd_burst and rdfifo_almost_full='0' and rd_cdc_count/=0 then -- FIFOに余裕がある
                    rd_cdc_count <= rd_cdc_count - 1;
                end if;
            end if;
        end if;
    end process;
                    
    -- rd_axi_count の処理(AXIバス側のデータカウント)
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            if reset='1' then
                rd_axi_count <= (others => '0');
            else
                if rdt_cs=arr_accept then -- rd_axi_count のロード
                    rd_axi_count <= S_AXI_ARLEN;
                elsif rdt_cs=rd_burst and rvalid='1' and S_AXI_RREADY='1' then -- Read Transaction が1つ終了
                    rd_axi_count <= rd_axi_count - 1;
                end if;
            end if;
        end if;
    end process;
    
    -- rdlast State Machine
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            if reset='1' then
                rdlast <= idle_rlast;
                rlast <= '0';
            else
                case (rdlast) is
                    when idle_rlast =>
                        if rd_axi_count=1 and rvalid='1' and S_AXI_RREADY='1' then -- バーストする場合
                            rdlast <= rlast_assert;
                            rlast <= '1';
                        elsif rdt_cs=arr_accept and S_AXI_ARLEN=0 then -- 転送数が1の場合
                            rdlast <= rlast_assert;
                            rlast <= '1';
                        end if;
                    when rlast_assert => 
                        if rvalid='1' and S_AXI_RREADY='1' then -- Read Transaction 終了(rd_axi_count=0は決定)
                            rdlast <= idle_rlast;
                            rlast <= '0';
                        end if;
                end case;
            end if;
        end if;
    end process;
    S_AXI_RLAST <= rlast;
    
    -- S_AXI_RID, S_AXI_RUSER の処理
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            if reset='1' then
                S_AXI_RID <= (others => '0');
            else
                if rdt_cs=arr_accept then
                    S_AXI_RID <= S_AXI_ARID;
                end if;
            end if;
        end if;
    end process;
    S_AXI_RUSER <= (others => '0');
    
    -- S_AXI_RRESP は、S_AXI_ARBURST がINCR の場合はOKAYを返す。それ以外はSLVERRを返す。
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            if reset='1' then
                S_AXI_RRESP <= (others => '0');
            else
                if rdt_cs=arr_accept then
                    if S_AXI_ARBURST=AxBURST_INCR then
                        S_AXI_RRESP <= RESP_OKAY;
                    else
                        S_AXI_RRESP <= RESP_SLVERR;
                    end if;
                end if;
            end if;
        end if;
    end process;
    
    
    -- CharDispCtrler
    cdc_addr <= wr_addr when rdt_cs=idle_rd or rdt_cs=arr_wait else rd_addr;
    
    CDC_inst : CharDispCtrler port map (
        axi4clk         => ACLK,
        pixclk            => pixclk,
        reset            => reset,
        processor_addr    => cdc_addr,
        processor_din    => S_AXI_WDATA(15 downto 0),
        processor_dout    => rdfifo_din,
        processor_we    => cdc_we,
        VGA_RED            => vga_red,
        VGA_GREEN        => vga_green,
        VGA_BLUE        => vga_blue,
        VGA_HSYNC        => vga_hsync,
        VGA_VSYNC        => vga_vsync,
        display_enable    => display_enable
    );
    
end implementation;


これで問題なくなったので、もう一度Synthesis を行ったところ、通った。

34.VGA関連のピンを固定する。左側のFlow Navigator のOpen Syntyesized Design を選択して、Syntyesized Design を開いいた。

35.WindowメニューからPakage を選択した。
ZedBoard_CDC_SVGA_16_120916.png

36.Zynqのパッケージが開いた。
ZedBoard_CDC_SVGA_17_120916.png

37.WindowメニューからI/O Ports を選択した。
ZedBoard_CDC_SVGA_18_120916.png

38.I/O Ports の画面が下に開いた。ここでVGA関連のピンを固定した。下にUCFファイルを示す。
ZedBoard_CDC_SVGA_19_120916.png

NET "vga_blue[0]" LOC = Y21;
NET "vga_blue[1]" LOC = Y20;
NET "vga_blue[2]" LOC = AB20;
NET "vga_blue[3]" LOC = AB19;
NET "vga_blue[0]" IOSTANDARD = LVCMOS33;
NET "vga_blue[1]" IOSTANDARD = LVCMOS33;
NET "vga_blue[2]" IOSTANDARD = LVCMOS33;
NET "vga_blue[3]" IOSTANDARD = LVCMOS33;
NET "vga_green[0]" LOC = AB22;
NET "vga_green[1]" LOC = AA22;
NET "vga_green[2]" LOC = AB21;
NET "vga_green[3]" LOC = AA21;
NET "vga_green[0]" IOSTANDARD = LVCMOS33;
NET "vga_green[1]" IOSTANDARD = LVCMOS33;
NET "vga_green[2]" IOSTANDARD = LVCMOS33;
NET "vga_green[3]" IOSTANDARD = LVCMOS33;
NET "vga_red[0]" LOC = V20;
NET "vga_red[1]" LOC = U20;
NET "vga_red[2]" LOC = V19;
NET "vga_red[3]" LOC = V18;
NET "vga_red[0]" IOSTANDARD = LVCMOS33;
NET "vga_red[1]" IOSTANDARD = LVCMOS33;
NET "vga_red[2]" IOSTANDARD = LVCMOS33;
NET "vga_red[3]" IOSTANDARD = LVCMOS33;
NET "vga_hsync" LOC = AA19;
NET "vga_vsync" LOC = Y19;
NET "vga_hsync" IOSTANDARD = LVCMOS33;
NET "vga_vsync" IOSTANDARD = LVCMOS33;


39.インプリメントを行った。Critical warning が出た。processing_system7_0 の3つのポートが制約されていないというエラーだ。これはどこに割り当てれば良いのだろう?
ZedBoard_CDC_SVGA_20_120917.png

40.インプリメントが終了したので、ビットストリームを生成した。
ZedBoard_CDC_SVGA_21_120917.png

ZedBoardにキャラクタ・ディスプレイ・コントローラを追加する3(SDK)”に続く。

  1. 2012年09月18日 05:28 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

はんだづけカフェで開催されたハンダ付け教室に行って来ました

今日ははんだづけカフェで開催されたハンダ付け教室に参加してきました。ツイッターのタイムラインでお世話になっている方とご一緒できて楽しくハンダ付けを学習することができました。
チップ部品をハンダ付けするとなると、ピンセットが肝なので、千石で買って来ました。曲がっているピンセットで430円でしたが、割と品質が良かったです。私はピンセットは曲がっている方が好きです。
さて、ハンダ付け教室ですが、ハンダゴテメーカーのHAKKOの方がいらして、最初に良いハンダ付けとはどんなものか?プロジェクターを使用して講義を受けました。

・当然ながら、ハンダが少なすぎても多すぎてもダメだそうです。多すぎるとテンプラハンダになってもわからないからだそうです。
・端子とパッドの間のハンダの斜めの部分をフィレットというそうですが、そこが円弧状になっているのが良いそうです。
・フラックスは銅箔上の酸化膜を除去するので、必ず塗ったほうが良いそうです。(これはQFPのハンダ付けでは必須だと思いました)
・コテ先の温度は350度程度が良いそうです。母材は250度程度だったかな?


実は私、大学卒業して某F社の子会社に入った時にハンダ付けの基準とハンダゴテの持ち方を教えてもらいました。ハンダ付け良品の基準は同じようでしたね。当時はラジアル部品やアキシャル部品でしたけど。。。

さて講習が終わったら実技に入りました。最初は1608の抵抗やコンデンサのハンダ付けから、私のやり方は最初に片方のパッドにほんの少しハンダを盛って、片方を借り付けしてから、もう片方をハンダ付けして、仮付の方をやり直すという方式です。講習では、最初にテープで仮止めして、借り付けしてからテープを剥がして、本付けに入るというやり方でした。かなり面倒です。これは、自分の方式のほうが良さそうでした。
handa_kousyu_1_120918.jpg

次に、0.5mmピッチのQFPのハンダ付けです。やはりテープで仮止めして、対角線上に1ピン、ハンダ付けしてからテープを剥がして、ハンダ付けします。テープは昔懐かしい(会社にいた頃よく使っていた)紙のテープでした。あれは良いですね。なんという製品かな?
QFPのハンダ付けはフラックスを塗りながら行うと、ハンダブリッジも無く気持よくハンダが流れていきました。気持ち良い。。。やはりフラックスは肝ですね。難しかったのは位置決めです。これがずれているとダメなので、顕微鏡が欲しくなりますね。私は近視で老眼ですが、メガネを外すと近くのものがよく見えます。QEPの足もよく見えました。ハンダ付けには裸眼が一番良かったです。老眼ですが近視で、ある意味、ラッキーかも知れません?
handa_kousyu_2_120918.jpg

その後は、新しいHAKKO製品の宣伝がありました。HAKKO FX888D凄くよさそうでしたが、私には高いです。温調ハンダゴテのHAKKO FX600を割引してもらって購入しました。他に平型コテ先T18-D16と金だわしコテ先クリーナーを購入しました。憧れのHAKKOハンダゴテが買えて嬉しかったです。
最後に、講師の方、はんだづけカフェの関係者の方、ツイッターのタイムラインの皆様、楽しくハンダ付けを学習することができました。ありがとうございました。
  1. 2012年09月17日 21:58 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

天地明察(映画)を見てきました

昨日は奥さんと天地明察を見てきました。奥さんが買ってきた本を事前に読んだんですが、とっても面白かったです。もう一度読みたいと思いました。映画は、面白かったんですが、本と比べてしまうと。。。といった感じです。本を読まないで映画を見て、それから本を読んだほうが良いと思いました。でも、江戸時代の天体観測の装置が見られたのは良かったです。1部に現代のネジが使われていましたが。
  1. 2012年09月17日 04:42 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

ZedBoardにキャラクタ・ディスプレイ・コントローラを追加する1(XPSプロジェクト)

今回はZedBoardにキャラクタ・ディスプレイ・コントローラを追加しようと思う。AXI4 Slave IPの作製でAtlysボード用のキャラクタ・ディスプレイ・コントローラをAXI4 Slave IPとして作製した。これはHDMI端子への出力だが、ZedBoaradはADV7511 HDMI Transmitterが搭載されていて、このチップの使用方法を探らなければ、HDMI端子に出力することができない。ADV7511 のチュートリアルもあってやってみようと思うが、とりあえずは、キャラクタ・ディスプレイ・コントローラからVGA端子に出力しようと思っている。
ZedBoardのVGA端子は、”ZedBoard (Zynq™Evaluation and Development) Hardware User’s Guide Version 1.6 September 5th, 2012”の16ページ”2.4.2 VGA Connector”と回路図によると、抵抗分割のRGB各4ビット出力だった。Atlysボード用のAXI4スレーブのキャラクタ・ディスプレイ・コントローラ部分のHDMI出力用回路を取り除けば、容易につなぐことができると思う。

1.PlanAhead 14.2 で、ZedBoard_CDC_SVGAプロジェクトを作製した。
ZedBoard_CDC_SVGA_1_120916.png

2.”WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた1(XPSプロジェクトの生成)”を参考にしながら、XPSプロジェクト(system) を追加した。今回はWebPACKを使用していませんが、WebPACKでも同様にできると思います。
ZedBoard_CDC_SVGA_2_120916.png

3.Spartan6\Atlys\Atlys_XPS_CDC_SVGA_141\pcoresから、cdc_axi_slave_v1_00_a を、K:\HDL\FndtnISEWork\Zynq-7000\ZedBoard\ZedBoard_CDC_SVGA\ZedBoard_CDC_SVGA.srcs\sources_1\edk\system\pcores にコピーした。

4.cdc_axi_slave_v1_00_a を、HDMI端子出力用からVGA端子出力用に書き換えた。dvi_disp.vhd やDigilent社のライブラリを削除して、その他のHDLファイルを書き換えた。

5.cdc_axi_slave_v1_00_a の.mpd, .pao ファイルを書き換えた。

6.XPSのProject メニューからRescan User Repositoriesを行った。

7.IP Catalog にUSERが増えて、その中にcdc_AXI_Slave IPコアが出来た。cdc_AXI_Slabe を右クリックメニューからAdd IPを行う。

8.確認のダイアログが出る。Yesボタンをクリックした。

9.XPS Core Config ダイアログが出る。そのままOKボタンをクリックした。
ZedBoard_CDC_SVGA_3_120916.png

10.cdc_AXI_Slave IPコアどのプロセッサに接続するかを決めるダイアログが出る。processing_system7_0 が選ばれている。
ZedBoard_CDC_SVGA_4_120916.png

11.XPSを見ると、cdc_axi_slave_0 がM_AXI_GP0でARMプロセッサに接続された。
ZedBoard_CDC_SVGA_5_120916.png

12.Portsタブで、cd_axi_slave_0 の外部ポートを接続した。(注:その前にNetの設定項目を追加している。Nameなどのバーを右クリックして、右クリックメニューからNetを選択する。詳しくは、”ZedBoardにビットマップ・ディスプレイ・コントローラを追加する2(XPSの設定2)”を参照)
ZedBoard_CDC_SVGA_6_120916.png

13.次にpixclk に40MHzを入力する必要がある。pixclk をprocessing_system7_0::FCLK_CLK1 に接続した。(注:その前にprocessing_system7_0 を開いて、FCLK_CLK1のNetでNew Connection を選択し、FCLK_CLK1 に新しいネット名 processing_system7_0_FCLK_CLK1 が割り当てる必要がある。詳しくは、”ZedBoardにビットマップ・ディスプレイ・コントローラを追加する2(XPSの設定2)”を参照)
ZedBoard_CDC_SVGA_7_120916.png

14.ZynqタブのClock Generation をクリックした。
ZedBoard_CDC_SVGA_8_120916.png

15.Clock WizardでFCLK_CLK1を40MHzに設定した。
ZedBoard_CDC_SVGA_9_120916.png

16.設定後にLog が出た。いろいろなクロックの情報が見えた。DDR3は533.333MHzと言うことはDDR3-1066だった。CPUは666.667MHz、QSPIは100MHzのSPIらしい
ZedBoard_CDC_SVGA_10_120916.png

・M_AXI_GP0 のデータ幅が32ビットであることを確かめた。

17.Addressesタブを見ると、cdc_axi_slave_0 にアドレスが割り当てられているのが確認できた。
ZedBoard_CDC_SVGA_11_120916.png

18.ProjectメニューからDesign Rule Check を選択した。エラーはなかった。
ZedBoard_CDC_SVGA_12_120916.png

19.XPSを閉じて、PlanAheadプロジェクトに戻った。
ZedBoard_CDC_SVGA_13_120916.png

ZedBoardにキャラクタ・ディスプレイ・コントローラを追加する2(インプリメント)”に続く。
  1. 2012年09月16日 05:56 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

ZedBoardのGetting Started Guideをやってみた2

ZedBoardのGetting Started Guideをやってみた1”の続き

・イーサネットへの接続(Demo 5 – Ethernet)
・Webサーバーデモ
1.パソコンがWindows XPなので、ネットワーク接続フォルダからローカル エリア接続を右クリックし、右クリックメニューからプロパティを選択した。
2.インターネットプロトコル(TCP/IP) を選択して、プロパティ(R) ボタンをクリックした。
GSGuide_12_120913.png

3.次のIPアドレスを使う(O) のラジオボタンをクリックし、IPアドレスに192.168.1.1 を、サブネット マスクに255.255.255.0 を入力して、OKボタンをクリックした。前のダイアログも閉じた。
GSGuide_13_120913.png

4.ipconfig で見てみると、ZedBoardは192.168.1.10 だった。
GSGuide_11_120913.png

5.ブラウザで192.168.1.10 をアクセスするとZedBoardのページが見えた。
GSGuide_14_120913.jpg

・SSHターミナルデモ
PuTTYをインストールして、SSHでZedBoardにログインする。
1.PuTTYを起動して192.168.1.10 にTCPポート22で接続した。
GSGuide_15_120913.png

2.ダイアログが出て、はい ボタンをクリックした。
GSGuide_16_120913.png

3.一度は繋がらなかったが、もう一度PuTTYを起動したらつながった。その後はダイアログが出ないで接続できている。login IDは root で、パスワードも root でログインした。
GSGuide_17_120914.png

4.exit コマンドでexit して、PuTTYも終了した。

・FTP
1.Windows のコマンドプロンプトを立ちあげて、ftp 192.168.1.10 のコマンドを入力した。
2.root でログインした。
3.ls コマンドを実行してみた。
GSGuide_18_120914.png

4.putコマンドで画像ファイルをZedBoard Linuxに転送した。lsコマンドを実行すると画像ファイルがZedBoard Linuxに転送されたのがわかった。
GSGuide_24_120914.png

5.bye コマンドでftp を終了した。

・Demo 6 – USB-OTG
1.JP2, JP3をジャンパーピンでショートした。
2.ZedBoardに付属のmicroUSB-to-Type AアダプタをJ13につないだ。
3.microUSB-to-Type AアダプタにUSBメモリを接続した。
4.USBメモリのプライマリ・ドライブが/dev/sda1 として見えている。
GSGuide_19_120914.png

5./dev/sda1 を/mnt ディレクトリにマウントした。/mntに入って、ls -l コマンドを使用するとファイルがリストされた。USBメモリも使うことが出来た。
GSGuide_20_120914.png

USBメモリを接続している様子を下に示す。ZedBoardはケーブルだらけだ。
GSGuide_21_120914.jpg

6.umount /mnt でUSBメモリをアンマウントした。当然ながら、マウントしたディレクトリにcd しているとアンマウントできないので、上のディレクトリに戻ってからアンマウントした。
GSGuide_22_120914.png

・SDカード(Demo 7 – SD Card)
1.SDカードはMMCブロックデ・バイスとして /dev/mmcblk0 で表示される。プライマリ・パーティションは/dev/mmcblk0p1 だそうだ。
2. mount /dev/mmcblk0p1 /mnt コマンドを入れて、SDカードのプライマリ・パーティションを/mnt ディレクトリにマウントした。
3.ls -l /mnt コマンドを入れるとSDカードのファイルが見えた。
GSGuide_23_120914.png

4.umount /mnt でSDカードをアンマウントした。

  1. 2012年09月14日 04:55 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

ZedBoardのGetting Started Guideをやってみた1

ZedBoard.orgSupport -> Documentation ページの ZedBoard Getting Started Guide をやってみた。
これは付属しているSDカードでブートしたLinuxのデモを解説した文章だった。ZedBoard Getting Started Guide によるとSDカードのLinuxデモは下の図の構成になっている。(ZedBoard Getting Started Guide の14ページ、Figure 6 - ZedBoard Example Design Block Diagram を引用)
GSGuide_1_120913.png

Figure 6 - ZedBoard Example Design Block Diagram によると、ZedBoardのスイッチ、LEDが制御できて、HDMIとOLEDも制御できるようだ。VGA Display は単独で表示しているようだ。EthernetでBrowser でWebページも見れるようなので、 ZedBoard Getting Started Guide をやってみることにした。なお、ZedBoardはSDカードのREADMEを見ながら設定を行なって、SDカードからLinuxをブートした。

・スイッチの値の表示(Demo 1 – Interacting with GPIO Switches and LEDs )
”read_sw”コマンドでスイッチの設定値を見ることが出来た。
GSGuide_3_120913.png

GSGuide_2_120913.jpg

・LED点灯
”write_led”コマンドでLEDを点灯させることが出来た。
GSGuide_5_120913.png

GSGuide_4_120913.jpg

・OLEDの制御(Demo 2 – OLED Display)
”unload_oled”コマンドでOLEDを消灯して、”load_oled”コマンドで再び点灯させることが出来た。
GSGuide_7_120913.png

下の写真はOLEDを消灯したところだ。
GSGuide_6_120913.jpg

・VGA表示(Demo 3 – VGA Display )
VGAをディスプレイに接続すると下の写真のような表示がされていた。DIGILENTのマークが動いていた。
GSGuide_8_120913.jpg

・HDMI表示(Demo 4 – HDMI Display)
HDMI端子をZedBoardに接続すると下のような表示がTera Termに表示された。
GSGuide_9_120913.png

ディスプレイには下の写真のように表示されていた。
GSGuide_10_120913.jpg
  1. 2012年09月13日 05:36 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた8(ChipScopeによるデバック)

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた7(SDKデバック)”の続き。

今回は、”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バスの様子を確かめてみた。

117.ZedBoard の電源をONした。

118.TeaTerm を立ちあげて115200bps に設定した。

119.Xilinx Toolsメニューから Program FPGA を選択した。

120. Program FPGA ダイアログが出た。Program ボタンをクリックした。ビットファイルがダウンロードされ、PLファブリックがプログラムされる。
ZedBoard_PSPL_67_120909.png

121.hello_world_0の右クリックメニューからRun as -> Run Configurations... を選択した。
ZedBoard_PSPL_68_120909.png

122.Xilinx C/C++ ELF の右クリックメニューからNew を選択した。
ZedBoard_PSPL_69_120909.png

123.hello_world_0 Debug が出来た。
ZedBoard_PSPL_70_120909.png

124.Runボタンをクリックした。

125.Processor in use ダイアログが出た。Yesボタンをクリックした。
ZedBoard_PSPL_71_120909.png

126.Tera Termにメニューが表示されていた。
ZedBoard_PSPL_72_120909.png

127.PlanAheadのChipScope Analyzer をクリックしてChipScope Analyzer を立ち上がる。
ZedBoard_PSPL_86_120911.png

128.ChipScope Analyzer が立ち上がった。Open/Search JTAG Cable アイコンをクリックした。
ZedBoard_PSPL_87_120911.png

129.Zynqが見つかった。
ZedBoard_PSPL_88_120911.png

130.ダイアログのOKボタンをクリックした。ChipScope Pro Analyazer の状態を下に示す。
ZedBoard_PSPL_89_120911.png

131.chipscope_axi_monitor_0.cdc をインポートする。Dev 1 Mydevice1(XC7020)を選択して、FileメニューからImport を選択する。
ZedBoard_PSPL_90_120911.png

132.Signal Import ダイアログが開く。Select New File ボタンをクリックした。
ZedBoard_PSPL_91_120911.png

133.PS_and_PL_Tutorial\PS_and_PL_Tutorial.srcs\sources_1\edk\system\implementation\chipscope_axi_monitor_0_wrapperフォルダの下の chipscope_axi_monitor_0.cdc を選択した。
ZedBoard_PSPL_92_120911.png

134.Signal Import ダイアログに chipscope_axi_monitor_0.cdc が設定された。OKボタンをクリックした。
ZedBoard_PSPL_93_120911.png

135.ChipScope Analyzer の画面に信号名が表示された。
ZedBoard_PSPL_94_120911.png

136.Trigger Setupウインドウを開いて、M1:MON_AXI_ARADDRCONTROLの下のaxi_gpio_0_S_AXI/MON_AXI_AVALIDを1にした。
ZedBoard_PSPL_95_120911.png

137.Trigger Condition Equation がMOになっているので、そこをクリックした。
ZedBoard_PSPL_96_120911.png

138.Trigger Condition ダイアログで、Enableを見るとM0にチェックが入っている。これをクリックで消して、M1の所にチェックを入れた。
ZedBoard_PSPL_97_120911.png

139.Position の設定を10にした。
ZedBoard_PSPL_98_120911.png

140.Runボタンをクリックした。
ZedBoard_PSPL_99_120911.png

141.そのまま待っていてもトリガが掛からなかった。Tera Termから1を入力したところ、トリガが掛かった。
ZedBoard_PSPL_100_120911.png

142.Waveウインドウを下に示す。
ZedBoard_PSPL_101_120911.png

143.最初にトリガが掛かった辺りを拡大してみた。
ZedBoard_PSPL_102_120911.png

これでZedBoard付属のChipScopeライセンスで、2番めのチュートリアルを行うことが出来た。

  1. 2012年09月12日 04:34 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた7(SDKデバック)

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた6(実機でテスト)”の続き。

105.ZedBoard の電源をONした。

106. Xilinx Toolsメニューから Program FPGA を選択した。

107. Program FPGA ダイアログが出た。Program ボタンをクリックした。ビットファイルがダウンロードされ、PLファブリックがプログラムされる。
ZedBoard_PSPL_67_120909.png

108.SDKの Hello_world_0 プロジェクトの右クリックメニューから Debug As -> Debug Configurations... を選択した。
ZedBoard_PSPL_77_120911.png

109.Debug Configurations ダイアログが開く。 Debug ボタンをクリックした。
ZedBoard_PSPL_78_120911.png

110.Confirm Perspective Switch ダイアログが開く。Yesボタンをクリックした。
ZedBoard_PSPL_79_120911.png

111.Debug Perspective が開いた。helloworld.c を見ると、"u32 Readstatus=0,OldReadStatus=0;" で実行が一時停止している。
ZedBoard_PSPL_80_120911.png

Debug ウインドウを見ると、アセンブリレベルのプログラムの実行が0x001005fc番地で停止しているのがわかる。

112.Window メニューからShow view > Disassembly を選択した。
ZedBoard_PSPL_81_120911.png

113.Disassembly ウインドウが表示された。
ZedBoard_PSPL_82_120911.png

114.init_platform(); の前の編みかけの部分をダブルクリックするとブレークポイントを設定できる。Resume アイコンをクリックするとブレークポイントまでのコードを実行する。
ZedBoard_PSPL_83_120911.png

115.print文を走らせてみた。
ZedBoard_PSPL_84_120911.png

116.print文の文字がTera Termに表示された。
ZedBoard_PSPL_85_120911.png

これでWebPACKライセンスのSDKでデバックができることがわかったので、終了とする。
(注)ISE14.2 WebPACKはXilinx社のWebサイトから無料でダウンロード、インストールして使うことが出来ます。(ただし、無料ですがライセンスを取得する必要があります。ChipScope ProはWebPACKではライセンスが無くて使えませんが、ZedBoardを購入するとChipScope Proのライセンスが取得できて、使えるようになります)
インストールについては、”[PDF] ISE Design Suite 13 : インストールおよびライセンス ガイド (UG631)”を参照して下さい。
・14ページのインストールするエディションを選択する画面で、本当はISE WebPACKを選択するのですが、XPSが動作しないので、Logic Edition をインストールしてWebPACKのライセンスでご使用ください。

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた8(ChipScopeによるデバック)”に続く。

  1. 2012年09月11日 05:10 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた6(実機でテスト)

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた5(SDK)”の続き。

前回、SDKでコンパイルが終了したので、今回は実機で動作を確認した。

100.ZedBoard の電源をONした。

101.TeaTerm を立ちあげて115200bps に設定した。

102.Xilinx Toolsメニューから Program FPGA を選択した。

103. Program FPGA ダイアログが出た。Program ボタンをクリックした。ビットファイルがダウンロードされ、PLファブリックがプログラムされる。
ZedBoard_PSPL_67_120909.png

104.hello_world_0の右クリックメニューからRun as -> Run Configurations... を選択した。
ZedBoard_PSPL_68_120909.png

105.Xilinx C/C++ ELF の右クリックメニューからNew を選択した。
ZedBoard_PSPL_69_120909.png

106.hello_world_0 Debug が出来た。
ZedBoard_PSPL_70_120909.png

107.Runボタンをクリックした。

108.Processor in use ダイアログが出た。Yesボタンをクリックした。
ZedBoard_PSPL_71_120909.png

109.Tera Termにメニューが表示されていた。
ZedBoard_PSPL_72_120909.png

110.Tera Termで'1'キーを押してから、ZedBoard のBTNU キーを押すとLD9 が一旦消灯してから、また点灯した。
ZedBoard_PSPL_73_120909.png

111.Tera Termで'0'キーを押してメニューに戻した。

112.Tera Termで'2'キーを押してから、ZedBoard のBTNR キーを押すとLD9 が一旦消灯してから、また点灯した。
ZedBoard_PSPL_74_120909.png

113.Tera Termで'0'キーを押してメニューに戻した。

114.Tera Termで'3'キーを押したらBYEで終了した。
ZedBoard_PSPL_75_120909.png

ZedBoard のBTNU、BTNR、LD9 の位置を下の写真に示す。
ZedBoard_PSPL_76_120910.jpg

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた7(SDKデバック)”に続く。
  1. 2012年09月10日 20:22 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた5(SDK)

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた4(インプリメント)”の続き。

PlanAheadでのインプリメントを終了したので、ハードウェアをエクスポートして、SDKを立ち上げる。

89.File メニューからExport -> Export Hardware for SDK... を選択した。
ZedBoard_PSPL_59_120909.png

90.Export Hardware ダイアログが開く。Launch SDKにチェックを入れて、OKボタンをクリックした。
ZedBoard_PSPL_60_120909.png

91.Hardware 構成をExport してSDKが立ち上がった。
ZedBoard_PSPL_61_120909.png

92.FileメニューからNew -> Xilinx C Projectを選択した。

93.New Projectダイアログが開いた。Hello Worldが選択されている。
ZedBoard_PSPL_62_120909.png

94.次のダイアログが開いた。Finishボタンをクリックした。
ZedBoard_PSPL_63_120909.png

95.Hello Worldプロジェクトがビルドされた。トータルでは0x12C10 (76.8KBytes) メモリを使用している。さすがに大きい。
ZedBoard_PSPL_64_120909.png

次にhelloworld.c を書き換える。どのよう動作をするかはチュートリアルの40ページからの、”A.1 About the Application Software”、”A.2 Application Software Steps”に書いてある。

main()関数 はソフトを実行するエントリポイントです。main() 関数は初期化とシステムの周辺デバイスの設定をします。EMIOインターフェースを使用して、そのようなAXI GPIOおよびPS GPIOなど、さまざまなユースケースを実行するために選択する手順を持っています。シリアル端末上の命令にで、異なるユースケースを選択することができます。


ソフトウェア実行の手順

1.AXI GPIOモジュールを初期化。

2.ボード上のBTNUプッシュボタンに接続されている入力ピンとして、AXI GPIOピンの方向コントロールを設定する。ピン配置は、システムの作成時にユーザー制約ファイル(UCF)でLOC制約を使用して固定されている。

3.デバイスIDが0のAXI TIMERモジュールを初期化。

4.AXI timer ISRにコールバック関数を対応付ける。
この関数は、タイマ割り込みが発生するたびに呼び出される。コールバック関数はDS23 LEDをスイッチし、割り込みフラグをセットする。main()関数は実行を停止する割り込みフラグを使用して、タイマー割り込みを待ち、再起動実行。

5.リセット間にタイマー設定値をタイマーにロード。

6.割り込みモードやAuto Reload mode などのタイマーオプションを設定。

7.PSセクションのGPIOを初期化

8.PSセクションGPIOのチャネル0、ピン番号10を設定する。これはMIOピンにマッピングされ、ボード上のLED"LD9"に接続された出力ピンだ。

9.PSセクションGPIOのチャネル2、ピン番号0を設定する。これはEMIOインターフェースを介してPLサイドに接続されたBTNRプッシュポタンスイッチだ。

10.Snoop control unit Global Interrupt controllerを初期化。ID '91'割り込みの割り込みルーチンを登録。例外ハンドラを登録して、割り込み許可。

11. シリアル端末経由で選択されたAXI GPIO または PS GPIO ユースケースを元にシーケンスを実行。

ソフトウェアは、シリアル端末からの選択でプロシージャを実行する。
シリアル端末を経由しての使用例を選択した後は、端末上の指示に従ってボード上のプッシュボタンを押す必要がある。そうすると、'LD9'LEDが消灯、タイマーがスタートし、タイマー割り込みが来るまでウエイトする関数が呼ばれる。タイマー割り込みが起こったら'LD9'LEDを点灯して実行を再スタートする。

(英語に自信がないので、間違っていたらお知らせください)


書き換えるための helloworld.c は、ZedBoard.org のReference Designs のZynq Concepts, Tools, and Techniques on ZedBoard v14.1 をダウンロードすると取得することが出来る。

(注)XPSで入れたIPを含むIPのドライバが、私のフォルダ階層だと、”file:///K:/HDL/Xilinx/14.2/ISE_DS/EDK/sw/XilinxProcessorIPLib/drivers/”にある。各ドライバ用フォルダの下の /doc/html/api/index.html をブラウザで見ると、各IPの制御ルーチンの説明を見つけることが出来る。


96.Zynq Concepts, Tools, and Techniques on ZedBoard v14.1 のhelloworld.c の内容SDKプロジェクト内のhelloworld.c にコピー&ペーストした。
ZedBoard_PSPL_65_120909.png

97.念のため、Project メニューからClean... を選択した。

98.Clean ダイアログが開く。OKボタンをクリックした。
ZedBoard_PSPL_66_120909.png

99.再コンパイルされた。

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた6(実機でテスト)”に続く。
  1. 2012年09月10日 03:56 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた4(インプリメント)

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた3(IPの設定)”の続き。

(注)ChipScope Voucherが来てライセンスをもらう時には、Disk Serial Number でもらう必要がある。Ethernet MACアドレスで貰うとChipScopeのライセンスが入ってなかった。

今回はPlanAheadプロジェクトに戻って、論理合成、インプリメントを行う。

72.PlanAheadでトップファイルを作成する。Sources ウインドウでsystem.xmp を選択し、右クリックメニューからCreate Top HDL をクリックした。
ZedBoard_PSPL_44_120908.png

73.system_stub.v が生成され、トップファイルとなった。

74.今度は制約ファイルを生成する。Sources ウインドウで右クリックメニューからAdd Sources を選択する。
ZedBoard_PSPL_45_120908.png

75.Add Sources ダイアログが開いた。Add or Create Constraints のラジオボタンを選択する。
ZedBoard_PSPL_46_120908.png

76.ダイアログでCreate File... ボタンをクリックした。
ZedBoard_PSPL_47_120908.png

77.Create constraints file ダイアログでFile name をsystem に変更した。
ZedBoard_PSPL_48_120908.png

78.ダイアログにsystem.ucf が入っているのが見える。Finish ボタンをクリックした。
ZedBoard_PSPL_49_120908.png

79.PlanAhead Project Manager のSources ウインドウにsystem.ucf が入った。
ZedBoard_PSPL_50_120908.png

80.下の制約を書いた。(チュートリアルから転載)

# Connect to Push Button "BTNU"
NET axi_gpio_0_GPIO_IO_pin IOSTANDARD=LVCMOS25 | LOC=T18;
# Connect to Push Button "BTNR"
NET processing_system7_0_GPIO_pin IOSTANDARD=LVCMOS25 | LOC=R18;


“axi_gpio_0_IO_pin”は、PLのT18ピンに配置する。そこにはBTNUプッシュポタンスイッチが接続されている。
“processing_system7_0 GPIO pin”は、PSのFR18ピンに配置する。そこにはBTNRプッシュポタンスイッチが接続されている。

81.制約をセーブした。
ZedBoard_PSPL_52_120908.png

82.PlanAhead のFlow Navigator でBitstream generation completes の下のGenerate Bitstream をクリックして、論理合成、インプリメントを行った。

83.ダイアログが出るので、Yesボタンをクリックした。
ZedBoard_PSPL_53_120908.png

84.論理合成後にCritical warning が出たが無視する。
ZedBoard_PSPL_54_120908.png

85.ビットストリーム生成まで終了した。PLのリソースはほとんど使用していない。
ZedBoard_PSPL_55_120908.png

86.デバイス表示。PSの領域は案外小さいのかも、PLの方が圧倒的に本当に大きいのか?実際のチップではどうなんだろうか?
ZedBoard_PSPL_56_120908.png

87.FPGA Editor を開いてみた。UCFで設定したIOピンが見えた。
ZedBoard_PSPL_57_120908.png

88.最大動作周波数は、114.666MHzだった。クリティカル・パスを見てみた。
ZedBoard_PSPL_58_120908.png

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた5(SDK1)”に続く。

  1. 2012年09月09日 03:59 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:2

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた3(IPの設定)

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた2(IPの追加)”の続き。

今回は、前回追加したIPの設定を行った。

51.chipscope_axi_monitor_0 のCHIPSCOPE_ICON_CONTROL と、chipscope_icon_0 のcontrol0 が接続されていないので接続する。
ZedBoard_PSPL_25_120907.png

52.chipscope_axi_monitor_0 のCHIPSCOPE_ICON_CONTROL のConnected Ports をクリックすると接続の選択が出来る。chipscope_icon_0 のcontrol0 を選択した。
ZedBoard_PSPL_26_120907.png

53.chipscope_axi_monitor_0 のCHIPSCOPE_ICON_CONTROL と、chipscope_icon_0 のcontrol0 が接続された。他の接続は接続されていた。
ZedBoard_PSPL_27_120907.png
ZedBoard_PSPL_28_120907.png

54.Processing_system7_0 を展開して、(BUS_IF) M_AXI_GP0::M_AXI_GPO_ACLK にprocessing_system7_0 :: FCLK_CLK0 が接続されていることを確認した。
ZedBoard_PSPL_29_120908.png

55.Processing_system7_0 のIRQ_F2P がNo Connection なのでaxi_timer_0のInterrupt に接続する。 L to H: No Connection をクリックする。
ZedBoard_PSPL_30_120908.png

56.Interrupt Connection Dialog が開く。Unconnected Interrrpt(s) ペインの axi_timer_0のInterrupt が選択されているので右向き矢印をクリックする。
ZedBoard_PSPL_31_120908.png

57.Unconnected Interrrpt(s) ペインの axi_timer_0のInterrupt が Connected Interrrpt(s) ペインに移動した。OKボタンをクリックした。
ZedBoard_PSPL_32_120908.png

58.Processing_system7_0 のIRQ_F2P がL to H: axi_timer_0_Interrupt に接続された。
ZedBoard_PSPL_33_120908.png

59.Bus Interfacesタブをクリックした。chipscope_axi_monitor_0 のMON_AXIはNo Connetion になっている。No Connetion をクリックするとプルダウンメニューが出てくる。そこから、axi_gpio_0.S_AXIを選択した。
ZedBoard_PSPL_34_120908.png

60.chipscope_axi_monitor_0 のMON_AXIがaxi_gpio_0.S_AXI に接続された。これで、axi_gpio_0 のスレーブAXIバスのトランザクションがChipScope Analyzer で観察することが出来る。
ZedBoard_PSPL_35_120908.png

61.XPSのZynqタブで、緑色の32b GP AXI Master Portsボタンをクリックした。
ZedBoard_PSPL_36_120908.png

62.processing_system7のダイアログが開いた。Generalを展開した。

63.Enable GPIO on EMIO Interface にチェックを付けた。

64.Width of GPIO on EMIO Interface を1にセットした。OKボタンをクリックした。
ZedBoard_PSPL_37_120908.png

65.System Assembly Viewタブをクリックし、Portsタブをクリック。processing_system7_0を展開する。

66.(IO_IF)GPIO_0 のConnected Port のNot connected to External Ports をクリックしてプルダウンメニューからMake Ports External を選択した。
ZedBoard_PSPL_38_120908.png

67.(IO_IF)GPIO_0 のConnected Port がConnected to External Ports に変更された。
ZedBoard_PSPL_39_120908.png

68.External Ports を展開すると、axi_gpio_GPIO_IO_pin とprocessing_system7_0_GPIO_pin が外部ポートに出力されている。
ZedBoard_PSPL_40_120908.png
ZedBoard_PSPL_41_120908.png

69.ProjectメニューからDesign Rule Check を実行した。エラーはなかった。
ZedBoard_PSPL_42_120908.png

70.XPSを閉じた。

71.PlanAheadに戻った。system が追加されている。
ZedBoard_PSPL_43_120908.png

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた4(インプリメント)”に続く。

  1. 2012年09月08日 05:33 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた2(IPの追加)

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた1(XPSプロジェクトの生成)”の続き。

今回は AXI General Purpose IO、AXI Timer/Counter、ChipScope AXI Monitor、ChipScope Integrated Controller をXPSプロジェクトに追加する。

33.左のIP Catalog のGeneral Purpose IOを展開して AXI General Purpose IOをダブルクリックした。
ZedBoard_PSPL_5_120907.png

34.ダイアログが出るのでOKボタンをクリックした。
ZedBoard_PSPL_6_120907.png

35.axi_gpio_0 の設定ダイアログが開く。UserタブのChannel 1 を開き、GPIO Data Channel Width を 32 から 1 に変更した。
ZedBoard_PSPL_7_120907.png

36.どこのAXIバスに接続するか?設定するダイアログが出てくる。デフォルトのprocessing_system7_0 を確認してOKボタンをクリックした。
ZedBoard_PSPL_8_120907.png

37.axi_gpio_0 がXPSに表示された。
ZedBoard_PSPL_9_120907.png

38.左のIP Catalog のDMA and Timer を展開して AXI Timer/Counter をダブルクリックした。
ZedBoard_PSPL_10_120907.png

39.ダイアログが出るのでOKボタンをクリックした。
ZedBoard_PSPL_11_120907.png

40.axi_timer_0 のの設定ダイアログが開く。デフォルト値のままOKボタンをクリックした。
ZedBoard_PSPL_12_120907.png

41.どこのAXIバスに接続するか?設定するダイアログが出てくる。デフォルトのprocessing_system7_0 を確認して、OKボタンをクリックした。
ZedBoard_PSPL_13_120907.png

42.axi_timer_0 がXPSに表示された。
ZedBoard_PSPL_14_120907.png

これらのIPはPSのCentral Interconnect に接続されている32b GP AXI Master Port のM_AXI_GP0 に接続されている。
ZedBoard_PSPL_15_120907.png

ZedBoard_PSPL_16_120907.png


43.左のIP Catalog のDebug を展開して、ChipScope AXI Monitor をダブルクリックした。
ZedBoard_PSPL_17_120907.png

44.ダイアログが出るのでOKボタンをクリックした。
ZedBoard_PSPL_18_120907.png

45.chipscope_axi_monitor_0 の設定ダイアログが開く。デフォルト値のままOKボタンをクリックした。
ZedBoard_PSPL_19_120907.png

46.chipscope_axi_monitor_0 がXPSに表示された。
ZedBoard_PSPL_20_120907.png

47.先ほど同様、左のIP Catalog のDebugからChipScope Integrated Controller をダブルクリックした。
ZedBoard_PSPL_21_120907.png

48.ダイアログが出るのでOKボタンをクリックした。
ZedBoard_PSPL_22_120907.png

49.chipscope_icon_0 の設定ダイアログが開く。デフォルト値のままOKボタンをクリックした。
ZedBoard_PSPL_23_120907.png

50.chipscope_icon_0 がXPSに表示された。
ZedBoard_PSPL_24_120907.png

これで、axi_interconnect_1, axi_gpio_0, axi_timer_0, chipscope_axi_monitor_0, chipscope_icon_0がXPSに入った。

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた3(IPの設定)”に続く。

  1. 2012年09月07日 05:34 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

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”をやってみることにした。このチュートリアルはZC702ボードの”Zynq-7000(ZC702)のチュートリアル2をやってみた1(XPSプロジェクトの生成)”のチュートリアルとほとんど同じだ。ZC702ボードのチュートリアルとの違いは、WebPACKで行うということだ。でも、ChipScope Voucherがまだ来ていないので、chipscope_axi_monitor IPは組み込まないことにする。 ChipScope Voucherが来てライセンスをもらったので、ChipScopeを入れてやってみます。(2012/09/09:注)ChipScope Voucherが来てライセンスをもらう時には、Disk Serial Number でもらう必要がありました。Ethernet MACアドレスで貰うとChipScopeのライセンスが入ってなかったです。

今回もチュートリアルの26ページのFigure 3-1: Block Diagram を下に引用させて頂いた。
ZedBoard_PSPL_1_120906.jpg

なお、前回チュートリアル、”WebPACK14.2でZedBoardのHello Worldチュートリアルをやってみた”の図はなるべく共用しようと思うので、今回の図は、プロジェクト名やファイル名などは異なる場合があるので、ご了承ください。

1.最初にPlanAhead 14.2 を立ち上げた。Create New Project をクリックした。
ZedBoard_HW_1_120831.png

2.New Projectダイアログが開く。Next > ボタンをクリックした。
ZedBoard_HW_2_120831.png

3.Project Name とProject location を入力した。Next > ボタンをクリックした。
ZedBoard_PSPL_2_120906.png

4.RTL Projectを選択した。Next > ボタンをクリックした。
ZedBoard_HW_4_120831.png

5.Add Sources は何も入力しなかった。Next > ボタンをクリックした。
ZedBoard_HW_5_120831.png

6.Add Existing IPも何も入力しなかった。Next > ボタンをクリックした。
ZedBoard_HW_6_120831.png

7.Add Constraints も何も入力しなかった。Next > ボタンをクリックした。
ZedBoard_HW_7_120831.png

8.FPGAを選択した。Zynq-7000, CLG484, -1, C を選択した。Next > ボタンをクリックした。
ZedBoard_HW_8_120831.png

9.Summary が表示された。Finish ボタンをクリックした。
ZedBoard_HW_9_120831.png

10.PlanAheadプロジェクトが表示された。
ZedBoard_PSPL_3_120906.png

11.Sourcesウインドウで右クリックメニューからAdd Sourcres... を選択した。
ZedBoard_HW_11_120831.png

12.Add or Create Embedded Sources のラジオボタンをクリックした。Next > ボタンをクリックした。
ZedBoard_HW_12_120831.png

13.Create Sub-Design... ボタンをクリックした。
ZedBoard_HW_13_120831.png

14.XPSのプロジェクト名をsystem にした。OK ボタンをクリックした。
ZedBoard_HW_14_120831.png

15.system.xmp が入っているのが見える。Finish ボタンをクリックした。
ZedBoard_HW_15_120831.png

16.Xilinx Platform Studio (XPS) が立ち上がるが、ライセンスが見つからずにエラーとなった。
ZedBoard_HW_16_120831.png


17.Design Sources の下のsystem を右クリックして、右クリックメニューからRemove File from Project... を選択して、削除した。
ZedBoard_HW_17_120831.png

18.ダイアログで、Also delete the project local file/directory from disk をチェックして、プロジェクト空だけでなく、ディスクからも削除した。
ZedBoard_HW_18_120831.png

19.もう一度、前回の11.~15.を行い、system.xmp を作製した。

20.やはり、エラーダイアログが出てしまった。
ZedBoard_HW_16_120831.png

21.エラーダイアログでOKボタンをクリックすると、今度は、Xilinx License Configuration Manager が表示された。これをClose ボタンをクリックして閉じた。
ZedBoard_HW_19_120901.png

22.BSB Wizard を実行するかどうかを聞いてくるダイアログが現れた。これが前回との違いだけど、チュートリアルにこの記述はない。他にどうしようもないので、Yes ボタンをクリックした。
ZedBoard_HW_20_120901.png

23.Create New XPS Project Using BSB Wizard ダイアログが表示された。OKボタンをクリックした。ここまで進めるということはライセンスは入っていると思う。
ZedBoard_HW_21_120901.png

24.Boarad and System Selection ダイアログでは、ZC702しか選べない。後でZedBoardに変更することにして、Next >ボタンをクリックした。
ZedBoard_HW_22_120901.png

25.Peripheral Configuration は、すべてのPeripherals をRemove した。Finish ボタンをクリックした。
ZedBoard_HW_23_120901.png

26.Generate Project & Design Files... ダイアログが表示されて、プロジェクトがジェネレートされた。
ZedBoard_HW_24_120901.png

27.今回はunexpected error は出なかった。

28.XPSプロジェクトが生成できた。ちゃんとZynqのタブもあった。
ZedBoard_HW_26_120901.png

29.ZynqタブのImportアイコンをクリックして、ZedBoardのBoard Definition File を取り込む。Board Definition File はZedBoard.org のDocumentation ページのBoard Definition File ZedBoard Rev.C.1 (zedboard_RevC_v2.xml)を使用した。
ZedBoard_HW_27_120901.png

30.Import Zynq Processing System Configuraiton の User Templete にZC702ボードのXMLファイルが入っていたので、「 X 」ボタンをクリックして消去した。次に「+」ボタンをクリックして、zedboard_RevC_v2.xml を追加した。OKボタンをクリックした。
ZedBoard_HW_28_120901.png

31.確認のダイアログが出た。Yesボタンをクリックした。
ZedBoard_HW_29_120901.png

32.ZynqタブのI/O Peripherals の設定が28.と違っているのがわかると思う。
ZedBoard_PSPL_4_120907.png

WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた2(IPの追加)”に続く。
  1. 2012年09月06日 05:59 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

XSTでインスタンスをキープする(S属性、MARK_DEBUG制約)

XSTでネット名をキープする方法にはKEEP属性があったが、ネット名をキープしてくれないことも多い。当然インスタンスも名前がなくなっている。そんな時にS属性(S制約)を指定すると、FFが残ってくれる。最適化を抑制してくれるようだ。(”13.2 XST - KEEP または S 属性が Verilog でその役割を果たさない”を参照)

(*S="TRUE"*) reg vback_porch_clk_ddr2, vback_p_clk_ddr2_node;


S_attrib_120904.png

(2013/03/13:追記)
S属性と読んでいたものの正式名称は、”SAVE_NET_FLAG”だそうです。”制約ガイド UG625 (v. 13.4) 2012 年 1 月 18 日”の259ページに記載があります。
それによると、”未接続の信号が削除されないようにします。ネットに S 制約が設定されていない場合、ロ
ジックや I/O プリミティブに接続されていない信号はすべて削除されます。”だそうです。
hiyuh さん教えていただいて、ありがとうございました。

(MARK_DEBUG制約を追加)
”MARK_DEBUG”制約、同じマニュアルの171ページ。

true
ネットは、次のように処理されます。
– 最適化から保護されます。
– ChipScope ツールを使用したデバッグ用にマークされます。

  1. 2012年09月04日 14:04 |
  2. XST
  3. | トラックバック:0
  4. | コメント:0

Zynqの勉強1

Zynqのチュートリアルはやってきたが、Zynqのことをあまり勉強していなかったので、勉強しようと思う。

最初は、”Zynq-7000 All Programmable SoC 概要DS190 (v1.2) 2012年8月21日”という日本語のデータシートを読んでみた。英語データシートも参照した。

プロセッシング システム (PS)
・Dual-core ARM® Cortex™-A9 Based Application Processor Unit
・CPU周波数はXC7Z010、XC7Z020は最大800MHzで、XC7Z030、XC7C045は最大1GHz。ZedBoardは-1なので666.7MHzで動作している。
・NEON™ メディア処理エンジン
・Coherent multiprocessor support
・単精度および倍精度のベクター浮動小数点ユニット (VFPU)
・タイマーと割り込み
・1次キャッシュは32KB。CPU毎に4ウェイセットアソシアティブ命令/データキャッシュ
・2次キャッシュはCPU同士共有の256KB
・オンチップ ブートROM
・256KBオンチップRAM(OCM) PSとPLから高速にアクセスできる。PSとPLのデータのやり取りに有効か?
・DDR3/DDR2/LPDDR2をサポートして、16ビット幅、32ビット幅のメモリをサポートするそうだ。
・1GBのアドレス空間 (DDR)
・8ビット幅のSRAMメモリインターフェイス、パラレルNORフラッシュもサポート。
・スキャッター/ギャザー対応の8チャネル・メモリコントローラー
・最大 12 のエンドポイントをサポートする 2 つのUSB2.0 OTGペリフェラル
・CAN 2.0B対応のCANバス インターフェイス2つ
・SPI x 2、UART x 2、I2C x 2、GPIO x 4
・MIO (multiplexed I/O)
・PS-PLインターフェイスは、32ビットAXIマスタ x 2、32ビットAXIスレーブ x 2、DDRやOCM(RAM) へアクセスできる高性能AXIスレーブ x 4、CPUメモリへのコヒーレントがアクセスが可能なAXIスレーブ x 1 (ACPポート)
CPUメモリへのコヒーレントなアクセスが可能ということは、CPUがキャッシュしている領域へDMAしてもキャッシュをインバリデートする必要が無いということだと思う。もしくは、CPUがライトバックキャッシュにキャッシュしているデータをDMAする時にも、CPUにキャッシュから実メモリに吐き出すコードを実行する必要がないという事だろう。この様な用途では性能が向上することが期待できる。

プログラマブル ロジック (PL)
・XC7Z010、XC7Z020には入っていないが、PCI Express ブロックが入っている。
・A/Dコンバータ x 2
ZedBoardのXC7Z020は6入力LUTで、53,200個のLUT、106,400個のFF、BRAM(32Kb)は140個で560KB、DPSは220個。
AtlysボードのXC6SLX45は、27,288個のLUT、54,576個のFF、BRAM(18Kb)は116個で261KB。
ということで、AtlysボードのFPGAの約2倍の規模ということが出来る。

しかし、PSは凄いですね。使いこなすのが難しそう。ちょこちょこっとチュートリアルはできても、その先は、やるのが難しい?ブログ書いている場合じゃなく本気で開発する必要があるか?でも製作記ブログを書けるかな?今のところその気はないが、カメラは付けてみたい。
  1. 2012年09月04日 05:42 |
  2. Zynq
  3. | トラックバック:0
  4. | コメント:0

WebPACK14.2でZedBoardのHello Worldチュートリアルをやってみた3(SDK)

WebPACK14.2でZedBoardのHello Worldチュートリアルをやってみた2(Logic EditionでXPS)”の続き。

前回はXPSプロジェクトの設定を行った。今回はSDKを使用して Hello World を Tera Term に表示する。

40.PlanAheadプロジェクトでSourcesウインドウのsystem で右クリックメニューからCreate Top HDLを選択して、トップのHDLにファイルを生成する。
ZedBoard_HW_38_120901.png

41.sytsem_stub.v が生成された。
ZedBoard_HW_39_120901.png

42.PL部分は今回無しなので、このままハードウェアをSDKにExport する。File メニューからExprot -> Export Hardware for SDK... を選択する。
ZedBoard_HW_40_120901.png

43.Export Hardware for SDKダイアログが立ち上がる。Launch SDKのチェックボックスをチェックして、OKボタンをクリックした。
ZedBoard_HW_41_120901.png

44.SDKが立ち上がった。
ZedBoard_HW_42_20901.png

なお、.tcl ファイルは、JTAGで制御する際にXMDがPSのコンフィギュレーションに使うそうだ。 ps7_init.c と ps7_init.h は、PSのコードとDDR, PLL MIOの初期化を行うそうだ。確かに、”WebPACK14.2でZedBoardのHello Worldチュートリアルをやってみた2(Logic EditionでXPS)”の30.で読み込ませた zedboard_RevC_v2.xml を見るとその様なことが書いてある。

45.C言語のプロジェクトを作製しよう。File メニューからNew -> Xilinx C Project を選択する。
ZedBoard_HW_43_20902.png

46.New Xilinx Project ダイアログが開く。設定はそのままにNext > ボタンをクリックした。
ZedBoard_HW_44_20902.png

47.次のダイアログが開く。Finish ボタンをクリックした。
ZedBoard_HW_45_20902.png

48.Binaries, Include, Debug, src の4つのフォルダが出来て、コンパイルも終了した。
ZedBoard_HW_46_20902.png

49.ZedBoard: Zynq-7000 AP SoC Concepts, Tools, and Techniques A Hands-On Guide to Effective Embedded System Design 8/22/2012 のPage 22 Figure 2‐10: ZedBoard Power switch and Jumper settings の通りにZedBoard のジャンパー設定を切り替えた。

50.マイクロUSBのケーブルをZedBoard のUSB UART(J14) とJTAG(J17) に接続して、パソコンのUSBポートに接続した。

51.電源ケーブルをZedBoard に接続した。
ZedBoard_HW_56_120902.jpg

52.ZedBoard の電源SWをONした。

Cypress社のUSB-UART ICのドライバがインストールされていない場合は、デバイスマネージャーからCypress社のUSB-UART ICのドライバをインストールする。インストールについては、ZedBoard.orgのDocumentation のCypress USB-to-UART Setup Guide Rev. 1.1 を参照のこと。

53.Tera Termを立ちあげて、シリアルポートのCypress Serial に設定した。
ZedBoard_HW_47_20902.png

54.設定メニューのシリアルポートを選んで、ビットレートを設定する。
ZedBoard_HW_48_20902.png

55.シリアルポートのビットレートを115200に設定した。
ZedBoard_HW_49_20902.png

56.SDKで、hello_world_0 の右クリックメニューからRun As -> Run Configurations... を選択した。
ZedBoard_HW_50_20902.png

57.Xilinx C/C++ ELF の右クリックメニューからNew を選択した。
ZedBoard_HW_51_20902.png

58.新しくhello_world_0 Debug コンフィギュレーションが生成された。
ZedBoard_HW_52_20902.png

59.Device Initialization タブの内容。
ZedBoard_HW_53_20902.png

60.STDIO Connection タブでは、Connect STDIO to Console のチェックボックスにチェックを入れて、BAUD Rate に115200を設定した。Apply ボタンをクリックしてから、Run ボタンをクリックした。
ZedBoard_HW_54_20902.png

61.Tera Termのターミナル上に”Hello World”が表示された。
ZedBoard_HW_55_20902.png

62.実行後のSDKを下に示す。
ZedBoard_HW_56_20902.png

これで、WebPACK14.2 でHello Worldを表示することが出来た。

  1. 2012年09月02日 17:59 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0

映画「ひみつのアッコちゃん」を見てきました

今日は久しぶりに雨が降って、良いお湿りで良いのですが、とっても不穏な雲が出ていて、おかしな天気でした。
black_cloud_120902.jpg

そんな天気ですが、奥さんと映画に行って来ました。映画「ひみつのアッコちゃん」です。ひみつのアッコちゃんは小学校の頃アニメを見てました。どんな映画に仕上がっているか?と思って見に行きました。いや~、面白かったです。抱腹絶倒。思い切り笑っちゃいました。楽しかったです。早稲田大学、算数学部あったら面白いですね?
  1. 2012年09月02日 13:37 |
  2. 日記
  3. | トラックバック:0
  4. | コメント:0

WebPACK14.2でZedBoardのHello Worldチュートリアルをやってみた2(Logic EditionでXPS)

WebPACK14.2でZedBoardのHello Worldチュートリアルをやってみた1(エラー発生)”の続き。

前回は、XPSプロジェクトを開くところでエラーになってしまった。アドバイスを元にISE14.2 WebPACKをアンインストールして、ISE14.2 Logic Edition をインストールして、WebPACKのライセンスで動かした。

前回、XPSプロジェクトでエラーが出たところで終わっているので、エラーダイアログを終了させて、PlanAheadプロジェクトに入ってしまっているsystem.xmp を削除してもう一度やり直すことにした。

17.Design Sources の下のsystem を右クリックして、右クリックメニューからRemove File from Project... を選択して、削除した。
ZedBoard_HW_17_120831.png

18.ダイアログで、Also delete the project local file/directory from disk をチェックして、プロジェクト空だけでなく、ディスクからも削除した。
ZedBoard_HW_18_120831.png

19.もう一度、前回の11.~15.を行い、system.xmp を作製した。

20.やはり、エラーダイアログが出てしまった。
ZedBoard_HW_16_120831.png

21.エラーダイアログでOKボタンをクリックすると、今度は、Xilinx License Configuration Manager が表示された。これをClose ボタンをクリックして閉じた。
ZedBoard_HW_19_120901.png

22.BSB Wizard を実行するかどうかを聞いてくるダイアログが現れた。これが前回との違いだけど、チュートリアルにこの記述はない。他にどうしようもないので、Yes ボタンをクリックした。
ZedBoard_HW_20_120901.png

23.Create New XPS Project Using BSB Wizard ダイアログが表示された。OKボタンをクリックした。ここまで進めるということはライセンスは入っていると思う。
ZedBoard_HW_21_120901.png

24.Boarad and System Selection ダイアログでは、ZC702しか選べない。後でZedBoardに変更することにして、Next >ボタンをクリックした。
ZedBoard_HW_22_120901.png

25.Peripheral Configuration は、すべてのPeripherals をRemove した。Finish ボタンをクリックした。
ZedBoard_HW_23_120901.png

26.Generate Project & Design Files... ダイアログが表示されて、プロジェクトがジェネレートされた。
ZedBoard_HW_24_120901.png

27.unexpected error が出た。
ZedBoard_HW_25_120901.png

28.エラーダイアログのOKボタンをクリックして、もう一度、25.26.を実行したら、XPSプロジェクトが生成できた。ちゃんとZynqのタブもあった。
ZedBoard_HW_26_120901.png

29.ZynqタブのImportアイコンをクリックして、ZedBoardのBoard Definition File を取り込む。Board Definition File はZedBoard.org のDocumentation ページのBoard Definition File ZedBoard Rev.C.1 (zedboard_RevC_v2.xml)を使用した。
ZedBoard_HW_27_120901.png

30.Import Zynq Processing System Configuraiton のUser Templete の「+」ボタンをクリックして、zedboard_RevC_v2.xml を追加した。OKボタンをクリックした。
ZedBoard_HW_28_120901.png

31.確認のダイアログが出た。Yesボタンをクリックした。
ZedBoard_HW_29_120901.png

32.ZynqタブのI/O Peripherals の設定が28.と違っているのがわかると思う。
ZedBoard_HW_30_120901.png

33.ZynqタブのI/O Peripherals をクリックした。
ZedBoard_HW_31_120901.png

34.Zynq PS MIO Configurations ウインドウが開く。ZedBoardのProcessing System (PS) のMIOピンの割り当てが見える。ここでUSB-UARTポートに接続されているUART1はイネーブルだが、UART0はディスエーブルされている。
ZedBoard_HW_32_120901.png

35.ここでXPSの他のタブの内容を示す。まずはBus Interfaceタブ。
ZedBoard_HW_33_120901.png

36.Portsタブ。Programmable Logic (PL) は未使用なのでPSの外部ピンのみと、processing_system7_0 の内部ピンが見えている。
ZedBoard_HW_34_120901.png

37.Addressタブ。
ZedBoard_HW_35_120901.png

38.今度は下のタブで、Graphical Design Viewタブ、processing_system7_0 が見える。
ZedBoard_HW_36_120901.png

39.XPSを終了すると、PlanAheadにsystem.xmp が入っているのが見えた。
ZedBoard_HW_37_120901.png

(注)これらは無料のWebPACKでやっています。ライセンスを買わなくても、誰でもXilinxに登録してISE14.2をダウンロードすれば試せます。


WebPACK14.2でZedBoardのHello Worldチュートリアルをやってみた3(SDK)”に続く。

  1. 2012年09月01日 09:38 |
  2. ZedBoard
  3. | トラックバック:0
  4. | コメント:0