EZ-USB FX2とSpartan3を接続
EZ-USB FX2とSpartan3をつないで実験しています。
前回の実験では、EZ-USB FX2とCoolRunnerIIを接続して、SlaveFIFOの8ビットモードを使って、どこまで速度が出るかなどを測りました。
今回は、FPGAを使って16ビットモードにして、同様の実験をすることにします。
上手い具合にEZ-USB FX2のレジスタを設定してやると、300Mbpsくらいの速度で転送ができました。でも、どうやら8ビットモードと16ビットモードで、フラグの立つタイミングが微妙に異なるような気配です。
次の図は、131072バイトをバルクIN転送した際の、WR信号とフラグの波形です。
黒くなっている部分が転送が行われているタイミングです。
この波形を見ると全部で3回に分けて転送が行われているのがわかります。
1回目の細い転送は512バイトです。EZ-USBのデバイスドライバでは、64kバイトの受信をするように指定しても、必ず最初に受信するデータは512バイトになるようです。
その後、数ミリ秒のアイドル期間を置いて、約1.6ミリ秒の間、転送が行われています。それから240μ秒のアイドル期間をおいて、再び1.6ミリ秒の転送が行われています。
これは、EZ-USBのデバイスドライバが64kバイト以上のデータを扱えないので、131072バイトの転送を2回に分けて行ったためです。よって、1回の転送の塊で約64kバイトを送っています。
1.6ミリ秒で64kバイトを転送するので、瞬間最大速度は327Mbpsとなります。
つまり、EZ-USB FX2のSlaveFIFOは、8ビットモードでアクセスしても、16ビットモードでアクセスしても、最大速度は変わらないようです。
次の図は、上の波形を拡大したものです。
125μ秒の間に、10回の転送(波形がLになっている部分)が行われているのが分かります。1回の転送時間は約5.36μ秒ですから、5.36μ秒×16ビット×48MHz=512バイトで、USB2.0のHighSpeedモードのパケット1個分のデータ量に相当するのがわかります。
つまり、
16bit*48MHz=768Mbps → USBのバスの制約により328Mbpsに制限される
8bit*48MHz=384Mbps → USBのバスの制約により328Mbpsに制限される
ということのようです。
このことは、必ずしもEZ-USBとFPGA間の接続を16ビットにしなくても、バルクIN転送に関しては、限界の速度が出せるということを意味します。
システム全体としてのスループットを考慮するなら、ちょっと考えなければなりません。16ビットモードでは1パケット分のデータを送る時間は5μ秒なのに対して、8ビットモードでは11μ秒かかります。FPGAの後ろにSDRAMなどを置いた場合、FIFOを作らなければ、長い間SDRAMのバスを占有することになりますから、システム全体のスループットは下がるかもしれません。
EZ-USB FX2とFPGAをつないで、満足のいく性能を出すのは、かなり大変です。(決してEasyじゃありません)
今回の実験を行う際に活躍したのは、MITOUJTAGの開発中の新しいロジアナ機能です。
ブロックRAMにFPGAの内部の波形を溜め込んで、あとからJTAGで読み出すしくみなので、48MHzで動くEZ-USB FX2との制御信号もばっちり1クロックづつ見ることが出来ました。
もうJTAGロジアナの速度が気になることはありません。MITOUJTAGの開発は、このように自分で実際に実務に使いながら、デバッグを行っています。
最近のコメント