FX3の高速化検証1 ~FX3の最高峰に挑む~【2011/11/01】
ネットビジョンでは、2011年11月からEZ-USB FX3(以降、「FX3」といいます。)を使用したイメージキャプチャーボードSVI-06の製造・販売をしております。
その後、UVC版であるSVI-05の開発により、FX3を高速に駆動させるノウハウが着実に蓄積されてきました。
一方FX3チップはリープモーションに採用されるなど、国内、国外問わず活用が進んできているUSB3.0用のチップになります。
しかし、高性能なチップではあると思いますが、最高に近いスペックを引き出すためのノウハウが共有されていないため、国内での爆発的な普及には至っていないのではと考えています。

そこで、弊社にて行ったハードウェアからPCアプリケーションまでの高速化の道のりについて紹介してみたいと思います。

【検証システム全体像】
はじめに今回検証をおこなったシステムの全体像を説明します。

ハードウェアとしてCypress社(以下、「サイプレス」といいます。)から発売されているEZ-USB FX3を搭載した弊社開発ボードSVI-06をベースとして高速化のための改造を行ったもの(以下「SVI-06改ボード」といいます。)を使用しています(上段のボード)。


SVI-06改ボードにはFPGA(Spartan6)が搭載されておりピンヘッダからの信号やPCからの制御に対する処理などを行います。
SVI-06改ボードとイメージセンサなどのデバイスとの接続はピンヘッダにより行います。
なお、この検証システムでは、SVI-06改ボードのピンヘッダへのデータ信号を供給するには下段にあるエミュレーションボードから行っています。
このエミュレーションボードは弊社製品であるSVO-02を用いており、データ信号はイメージセンサーと同様にエミュレーションを行っています。
SVI-06改ボードへは16GBのインクリメントデータを供給しています。
SVI-06改ボードは、USB3.0ペリフェラル・コントローラとしてFX3を使用することで、PCと接続されています。
PC側には、USBからの情報を取得するためのカスタムドライバーおよびアプリケーションが動作しています。
PCのOSはwindows8 64bit版となっています。


ブロック図にすると左図になります。※xHC:ホストコントローラ


【FPGAについて】
今回検証に用いたSVI-06改ボードのFPGAの機能としては大きく分けて3つあります。
1.フレーム化(FullHDサイズにフレーム分けを行う)
2.情報ヘッダの付加
3.ボード全体のフロー制御

フレーム化とは、ピンヘッダからFPGAに入ってくるデータを解析し、FullHDサイズのフレームに分割してDDR2 SDRAMに保存を行います。
具体的には、下段のエミュレーションボード(SVO-02)からイメージセンサ出力と同等のデータを送出しているため、FPGA内部において、ブランキングエリアの信号を解析して画像サイズを自動判別し、画像エリアのデータのみをフレーム単位に分割してDDR2 SDRAMに保存を行っています。

分割した各フレームには、フレームのサイズなどのフレーム情報等をホストへ通知するためのヘッダを付加します。なお、DDR2はダブルバッファとして使用しており、その制御もFPGAが行っています。
また、高速にかつ安定して駆動させるためFPGAがFX3チップを含むSVI-06ボード全体のフロー制御を行っています。このアーキテクチャーの採用により現在弊社で発売しているSVI-06よりもさらに高速に駆動することができます。
なお、今回の検証で高速化処理を支えているのがFPGAであり、弊社独自の技術によるものです。この内容については公開したいところではあるのですが、独自技術でありブログで詳細を説明することはできないみたいです。すいません。

自社のFPGAに活用したいなどの話があれば個別にお問い合わせください。

【FX3について】
FX3のファームウェアはEZ-USB FX3 SDKに同梱されている「slfifosync」を修正して使用しています。
(格納先:EZ-USB FX3 SDK\1.2\firmware\slavefifo_examples\slfifosync)
ただし、修正といってもエンドポイントの設定やDMAのバッファサイズ等コンフィグレーションの変数を変更しているだけになります。
ほぼSDKサンプルそのままと考えてもよいと思います。

【PC環境について】
Windows PC側については、OSはWindows8 64bitを使用しドライバーおよびAPIは下記の組み合わせにより実験を行いました。
1.ユーザーモードドライバ + SVI-06用API
2.カーネルモードドライバ + SVI-06用API
3.サイプレスドライバ(カーネルモード) + サイプレス提供API

今回の検証で使用した、1,2のドライバーについてはマイクロソフトから提供されているリファレンスをそのまま利用したものと考えてください。
PC側の送受信アプリケーションはUSB3.0のデータを取得するためだけの機能を持ったコンソールアプリケーションを用いました。
FX3との転送レート計測の検証のため、送受信コスト以外にはほぼコストがかからないアプリケーションとなっています。
左図が今回の検証環境の全体概要になります。

【各部での転送レート計測結果】
最高速が出るようにチューニングを行った結果、各部分での転送レートは左図のようになりました。
USBのバルクイン転送にて、ボードからPCへ16GBのデータを転送し、送信開始から受信終了までの時間から転送レートを求めています。結果として、FX3~PC上のコンソールアプリまでの転送レートは平均340MB/sになりました。
なお、今回の検証では詳細をふれませんが、FPGA~FX3のGPIFⅡインターフェイスへは平均380MB/sにてデータ転送を行っています。

【検証PCスペック】
今回、転送レート検証に使用しているPCのスペックは下記となります。

PC:NEC LaVie Z LZ750/LS
OS:Windows8 64bit
チップセット:モバイル インテル UM77 Express
CPU:Core i7-3537U@2.00GHz メモリー:4.00GB
ドライブ(SSD):TOSHIBA THNSNF256GMCS

長かったですが、システム全体像から検証結果までを説明しました。
次回以降部分に絞ってチューニングで行ったことなどを説明していきます。

» 記事一覧へ戻る