画像・映像処理
MIPIやHDMIのインターフェースからラインバッファ、ISP段、DRAM上のフレームバッファまで、映像がFPGAの中をどう流れるか、そして帯域幅をどう見積もるかを解説します。
概要
映像は、誰かがそう計画したかどうかにかかわらず、FPGAがそのために作られたと言えるアプリケーションです。カメラは固定レートで固定のピクセルストリームを生み出し、どのピクセルにも同じ演算が必要で、締め切りは決して動きません。これはデータフローの問題であり、データフローはレジスタと乗算器の配列が得意とするものです。このハブは、ピクセルを取り込み、変換し、再び出力する必要のあるエンジニアのためのページです。あるデバイスが追いつけるかどうかを判断するための計算も扱います。
作業は3つの層に分かれます。インターフェース(MIPI CSI-2とDSI、HDMI、DisplayPort、SDI)はピクセルをチップに出し入れします。ストリーミングパイプラインは、通常AXI4-StreamまたはAlteraの同等規格の上に構築され、ピクセルを1ラインずつ変換します。メモリ層は、ビデオDMAエンジンを経由してDDRに接続され、ランダムアクセスが必要な処理や入出力レートが異なる場合にフレーム全体を保持します。
重要な考え方
インターフェースはほぼSerDesの問題
MIPI CSI-2(カメラ入力)とDSI(ディスプレイ出力)は、D-PHYまたはC-PHYのレーン上で動作し、一般的な版ではD-PHY 1レーンあたり最大2.5 Gb/sです。古いFPGAには外付けのブリッジチップが必要です。Lattice CrossLink-NX、Efinix Titanium、AMD UltraScale+およびVersalといった新しいファミリーは、ハードまたはそれに近いD-PHYブロックを備えています。HDMI 1.4までは最大340 MHzのピクセルクロックでTMDSを使い、多くのFPGAのI/Oバンクが10:1シリアライザで直接駆動できます。HDMI 2.0以降、DisplayPort、12G-SDIには本物のギガビットトランシーバーが必要なので、ここに加えて/topics/high-speed-io/でも扱います。物理層が何であれ、最初に作るのは内部ストリーミング形式への変換器です。そうすれば下流のすべてがインターフェースに依存しなくなります。
可能な限りフレームバッファではなくラインバッファを
ほとんどのISP段(デモザイク、ノイズ除去、シャープ化、スケーリング、レンズ補正)は、隣接する数ラインだけを必要とします。幅1,920ピクセルの画像に対する3x3カーネルには2ライン分の履歴が必要で、24ビット/ピクセルなら92,160ビット、36 KbのブロックRAM 3個未満です。その段は1クロックあたり1ピクセルで動作し、レイテンシは数ライン分で固定です。4Kのライン(3,840ピクセル)ではその2倍、8ビットのrawベイヤーでは半分になります。フレーム全体を必要とする処理(回転、時間フィルタリング、フレームレート変換、ほとんどの圧縮)だけが、外部メモリへの往復に見合います。パイプラインをストリーミングのままに保つことは、映像設計における最大の決定事項です。ブロックRAMの使用量、レイテンシ、DDR帯域幅を同時に決めてしまうからです。
帯域幅の計算
部品を選ぶ前に数字を書き出してください。ピクセルレートは幅×高さ×フレームレートにブランキング(通常10%から25%)を加えたものです。1080p60は1,920 x 1,080 x 60 = 124 Mpixel/sがアクティブ分で、ブランキングを含めると148.5 MHzです。24ビットなら1ストリームあたり3.0 Gb/sになります。4K60はその4倍、ピクセルクロック594 MHzで、ロジックが594 MHzではタイミング収束しないため、ファブリック内では1クロックあたり2または4ピクセルの処理を強いられます。フレームバッファを1回通すたびに、そのレートが2回(書き込みと読み出し)かかります。32ビットのDDR4-2400チャネル1本はピーク76.8 Gb/sを提供しますが、混在トラフィックでは実際にはその60%から70%程度でしょう。したがって、バッファを通る4K60ストリーム2本にプロセッサを加えると、すでに余裕がありません。
圧縮は通常、書くのではなく買う
JPEGエンコーダは小さく、オープンな設計も豊富にあります。H.264、H.265、AV1は別物です。規格に準拠したエンコーダは数万行のRTLと何年もの調整を要します。AMDは一部のZynq UltraScale+ MPSoC EV品種とVersal AI EdgeにハードVCU(4K60までのH.264/H.265)を搭載しており、Altera、Lattice、サードパーティはソフトエンコーダIPを販売しています。ソフトH.265 IPは4Kで数十万LUTを必要とするのが普通です。製品に標準コーデックが必要なら、まずコーデック対応でデバイスを選び、LUT数は二の次にしてください。
どこから始めるか
映像パイプラインの大部分は、小さな演算を囲むカウンタ、FIFO、ブロックRAMなので、入門トラックが適切な基礎を扱っています。パイプラインレジスタのモデルについては/learn/beginner/04-registers-clocks-and-state/を、映像タイミング生成器はカウンタ2つにすぎないので/learn/beginner/08-counters-timers-and-debouncing/を、ラインバッファについては/learn/beginner/09-memories-block-ram-and-fifos/を読んでください。最初のプロジェクトとしてはVGAまたはHDMIのテストパターン生成器が適しています。タイミング生成器、パターン、シリアライザだけで、メモリはまったく不要です。ストリーミングプロトコルとVDMAに関する中級トラックは準備中です。
ツールとベンダー
| ベンダー | 映像分野の強み | 代表的な部品とIP |
|---|---|---|
| AMD | 最大のIPカタログ、ハードVCU、UG934のAXI4-Stream映像規約 | Zynq UltraScale+ EV、Versal AI Edge、Kria KV260、Video Processing Subsystem、VDMAおよびFrame Buffer IP |
| Altera | Video and Vision Processing(VVP)スイート、Avalon-ST映像 | Agilex 5、Arria 10、Cyclone V |
| Lattice | 小型・低電力部品でのハードMIPI D-PHY、センサーブリッジ | CrossLink-NX、CrossLinkU-NX、Certus-NX、mVisionスタック |
| Efinix | TrionとTitaniumのハードMIPIブロック | MIPI付きTrion T20/T120、Titanium Ti60/Ti180 |
| Microchip | 低電力イメージング、SmartHLS映像フロー | PolarFire Video Kit、PolarFire SoC |
| Gowin | HDMIとMIPIを備えた安価なボード | GW1NR-9(Tang Nano 9K)、GW5A |
オープンソースの世界には、TMDS帯域で使えるHDMI TXコア、Litexの映像コンポーネント、SpinalHDLやAmaranthの映像サンプルがあります。製品に載せられるオープンソースのH.264エンコーダはありません。
よくある間違い
- 上記のピクセルレートとDDRの計算をする前にデバイスを選び、後になって4Kでは至るところで1クロック複数ピクセル処理が必要だと気づく。
- tuser(フレーム先頭)とtlast(ライン末尾)を省略可能と見なす。下流のIPはこれらからフレームの位置合わせを復元するので、tuserが欠けるとVDMAは画像を1ラインずらしてしまいます。
- より高いファブリッククロックで2倍または4倍狭いバスを使えばリソースが半分になるのに、パイプライン全体をピクセルクロックで動かす。
- 帯域幅の見積もりでブランキングを忘れ、DDRの見積もりでリフレッシュとページミスを忘れる。
- フレームを1枚しかバッファしない。入出力が非同期の場合、ティアリングのない出力には3枚(書き込み、読み出し、予備)が最低限です。
- センサー側を無視する。カメラプロジェクトの時間の大半は、FPGAパイプラインではなくセンサーのI2C設定に費やされます。
さらに深く
- AMD UG934, AXI4-Stream Video IP and System Design Guide。映像ストリームにおけるtuserとtlastの使い方の事実上の定義です。
- AMD PG020, AXI Video Direct Memory Access。フレームバッファモードとgenlockモードの説明があります。
- MIPI Alliance CSI-2仕様ページ。レーン、仮想チャネル、データ型の公開概要があります。
- ディスプレイ規格についてはHDMI ForumとVESA(全文の閲覧には会員登録が必要)。
- Lattice CrossLink-NX製品ページ。ハードMIPIを中心に設計されたデバイスの好例です。