方針
実際に動作しているときの様子を見てみるのが手っ取り早いかと思うので、PS部(CPU)とPL部(FPGA)のそれぞれでデバッガでの動作チェックをしてみたいと思います。
PL部(FPGA)のデバッグ
XilinxのFPGAでは、ILA(Integrated Logic Analyzer)が便利です。
これは、FPGAロジック内部の信号を動作中にモニタする機能で、合成またはインプリメントの前に観測したい信号を設定しておきます。
今回気になるのは、
- ちゃんと画像データが流れているのか?
- 画像出力のタイミング信号がちゃんと出ているのか?
といったところ。
これらを見てみようと思います。
ILAの設定
まずVivadoを開いて、ブロックデザインを開いてみます。
axi_vdma_0(AXI Video Direct Memory Access)のM_AXIS_MM2Sポートにつながっているネットを選択します。このネットは、PS部のDDRメモリから取り出した画像データを画像出力パスに流すAXI4 Streamインターフェースになっています。
このネットを右クリックすると、"Debug"のメニューが出ます。これを選択すると、デバッグするネットとして指定されます。
そうすると、"Designer Assistance available"と出るので、ありがたく使わせてもらいます。
"Run Connection Automation"のダイアログでは、そのままOKします。
すると、ブロックデザインにILAコアが追加されます。
同様にして、v_axi4s_vid_out_0(AXI4-Stream to Video Out)のvid_outのネットにILAを準備、接続します。ここのネットの中身を見てみると、画像出力のタイミング信号らしきものが含まれていて、様子を見るのによさそうな感じです。(IPブロックのポートの部分の+マークをクリックすると、ポートに含まれる信号が表示されます。)
ここまでできたら、ブロックデザインを保存(ブロックデザイン上でCtrl+S)して、合成・インプリメント・ビットストリーム生成を行います。
ILAでの波形観測
いつも通り、SDKへのハードウェアエクスポート、FPGAの書き込み、SDKでのプログラムのデバッグ実行を行います。
この後、VivadoのFlow Navigatorから"Open Hardware Manager"をクリックします。
Hardware Managerが立ち上がるので、"Open target"、"Auto Conect"とクリックします。
すると、PCに接続されているZYBOのFPGAデバイスが自動で検出され、"Hardware"ウィンドウに表示されます。
2つのデバイスが見えますが、"arm_dap_0"というほうがZynqのARMコア、"xc7z010_1"というほうがPL部を表します。
"Refresh Device"をクリックし、対象のFPGAデバイスを選択します。
すると、上の手順で追加したILAが"Hardware"ウィンドウの中で"hw_ila_1"、"hw_ila_2"として現れます。また、波形ウィンドウも現れます。
右下の"Trigger Setup"ウィンドウで、波形観測のトリガとなる信号を設定できます。+ボタンを押すと、波形選択が現れるので、選択します。波形ウィンドウからドラッグ&ドロップでも可能です。
ここでは、"TVALID"信号を選択します。
"Trigger Serup"や"Settings"のウィンドウで、トリガ条件(比較する値、値の一致・不一致など)、トリガ位置(サンプルウィンドウ内でトリガ条件が成立する点の位置)を設定できます。今回は、TVALID==1 がトリガ条件で、サンプルウィンドウの深さは1024、トリガ位置は512(ちょうど真ん中)です。
矢印ボタンを押すと、トリガ待ち状態になります。 今回は、TVALID信号が常に発生しているようで、すぐにトリガがかかって波形が出てきました。
とりあえずデータは流れているよう。
もう1つのILAのほうを見てみます。
今回は上のほうのタブに自動的に"hw_ila_2"として出てきています。 もし出ていなかったら、"Hardware"ウィンドウの"hw_ila_2"をダブルクリックすれば波形ウィンドウを出すことができます。
これで適当な信号を選んでトリガ待ちを開始しましたが、トリガがかかりませんでした。("Hardware"ウィンドウで見ると、"Status"が"Waiting For Trigger"となっている)
v_axi4s_vid_out_0からちゃんとタイミング信号が出ていないということなので、もう少し原因を追ってみます。
ブロックデザイン再確認
ブロックデザインに戻って見てみると、タイミング信号の元になりそうなところがあります。
v_tc_out(Video Timing Controller)からv_axi4s_vid_out_0に行っている信号が、先ほど見た信号とほぼ同じ内容になっています。これをILAで見てみます。
また、v_axi4s_vid_out_0からv_tc_outのgen_clkenポートに信号が行っています。これもILAでの観測信号に追加します。
"Debug"設定を付けて、Designer Assistance機能でILAを追加しますが、よく見てみると、"v_axis_vid_out_0_vtg_ce"信号の"Source Clock"が"None(Connect manual)"となっています。
今まで見た信号はVivadoのほうで自動で対応するクロックを見つけてくれていましたが、この信号は自分で設定しないといけないようです。
ブロックデザインを見る限り、v_tc_outへ接続されているクロック信号は"s_axi_aclk"と"clk"で、このうち"s_axi_aclk"はPS部からの制御用AXIポートのクロックに当たるので、もう一方が実際の動作クロックに当たるのではないかと考えられます(本当はちゃんと確認したほうがいいかもしれません。合成した後にVivadoの機能で確認できたりします)。
"clk"ポートに接続されているのは"axi_dynclk_0"の"PXL_CLK_O"ポートなので、これを選びます。
すると、既存の"system_ila_1"にポートが追加されて、そこに接続されました。
これで再度合成、インプリメント、実機動作をしてみます。
"system_ila_1"に信号が追加されたので、"hw_ila_2"を開き、+ボタンを押して追加された信号を波形ウィンドウに追加します。
また、トリガ信号に、追加した信号のうち"hsync_1"を設定して見てみると、ここの信号はちゃんと出ているようでした。
ということは、v_axi4s_vid_out_0(AXI4-Stream to Video Out)の設定か使い方に問題があるのでは、となります。
このIPは、Xilinx製のIPで、Zybo-hdmi-outプロジェクトと現在のプロジェクトで比較してみると、バージョンは同じになっていました。設定も同じよう。
じゃあ何が違うのか、ということで接続されているものを再確認すると、
と、AXI4-Stream Subset Converterの設定で"TLAST Remap String"が"1'b0"となっていて、常に0になってしまうような感じでした。
前回見たところでは、
と、"tlast[0]"となっていました。(Zybo-hdmi-outプロジェクトでも同じ)
設定変更したときに一緒に変更されてしまったのか。
これを修正して再度トライ。
インプリメント後、確認してみるとCritical Warningが発生して、Project Summary (Flow NavivatorのPROJECT MANAGERをクリックすると出てくる)を見ると、タイミング制約を満たせなかったようです。たぶんILAの信号の追加のし過ぎのため。もしかしたらこの前もそうなっていたかも。
ILAの信号を一部削除して再度インプリメントします。
一度system_ila_1を削除して再度追加したほうが楽そうです。
今度Designer Assistanceを使用したときに、接続する信号を選択できるので、最初に接続したものだけ選択します。
これで再度進めます。
いけました!
信号もちゃんと出ています。
振り返り
かなり長くなってしまいました。
デバッグの過程をブログに書きながらだとなかなか大変…
デバッグ手順が自分の中で整理できていないからかもしれません。
HDMI制御の詳細も全く追っていないので、進めていったときに困るかも。
まあ必要に応じて見ていきます。
次回
今度からはカメラモジュールを接続して画像を取り込めるようにしたいと思います。