FPGAベースのAmbilightクローンを作成するにはどうすればよいですか?


10

いくつかの簡単な背景:
Ambilightは一部のPhilips TVのシステムで、画面上の色情報を分析し、ディスプレイの背面にあるLEDをいくつか設定して、画面の色を壁に投影します。それはかなり気の利いた効果です。PCを使用してビデオを処理し、LEDを制御するこのシステムのクローンが世に出ています。私はこれは少しやり過ぎであることがわかりました-いくつかのLEDを踊るためにマシン全体を使用して...

私は変更したいbunnieのNETVを処理するために、暗号化されていないがHDMIビデオフィードといくつかのLEDの駆動。NeTVが他の目的のために設計されていることは知っていますが、目標を達成するために変更できると思います。基盤となるLinuxサブシステム、I2Cスプーフィング、ビデオオーバーレイなどは気にしません。現時点では、HDCP暗号化ストリームの操作については関係ありません。

NeTV回路図

NeTVソースコード

FPGAブロック図 NeTVブロック図
これは、バニーのプレゼンテーションスライドの1つからのブロック図です。スライドセット
残りの部分はこちらです。

HSYNC、VSYNC、PIXCLKを示すスライド
このスライドは、ビデオピクセルが実際にはデコードされている(必ずしも解読されているわけではない)ことを示唆しているようです。

最後に...私の考えと質問のいくつか:

  1. これは私の希望するハードウェアで実行できますか?「はい」の場合、続行してください!「いいえ」の場合は、さらに何が必要かを教えてください。

  2. 外部メモリがなくてもビデオ情報を処理できますか?私が知る限り、FPGAが直接アクセスできるメモリはありません。これはおそらく、ビデオデータの処理に使用するアルゴリズムに依存します-できるだけ少ないFPGAブロックRAMを使用するには、全体を格納するのではなく、入ってくるピクセルのある種の「反復加算」を使用したいと思います画像データのフレームと色の平均化。このアルゴリズムの実装に関するヒントはありますか?これを始める方法は私の最大のハードルです。

  3. 私はビデオデータのどこに「タップ」する必要があるかについてソースコードを調査しました。
    これは適切な場所のように見えます。
    DVIデコーダーのブロック図
    私は知っています。この画像は長いです-読みやすくするために私ができる最高のことです。ザイリンクスのツールを非難してください!
    これは、TMDSデータを取り込み、各色について8ビットを出力するようです。

  4. LEDドライバー用のある種のステートマシンが必要です。クロックサイクルごとに、ビデオデータを処理するために作成したモジュールからピクセル情報を取得します。

これが冗長または長い場合は申し訳ありません-私は徹底的にしようとしています...これで地面から降りるのに少し助けが必要です。これは、FPGAプロジェクトでの最初の試みです。初心者には難しすぎると言う人もいますが、どこかで始めなければならないと思います。


1
NeTVはHDMIストリームをデコードしません。HDCPネゴシエーションプロセスに従い、新しいストリームを暗号化して一致させます。あなたはこれからビデオ情報を得ることができないと思います。
akohlsmith 2012

関連する回路図(へのリンク)を投稿していただけませんか?また、関連するHDLモジュールの宣言も役立ちます。
drxzcl 2012

1
@AndrewKohlsmith、オーバーレイはTV側で行われますか?うわー、HDMIでそれができるとは思いもしませんでした。
drxzcl 2012

1
外部メモリフレームバッファーを使用せずに必要なすべてを実行できるかどうかはわかりませんが、とにかく、どのカラー分析を使用する予定ですか?FFTの場合は時間がかかるため、環境光がビデオの色に対して遅すぎないかどうかはわかりません。まず、HDMIからデータを取得して、分析できるかどうかを確認します。たとえば、ローパスフィルターを実行し、結果を出力します。
ソクラテス

1
NeTVが出たときにこれを読み返したのを覚えています。その投稿によると、BunnieはソースHDMIの復号化を必要としないトリッキーなオーバーレイスキームを使用しています。彼は必要なときにそれを再暗号化するだけです。暗号化されたストリームのデコードはありません。
mng 2012

回答:


7

私は完全に私の回答をdvi_decoderモジュールのコードとドキュメントに基づいており、それが実際に宣伝どおりに機能すると想定しています。このファイルは、アプリケーションノートのSpartan-3A FPGAでのTMDS I / Oを使用したビデオ接続および/またはSpartan-6 FPGAでのTMDSビデオインターフェイスの実装のIPの(変更?)コピーのようです。これらのアプリノートには重要な詳細がぎっしり詰まっています。注意して読むことをお勧めします。

質問で指摘したように、暗号化されていないストリーム、つまり非HDCPストリームを扱っていると想定します。NeTVプロジェクトの情報がHDCPを復号化するように適合できることはかなり確実ですが、それは重要な追加作業を伴い、管轄によっては法的根拠に疑問の余地があります。

dvi_decoderブロックの出力から必要なデータを取得できるようです。ブロックは、ワイヤを使用して、24ビットの色情報を出力しredgreenそしてblue、ピクセルクロックに同期pclk。出力hsyncvsync行/画面の終わりをそれぞれユーザーに警告します。一般に、これらの出力を使用してオンザフライで平均化できるはずです。

を変換するにはいくつかの基本的なロジックが必要hsyncvsyncあり、ピクセルクロックは(X、Y)の場所に配置されます。2つのカウンターをインスタンス化するだけXですYXピクセルクロックごとに増分します。でXゼロにリセットしますhsyncY毎に増加hsyncY毎にゼロにリセットしますvsync

使用してredgreenblueXそしてY、あなたはフライ平均に行うことができます。とを比較することXY、各ピクセルが貢献しているボックスがあれば、そのボックスを決定できます。カラー値を累積レジスタに合計します。平均値を取得するには、レジスタの値をピクセル数で除算する必要があります。賢い場合は、ピクセル数が2の累乗であることを確認します。次に、レジスタのMSBを駆動したいものに配線するだけです。

累積しながらディスプレイを駆動したいので、ダブルバッファリングを行う必要があります。したがって、コンポーネントごとにボックスごとに2つのレジスタが必要になります。25主導の文字列を使用している場合は、25 * 3 * 2 = 150のレジスタが必要になります。これはかなりの量なので、レジスターの代わりにブロックRAMを使用することをお勧めします。それはすべてあなたの正確な要件に依存します、実験してください!

元のadafruitプロジェクトキットで使用されているようなリードストリングを駆動することを想定しています。SPIを使用すると、レジスタの値からそれを簡単に駆動する方法を理解できるはずです。

dvi_decoderモジュールは、かなり複雑なキットです。アプリノートを詳しく検討することをお勧めします。

余談ですが、このプロジェクトで使用するNeTVをまだ購入していない場合は、DigilentのAtlysボードもご覧になることをお勧めします。2つのHDMI入力と2つのHDMI出力を備えているため、この種のプロジェクトに合わせて作成されているようです。


NP、クールな質問をありがとう。このプロジェクトで特定の問題が発生した場合は、再度投稿してください。
drxzcl 2012

ところで、(そしてこれは完全に質問の範囲外です)あなたは比較的頑丈なマイクロコントローラーシステムから物事を運転することを考えましたか?RaspberryPiのようなものは約6倍安価であり、LEDを駆動し、同時にビデオを表示できるはずです。
drxzcl 2012

私のJTAGツールが来るのをまだ待っているので、ChipScopeでデバッグできます...この答えを受け入れようとしています。この問題を解決するための基本的なアプローチを示します。@drzxcl私はすでにnetvを所有しています。RaspPiは興味深い提案ですが、ビデオソースとしてhdmiを使用することは不可能です。
dext0rb

これを機能させたことがありますか?記事やビデオを見たいです!
drxzcl 2013年

いいえ、そうではありません。:| 中途半端なLEDドライバーを作成しましたが、それについて詳しく説明する時間がありませんでした。うまくいけばすぐに。
dext0rb 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.