2015年4月24日金曜日

EZ-USB FX2LP を動かしてみる (25) IN転送レート実測16MB/Sec

EZ-USB FX2LPに、外部からデータをトロ~りと流し込んでやり、そのデータをLinuxマシンがしゃかりきに読んだとき、どれだけの転送レートが出るか???

これを実験で知るために、EZ-USBのFIFOをスレーブモードで使い、スレーブFIFOに最大48MHzでデータを流し込めるFPGAを作成し、libusbで作ったアプリをLinuxマシンで動かし、IN転送レートを実測しました. INとはPC←USB←FPGAの方向のデータ流のことです.

結論は、ちょっとした最適化が必要だったが、16MBYTE/Secが出た.
16Mbit/Secぢゃないよ (^_^;

測定環境の諸元を記しますと、、、

【USB chip】
・EZ-USB FX2LP 56pin
・USB2.0モード
・EP6 IN BULK転送
・FIFO  512BYTEx4 または 1024BYTEx2 のいずれか
・FIFO-FPGAバスは8bit/48MHz

【Linuxマシン】    かなり非力なマシン
・EPSON NP11
・CPU atom230 (1.6GHz) (L2=512KB)
・メモリ1GB
・Kona Linux 3.0

【FPGA】
・EZ-USB FIFOへ最大48MB/Secでインクリメンタルデータ(32bit)をwriteする
・ただし、EZ-USBがFIFO-fullを表明したら、writeせずに待つ
・FIFO-FPGAバスは8bit/48MHz

【Linuxマシンのホストアプリ】
・libusb0.1  (libusb1.0ではない)
・EZ-USB EP6へ、IN要求を打ち、IN関数が受信したバイト数を積算する.
・所望のMB数を受信し終えたらexitし、所要時間を表示する.
・受信する作業のみ.
・HDDへのwriteはしない.CRCチェック等もしない. (ホスト処理能力要因を排除するため)

インクリメントデータをダンプして見て、それっぽいデータが採取できたので、USB伝送はマトモと考えて転送レート測定へ進みます.CRCチェックは後日やります.

-------------
今回は、転送レートの結果のみ掲載します.(回路図やソースコードは次回に廻します)

転送レートを測定するパラメータとして、FIFOサイズ(512か1024)と、IN要求数を考えてみました.

1) 512BYTE/FIFO  512BYTE/IN
この設定は、よく使われるバルク転送の設定かと思います.EZ-USBのFIFOが512BYTEなので、ホストのIN要求も512BYTEにしておくのがお行儀が良い感じだよねっていう心です.
がっ、いろんなオーバーヘッドが介在するためか、4MB/Secぐらいしか出ませんでした.これじゃダメだ!!!みたいなショボイ成果です.
2) 1024BYTE/FIFO  1024BYTE/IN
FIFOが512BYTEじゃショボイのかな? と思って、FIFOを1024BYTEにしてみました.1024BYTEはEZ-USBの最大値です.
このトライで、サクッと8MB/Secに改善しました.コマンドオーバーヘッドは相当大きいのでしょう.USB2.0のチャネルレート=480Mbit/Sec=60MB/Secが理論上限ですから、まだまだ行けるんじゃないかと思うわたくし.
3) 1024BYTE/FIFO  2048BYTE/IN
EZ-USBのFIFOは1024が最大なのであきらめるとして、ホストが発するIN要求を2048BYTEにしてみました.(libusbによると4096が最大らしいが英語なので不詳)
これだと、IN要求一発でFIFO2本を一気に空っぽにするだけのバースト転送が生じているはずです.この使い方ですと、FIFOが一時的に空っぽになってFIFOにデータが積まれるまでボケーっと待つ状況が出現してしまうかもと予想します.だとすると、FPGA→FIFOへのレートも総合的転送レートの制限要因として浮上してくると思われる.現状、FPGA→FIFOは8bit/48MHz(48MB/Sec)にしてあるが、16bitに拡張できるので、その場合はFPGA→FIFOが96MB/Secになって上へ逃げられる公算が高まると推測する.
ともあれ、この設定で16MB/Secを得た.これなら満足.
4) 1024BYTE/FIFO  3072BYTE/IN
ホストが発するIN要求を2048BYTEにして改善したので、それじゃぁもっと大きくしようぜってことで3072BYTEにしてみました.
意外なコトに、12MB/Secに劣化してしまいました.
3072BYTEのIN要求だと、FIFO2本で2048BYTEとの相性が悪そうに思うので、FIFO-fullフラグが頻繁に立ち、FPGA→FIFOへの転送レートが制限要因になっているんじゃないかと推測するが、あくまでも推測.この仮説は16bitバスにすりゃ検証できる.
5) 1024BYTE/FIFO  4096BYTE/IN
ホストが発するIN要求を4096BYTEにしたところ、2048BYTEの時と同じく16MB/Secでサチッてる.
追記:
5-2) 1024BYTE/FIFO  4096BYTE/IN   fwrite()でファイルに書き込みした場合
ファイルに書いたらどれだけ遅くなるか? 13MB/Secなので2割ダウンってとこかと.使ったマシンがとても非力なマシンなので、非力なマシンでもこの程度のダメージという参考になるだろう.

【考察】
昔、テープストリーマでUSB2.0で10MB/Secを出していた.それなりに苦労して10MB/Secだったので、ここでサクッと16MB/Secが出たのは、まぁラッキーと言えると思う.

さらに転送レートを上げる余地があるのかどうか?

転送レートの上昇余地については必ずしも定かではないが、さしあたり3点の検討課題を挙げることができると思う.

1) FPGA→FIFOを16bit/48MHzバスにする

2) ホストをもっと高速のマシンに変更する

3) USBプロトコルアナライザを持っていたら、オーバーヘッドがホストにあるのかEZ-USBにあるのかの当たりをつけられるかもだけど、持ってないので実施は無理っぽい.

なんつって、とりあえず16MB出たのでやる気はないんだけどね.

次回は回路とソースを解説します.

その24へ    その26へ

かしこ

INDEXページへ
https://hirasakausb.blogspot.com/2019/03/ez-usb-fx2lp-index.html

0 件のコメント:

コメントを投稿