FT2232Hの出力にバッファを使う場合のMPSSE JTAG
MPSSEをMITOUJTAGから扱うためのプログラムを書いていて、USB-JTAGアダプタにTrenzElectronic社のTE0790を使った場合、ターゲットFPGAによっては不安定になることがありました。
現象としては、
「(TE0790を使う)AND(Digilent JTAGとしてではなくMPSSEとして扱う)AND(Spartan-7がターゲット)AND(クロック速度が最大)AND(MPSSEのコマンド3Bを使用)」
という条件でNGになります。
ようやくこの原因がわかりました。
TE0790は、FT2232Hの後ろにバッファとしてCPLDを置いていますが、このCPLDの遅延が5nsくらいあるので、TCKが出てターゲットデバイスからTDOが戻ってくるまでに、約10nsほどの遅延が生じてしまいます。
TE0790を使う場合だけではなく、FT2232Hの出力をレベル変換したい場合などで同じような問題に当たるはずです。
実際にオシロで見てみました。まず、Spartan-7 FPGAに与えるTCKとSpartan-7から出てきたTDOの関係です。
下の黄色いTCKが下がってから、5nsくらいでTDOが変化しています。
CPLDの前後でTDOを見てみると、CPLDの通過で約5nsずれているのがわかります。
TDOがFT2232Hに到達したときには5ns遅れますが、FPGAのTCKよりもFT2232HのTCKのほうが5ns早く出ているので、トータルで10ns遅れたように見えます。
このため、FT2232HがTCKの立ち上がりでTDOをサンプリングしては間に合わないことになります。
☀
アプリケーションノートAN108では、MPSSEでは、コマンド3Bというのを使ってTDIを出力することになっています。
コマンド3Bを使うと、TCKの立下りでTDIが変化し、TCKの立ち上がりでTDOをサンプリングします。
CPLDなどのバッファを通していると、前述のとおりTCKの立ち上がりでTDOをサンプリングするタイミングが間に合わないので、コマンド3Eを使うとうまくいくようになりましたが、これは正しい解決ではありません。
まず、コマンド3Bで0x55というデータを出力した場合。TCKの立下りでTDIが変化しています。これは正常な動作です。
次はコマンド3Eにした場合。TCKの立ち上がりでTDIが変化するので、これを受け取るターゲットデバイス(FPGA)は、2bit目のセットアップタイムが不足することになるでしょう。(一応、動いてはいますが)
つまり、コマンド3BだとTDI(FPGA)のセットアップタイムは足りるが、TDO(FT2232H)のセットアップタイムが不足する。
コマンド3EだとTDO(FT2232H)のセットアップタイムは足りるが、TDI(FPGA)のセットアップタイムが不足するという事態になります。
☀
そもそもコマンド3Bとか3Eというのはどういう意味かというと、
Bit 0 : '1'ならTDIの出力をTCKの立下りで行う
Bit 1 : '1'ならビットモード、'0'ならバイトモード
Bit 2 : '1'ならTDOのリードをTCKの立下りで行う
Bit 3 : '1'ならLSB firstにする
Bit 4 : TDIから出力する
Bit 5 : TDOから読み出し
Bit 6 : TMSを出力する
Bit 7 : 0
という意味です。つまり3BはTDOは立ち上がり&TDIは立下りというコマンドで、3EはTDOは立ち下がり&TDIは立ち上がりというコマンドなわけです。
それならば、3Fというコマンドにしてみたらどうなるでしょうか?コマンド3FはアプリケーションノートAN108には載っていませんが、なんと、動いてしまいました。TDOは立下りでサンプリングし、TDIも立下りでサンプリングするという理想的なモードでした。
このように裏技的なコマンドを使うことでFT2232H+バッファな構成でもJTAGが使えるようになりました。
これが正しい方法なのかどうかはわかりませんが・・
あと、どうしてDigilentのAdeptはTE0790で正常に動作しているのか。裏コマンド3Fを使っているのかどうか。それも謎です。
まとめると、「FT2232HのMPSSEで、TCKを最高速度の30MHzで動かす場合、TCKとTDOにバッファが入っている場合は「TDIは立ち上がりで変化、TDOは立下りでサンプリング」という標準コマンドだとFT2232HのTDOのセットアップタイムが不足」していまいます。
解決策としては、
- 裏コマンド3Fを使う
- TCK=15MHzで動かす
のどちらかを使うこととなります。
| 固定リンク











コメント