あなたの使っているそのモニターの遅延,一体どれだけあるのでしょうか?気になりますよね?
ということで,HDMIディスプレイの遅延測定器のプロジェクトを作りました.せっかくなので公開しました.ZYBO持っている方はぜひご利用ください.
やっとZYBO単体でHDMIディスプレイ遅延測定太郎がちゃんと動くようになった。 pic.twitter.com/ZzeEvoOYHO
— fumi (@fumi_maker) June 8, 2022
1.概要
HDMIディスプレイの遅延を測定することができるシステムを作りました.HDMI信号を出力し,ディスプレイが発光し,光として帰ってくるまでの遅延時間を測定します.フォトトランジスタと抵抗,ブレッドボードなどが必要です.(4章参照)
また,スライドスイッチ[2:0]をHにするとテストモードとしてRGBの信号がHDMI出力されます.
2.Environments
本システムでは以下の環境で動くことを確認しています.
- Vivado 2019.2
- Vitis 2019.2
- Vivado HLS 2019.2
- Digilent ZYBO Z7-20
3.FPGA周りの構築
3-1. clone or download
git clone https://github.com/fumimaker/display_latency.git
3-2. Digilentのライブラリをダウンロード
本プロジェクトではDigilentのvivado-libraryを使用しています.ダウンロードし,vivado-library/ip/rgb2dvi
をdisplay_latency/ip_repo
にコピーしてください.
git clone https://github.com/Digilent/vivado-library.git
https://github.com/Digilent/vivado-library
3-3.Vivadoでtclを読み込む.
cd ~/.display_latency
で移動
source ./display_latency.tcl
でプロジェクトを構築する.
うまく行けばこのようなブロックデザインができます.
TMDSエラーがでる
[BD 41-49] Could not find abstraction definition for the interface: TMDS [BD 41-51] Could not find bus definition for the interface: TMDS
このようなWarningがでますが,TMDSというバスを定義せずそのまま配線しているため出ます.問題ないので次に進んでください.
[PSU-1] Parameter : PCW_UIPARAM_DDR_DQS_TO_CLK_DELAY_0 has negative value -0.050 . PS DDR interfaces might fail when entering negative DQS skew values.
というようなエラーがでるかと思いますが,これも無視で良いようです.
rgb2dviがない場合
digilentのIP(rgb2dvi)がない場合,このようにうまくプロジェクトが作れません.3-2を参考に追加してください.
3-4.論理合成してExport Hardware
Generate Bitstreamより論理合成します.ここでもTMDSバスが未定義のエラーが出ますが問題ありません.
Export→Export Hardwareより出力します.場所は同じ場所で大丈夫だと思います.
3-5.Vitisを起動する
Vitis用のディレクトリをつくり,そこを指定しLaunchします.
適当なプロジェクトの名前をつけます.ここではdisplay_latencyとしました.次に+マークより先程出力したHardwareを指定します.
ドメインはそのままで.
Hello Worldを選びます.
3-6.VitisでソースコードをImportする
src/vitis/main.cをインポートしてください.もとからあるhelloworld.cは消してください.(もしくはhelloworldにmainを上書きでもOKです)
3-7.ビルド
ソースコードを選択した状態でトンカチマークをクリック.
Buildでエラーになる
fatal error: platform.h: No such file or directory main.c /display_latency/src line 50 C/C++ Problem
というようなエラーが発生する.
多分,Empty applicationを選んでしまったのではないでしょうか.Emptyだとplatform.hが生成されないのでこのようなエラーになると思います.
3-8.シリアルポートを開く
TeratermやTerminalから115200@8N1でポートを開きます.
3-9.センサーをZYBOにつなき,ディスプレイに設置
センサー回路を作ってZYBOに接続します.初期のピン配置だとJEポートの2番ピンに接続します.(気に入らなければ別のところに変更してもらっても問題ありません) ZYBOとモニターをHDMIケーブルで接続します.また,ディスプレイにセンサーを設置します.センサーとディスプレイの間に隙間がないように設置してください.設置例↓
3-10.書き込む
Run asからLaunch on Hardwareを選択します.これにより,PLのConfigとPSのFlashにデータが書き込まれます.シリアルモニターで「type something to start」みたいなのが表示されたら通信できています.
3-11.測定する
センサーをモニターに設置したらなにかを入力してEnterを押します.スタートすると画面が点滅を始め,測定を開始します.画面にはHDMI入力をしてから光として帰ってくるまでの遅延時間[ms]が表示されます.secにしたかったり表示方法を変えたい場合はvitisプロジェクトのhelloworld.cのprintfのところを適宜変更してください.
スライドスイッチが1つでもHになっているとテストモードに入って色が出力されてしまうのですべてLにするようにしてください.
4.ハードウェアの構築
自分の場合は秋月で買えるNJL7502Lを使っています.回路図を以下に示します.
RL=1[MΩ]を使いました.ディスプレイOFFで0.3V, ディスプレイONで3.1V程度が得られましたのでLVCMOS33のレベルでは十分だと判断しました.場合によってはロジックICなどで整形してもいいかもしれません.なお,本構成においてPhoto Trセンサー自身の遅延時間を測定したところ,20-30[us]程度でした.測定したいオーダーからすると十分なレイテンシだと判断しています.ディスプレイを暗い状態にすると遅延が増加し,100-150[us」となりました.usオーダーまでの精度が必要な場合にはオフセットの必要がある場合もあることにご留意ください.
センサーをディスプレイの左上の最初のピクセルに合わせて貼り付けます.フォトトランジスタには指向性があるので注意してください.NJL7502Lは砲弾型3mmのセンサで,そのままディスプレイに貼り付けることができなかったので3DPrinterで適当な治具を設計しました.よろしければご利用ください.センサにディスプレイ以外の光が入ると誤差がでてしまうので気をつけましょう.治具ではセンサを押し込んで周りの光が入らないようにしています.
ZYBOとモニターをHDMIケーブル接続し,スライドスイッチをHにするとディスプレイを光らせられるのでテスターなどを使って出力電圧を測定して適宜センサーの位置や反応具合を調整してください.
5.その他の機能
スライドスイッチ[2:0]をHにするとテスト用の色が出力されます.センサーが正しく反応していることを確認するなどに使えますのでご利用ください.また,SWが1つでもHになってる状態で遅延の測定はできません.
↓赤を出力している様子,7色を出せます.
6.質問
センサーは何でもいいの?
自分は秋月で買えるNJL7502Lを使っていますがそのほかのものでも同様にできると思います.感度や指向性が違う場合は調整が必要です.可視光にピークがあるものを使ってください.また,応答時間も公開されているので参考にしてください(この場合は10usだそうです).cdsは応答時間がおそすぎる(一般的に20-30ms程度とされている)ので測定では使えません.
回路を作るのがめんどくさい人はswitch scienceとかで売ってるモジュールみたいなものを買ってもできるかもしれません(未確認)
GtoGも測りたい
Verilog書き換えるだけなのですぐに実装できると思います.要望があれば作りますし,もし作ったらぜひプルリクください.公称値とどれくらい違うのかとか興味あります.
Eizoの調査では,Grayは白よりもオーバードライブによる高速化が可能だが,中間色であるGrayでは速度に振り切った制御(オーバードライブ)ができず白よりも時間がかかりやすくなるとしている.したがって実用上のディスプレイの遅延時間を測定するのであればGray to Grayのほうが適していると考えられる.メーカーはGtoG時間としてデータを公表しているが,メーカー間での測定環境や測定器,ディスプレイの輝度などが統一されておらず同一環境での評価ができているとは言えない.本ツールを使うことで同条件で測定することができ,より正確な応答時間の測定を実現できると考える.
Zybo以外で使いたい
XilinxであればHDMIがあればすぐできると思います.制約ファイルを適宜書き換えてください.その他のメーカーの場合はAXIが使えないのでVideogen.vを参考に作り直す必要がありますが,できると思います.
HLSのIPは何をしている?
VideoGen.vを制御する太郎です.ほぼ遅延時間のパラレル信号→AXI4-Lite変換としてしか使っていません.finishedソースも/video_latency/src/hlsに入れてあるので,機能を追加したい場合はそれを高位合成してください.(何か機能を追加したらぜひプルリク出してくれると嬉しいです)
Zyboってどこで売ってるの?
電子部品で有名な秋月電子他,通販でも購入可能です.
使ってみました
Twitter(@fumi_maker)やissueでもいいので教えてください,喜びます.
7.License
本プロジェクトはMITライセンスです.
まとめ
今回始めてFPGAで作ったものを公開しました.そのままプロジェクトを全部アーカイブしてZIPで上げても良いんですが,色々とゴミが入ってしまったり,意味のないxmlが生み出すクソデカファイルが連なってしまうのでソースコードとtclだけ公開して各自のPCでつくりなおしてもらうというやり方をやってみました.
結構たいへんですね.この辺もっと簡単にできるようになったらいいんですが・・・.ignoreしても毎回3000files changedとかなってgit管理で困ってしまっているのでこの辺なんとかなる方法が知りたいです.githubにはお便利ストレージとしてしか使っていなくてごめんなさいの気持ちです.
今日は以上です.