画像処理に関するプロジェクトを行いたいです。このプロジェクトを FPGA に実装するかどうかを知りたいのですが、第 1 段階で Matlab または OPEN CV のどちらのツールを選択すればよいですか? コードジェネレーターをMatlabからFPGAに直接使用できるように、コードをOpen CVからFPGAに直接変換することは可能ですか??
3 に答える
まず、なぜ FPGA を使用したいのですか? 正当な理由がない限り、それを避けてください!
正当な理由としては、次のようなものがあります。
- 料金
- パワー
- サイズ
- 再利用する必要がある既存のハードウェア
- 個人的な興味
- それはFPGAが義務付けられている課題です
悪い理由には、「画像処理...それはFPGAが必要だということです!」が含まれます。
FPGA を考える
FPGAに実装したい場合は、最初から「FPGA」を考える必要があります。これらは、従来のプロセッサと比較して非常に特殊な特性を持っています。つまり、多くの「従来の」アルゴリズムを FPGA に効率的に実装することは非常に困難です。また、従来の処理では苦労する他のアルゴリズムも、実際には FPGA で非常に簡単に実行できます。
古典的な (画像以外の) 例の 1 つは CRC 計算です。これは多くの場合、ソフトウェアでルックアップ テーブルを使用して実装されますが、FPGA では簡単なシフト レジスタと XOR ゲートにすることができます。
コードジェネレーターについて....
ザイリンクスが購入した製品 (AccelDSP) がありました。これは (非常に慎重に作成された) Matlab コードを取得して VHDL を生成できます。あまりうまくいかず、撤回されました。
Matlab にはHDL-coderがあり、これは同じ仕事をすることを目的としており、Simulink ダイアグラムも実行します。私はかなり前にそれを評価しました - 私は今それがどれほど良いかわかりません (とはいえ、それは目を見張るほど高価でした!)。Web ページ ti を見ると、Matlab 関数 (ユーザー定義オブジェクトではない) のみをサポートしているように見えます。これは、すべての状態を関数の外部に格納する必要があるため、その中に状態を格納するもの (IMHO) の非スターターになります。struct
AccelDSP が抱えていたのと同じ問題。
Xilinx System Generator と Altera の System Builder はどちらも、FPGA コードを生成するためのフロントエンドとして Simulink を使用しています。それらは非常に成功する可能性があります。任意の複雑な Simulink ブロックを破棄して、合成可能な FPGA を生成することはできないことに注意してください。
繰り返しになりますが、FPGA を最初から考えなければなりません。
FPGA の機能
比較語が使用されている場合は常に、「従来のデスクトップ プロセッサ」と比較しています。
- FPGA はメモリ不足ですが、小さなブロックがたくさんあります。これは、実行する小さなジョブが十分にある場合、総内部帯域幅が膨大になる可能性があることを意味します。メモリは、プロセッサの L1 キャッシュと同様に、非常に低いレイテンシ (1 クロック サイクル) です。
- 選択 (
if..else
機能など) は、FPGA 領域に関して非常に高価になる可能性があります。 - 乗算は限られたリソースであるため、プロセッサに MUL 命令がなかった「昔」のアルゴリズムを使用すると、費用が発生する場合があります。
- ビット幅は任意に設定できます。18 ビットの計算結果を表すために 32 ビット要素を使用する必要はありません。ほとんどの場合、ツールがこれを解決してくれます。
開発サイクルも異なります。
- シミュレーションは、比較的迅速にコンパイルして実行できます。これをたくさん行うようにしてください
- 実際、合成と配置配線 (FPGA チップ自体にプログラムできる「ビットストリーム」を生成する操作) は、非常に長時間実行される可能性があります。私の現在のコンパイル (比較的小さい) には、わずか 30 分しかかかりませんでした。こんなことはできるだけ避けたい!
ザイリンクスにはVivado HLSというツールがあります。
このツールを使用して Zynq プラットフォームで OpenCV をターゲットにする方法について説明し たアプリケーション ノート ( XAPP1167 ) もあります。
これについては経験がありませんが、最近の OpenCV ミーティングで知りました。これがアプリノートのオープニングです-
このアプリケーション ノートでは、OpenCV ライブラリを使用して Zynq デバイスでコンピューター ビジョン アプリケーションを開発する方法について説明します。OpenCV は、アルゴリズムのプロトタイピングからインシステム実行まで、設計プロセスのさまざまなポイントで使用できます。Vivado HLS で提供されるビデオ ライブラリを使用して、OpenCV コードを合成可能な C++ コードに移行することもできます。合成されたブロックを Zynq デザインに統合すると、高解像度および高フレーム レートのコンピューター ビジョン アルゴリズムを実装できます。
アルテラは、ANSI C を並列化するための広範な仕様であるOpenCL をサポートしています。OpenCL で使用できるOpenCV モジュールがあります。繰り返しますが、私はこれを経験していません(まだ;))。
このリンクは、FPGA 開発ボードなどのホストおよびハードウェア アクセラレータのコンテキストでの OpenCL の使用を理解するのに役立ちます。
そのため、アルテラのルートに進みたい場合は、上記の OpenCV モジュールを使用して OpenCL で OpenCV 関数をラップし、アルテラの SDK を使用して fpga をターゲットにする必要があります。この方法の利点は、FPGA がアプリケーションにあまり適していないことがわかった場合、OpenCL+OpenCV を他のプラットフォームに向けることができることです。
Matlab は HDL をサポートしています。matlab コードを HDL コードに直接変換できるパッケージを提供します。FPGAのプログラミングにも使用できます。
一方、Opencv を HDL 言語に変換するのは、ライブラリが原因で簡単ではありません。C++ などの Obect Oriented Programming (OOPs) 言語を Verilog / VHDL に簡単に変換できますが、「OpenCV ライブラリ」のため、いくつかの問題が発生します。