« JTAGロジックアナライザの大幅な機能強化 | トップページ | MITOUJTAGがVirtex4に対応! »

2006.09.20

USB2.0の転送速度に関する一考察

8月ごろ、EZ-USB FX2LPのSlaveFIFOとXILINX FPGAを、デバイス限界の最高速度でインタフェースするためのコア(FPGAの回路設計)を作りました。そのときのコアを使ってUSB2.0HighSpeed対応の高速カメラを作ったところ、USBの速度について面白い現象に遭遇しました。

まず、EZ-USB FX2LPは、IN方向(USB→PC方向)の転送では最高でおよそ328Mbps(毎秒40MBytes)の速度が出せます。そこでFPGAとEZ-USB FX2の間を最高速度でデータをやりとりするためのFPGA用のコアを作りました。
このコアは、どんな回路でも簡単にインタフェースできるようにと思って作った汎用性が高いものです。先日、このコアを利用して高速なUSBカメラを作ったのですが、撮った画像が明るいと、若干、速度が落ちるのです。

調べていると、どうやらカメラが明るい映像を撮った場合、各ピクセルのデータが0xFFに飽和してしまいます。すると、転送速度が遅くなるように思われました。

詳しく説明すると、USBはNRZIという通信方式を採用しています。
NRZIとは、データ’0’を送る場合には信号の値を反転させ、データ’1’を送る場合には信号の値を反転させない、というものです。例えば、次の図のような感じになります。
Nrzi

NRZIの通信方式では、上の図のように適度に0と1が混ざったデータを送るならばいいのですが、’1’が連続すると同じ値を送信しつづけてしまいます。
もし、0xFFFFFFFFなんていうデータをNRZIで送ると、32ビット分の長さの間同じ値を送りつづけることになります。USBのような高速シリアル通信では、データの変化するタイミングでクロックを抽出しているので、あまり長い間信号が変化しないと、通信ができなくなってしまいます。

USBでは、適度に信号の値が変化してくれることが必要です。そこで、USBでは’1’が6個連続すると強制的に’0’を挿入するようになっています。これがビット・スタッフィングというものです。

例えば、111001100111111100というデータを送りたい場合、

前 111001100111111100
後 111001100111111100
という具合に、強制的に0が挿入されます。
この’0’は、受信回路で自動的に除去されるのですが、余分なビットが送られるので正味の転送レートは下がります。

ということで、USBで"FFFFFFFFFF・・・"というようなデータを送信した場合、おそらくビットスタッフィングが効いて来てしまって速度が16%ほど低下するのではないかと考えました。
実際に、画面が白く飽和したような画像を映すと、転送速度が落ちます。

波形で見てみましょう。
USB2.0の480Mbpsの波形は、私の手持ちのオシロでは見えないので、EZ-USB FX2の制御信号を見ることにします。

次の図は「FPGAからEZ-USB FX2LPのSlaveFIFOにデータを送信していることを示す信号」をオシロでキャプチャしたものです。この波形が’0’の時、FIFOに向かって書き込んでいます。

0xFF(つまり明るくて飽和してしまった白)が多く含まれるデータを送信した場合は、このように、125μ秒のマイクロフレームの間に、信号が9回立ち下がっています。つまり、512バイト×9/125マイクロ秒=36.9Mバイト/秒程度の速度しか出ていません。
0xFFを多く送った場合

一方、通常の画像、つまり0xFFなどが含まれていない普通に見られる画像を送った場合は、
0xFFが多くない場合
このように、125μ秒の間に信号が10回立ち下がっていて、512×10/125マイクロ秒=40Mバイト/秒の速さでデータを送れていることがわかります。

このように実験してみましたが、つまり、USBに向かって'1'が6個連続するようなデータを送ると、転送速度が下がるのではないかという予想ができます。したがって、USBとの間でデータをやりとりする場合には、0xFFや0x7F、0x3F、0xFCなんていうデータは送らないほうがよさそうです。

もしどうしても0xFFをいっぱい送らなければならないような場合には、データにスクランブルをかけて'1'が連続しないようにしてやるとか・・そこまでするかというような感じですが。

ここで書いた結果は、ちょっとした思いつきで実験したことなので、全く間違っている可能性もあります。ですからあまり鵜呑みにせずに参考程度にとどめて置いてください。
また今度、詳しい追実験をやってみることにします。

→ つづきはこちらに書きました★

|

« JTAGロジックアナライザの大幅な機能強化 | トップページ | MITOUJTAGがVirtex4に対応! »

コメント

コメントを書く



(ウェブ上には掲載しません)




« JTAGロジックアナライザの大幅な機能強化 | トップページ | MITOUJTAGがVirtex4に対応! »