Spartan-6のIO遅延のすべて
Spartan-6にはすべてのI/Oに遅延回路が含まれています。
それは、IODELAY2といって、0~255までの範囲で遅延量を変えられるというプリミティブです。
ただし、ユーザガイドにはその遅延量の値の1つが何psなのか、全く書いていません。
確かにシミュレーション用に75psという値は用意されていて、CoreGenでもその値が表示されます。
しかし、75psというのは、これまでの経験上、信用できません。
そこで実験してみることにしました。やり方は・・・
① 次のようなパルスをあるI/Oから出す。
_
| |____
② それと同じものを別のI/Oから出す。このI/Oは双方向にしておいて、出力値を入力したものを入力遅延に通す。
③ 入力遅延の量を0~255まで変化させる。
④ 入力遅延の出力値を別の出力ポートから出す。
出力遅延を可変にすればもっと簡単では、と思われるかもしれませんが、それはできません。なぜなら、IODELAY2の可変遅延モードは入力モードでしか使えまないからです。だから、いったん出力してそれを入力遅延に通して出力するという面倒なことをしています。
結果は、255タップで約8ns。つまり、1タップが30~32psでした。
その変化の仕方はリニアにみえました。
その様子をムービーに収めたので、ご覧ください。
上の波形が遅延素子を通した後の波形で、255タップまでいったらゼロに戻しています。
IODELAY2はなかなか謎が多いプリミティブで、どうやって使えばよいかわからないポートがいくつもあります。
実験の試行錯誤の結果わかった「IODELAY2の使用上の注意点」をまとめておきます。
・入力を遅延させるIDELAYモード、出力を遅延させるODELAYモード、双方向で遅延させるIODELAYモードがある。
・ODELAYモードでは固定遅延モードでしか使えない。
・IDELAYモードでは遅延量を可変できる。
・IDELAYモードではクロックが必要。それは、IOCLKとCLK。とりあえずは両方ともFPGAのロジック用のクロックを入れておけばよさそう。
・外から受けたクロックをIOCLKポートに入れる(つまり、ソースシンクロナスを想定)と、キャリブレーションを実行した際に、クロックの半分の周期に遅延量を自動的に合わせてくれる(らしい)。
・CLKポートは、IDELAYの可変遅延モードで使う(らしい)。
・ODELAYモードで使うなら、クロックは不要。固定遅延。
・遅延量よりも早く入力信号が変化すると、出力がおかしなことになる。
・CAL入力は必須。これが'0'のままだと可変遅延モードが動かない。必ず1回はアサートすること。
・RST入力は必須ではない。
・正確には測っていないが、タップが0でも800psくらいの遅延が入る(らしい)。
・出力遅延として使う場合、ODATAINに入れた信号が、DOUTから遅延されて出てくる。
・入力遅延として使う場合、IDATAINに入れた信号が、DATAOUT、DATAOUT2から遅延されて出てくる。
・DATAOUTは必ずFFやISERDES、IDDR2に入れなければならない。DATAOUT2は任意の組み合わせロジックに入れられる。
今回の実験で使用したサンプルのソースコードは「JTAGひろば」にアップロードしました。どうぞご利用ください。
http://www.tokudenkairo.co.jp/hiroba/?m=pc&a=page_c_topic_detail&target_c_commu_topic_id=47
| 固定リンク
コメント