2013年6月15日土曜日

LatticeECP3用DDR3 SDRAMCの作成 6

Timing Analysis ViewでI/O部の遅延時間を確認した。

CLKのODDR→PAD迄の遅延時間

DQ入力のPAD→IDDR迄の遅延時間

DQSの入力遅延時間も必要なのだが、DQSはDQSBUFD内部ではクロックとして扱われているらしく遅延時間が表示されない。そのため、DQSのPAD→DQSBUFD迄の入力遅延もDQと同じと仮定することにした。

遅延時間のモデルは下図の様なイメージで考えている。シミュレーションで使用しているMicronのDDR3 SDRAMモデルはデバイスの遅延時間も含んで動作しているので、FPGA内部の遅延時間と基板パターンの伝搬時間を追加すれば実際に近いタイミングを作れる筈だ。

0.283は基板パターンの伝搬時間の推定値だ。VersaボードのFPGA - DDR3 SDRAM間は以下の写真のような位置関係になっている。パターンの引き回しは内層で行っている様だ。両者の距離が約3cmだが、パターンは等長配線のためにクネクネ(ミアンダパターンとか言ったっけ?)している筈なので4cmと見積もった。パターンは内層を通っているのでマイクロストリップラインではなくストリップラインの伝搬時間の式 td[ns] = 3.33 x パターン長[m] x sqrt (FR-4基板の誘電率)で計算した。

これらの時間を以下のようにRTLに追記した。以下はDQSの箇所を示しているが、DQ、CLK、ADDR、等全ての信号についてそれぞれの値を追記している。

上記から往復の遅延時間の合計は約4.6nsにもなる。したがって、現状のREADストローブ信号のタイミングでは動作しそうにない。実際シミュレーションしてみると以下のようになった。

そこで、READストローブのアサートタイミングを遅らせるように修正した。

リードはこれでいい感じになった。が、遅延時間を加味したシミュレーションでライトにもtDQSSのタイミングエラーが出てしまった。

ライトの場合DQSとクロックの位相は理想的には同じ、ズレたとしても±0.25tCK以内と規程されている。つまり400MHzで動かす場合はDQSとクロックとのズレは±0.625ns以内でなければならないが、シミュレーションの波形で確認すると約0.7nsとなっていた。

DQS出力の位相はDQSBUFDのDYNDELAY入力の値で調整することが可能で、ハンドブックでは delay = DYNDELAY x 26ps とある。  (ただし、DQSBUFDのシミュレーションモデル内部の記述では delay = DYNDELAY x 27ps + 140ps となっている。  ) そこで、この機能を利用して0.7ns分DQとDQSの位相を遅らせてみたが以下のように異常動作になった。

おそらく遅延量が大き過ぎるんだろう。そこで、DRAMに供給するクロックの位相もズラすことにした。 400MHzは100MHzの源振からPLLで逓倍して生成している。ECP3のPLLのCLKOS出力は逓倍+位相シフトしたクロックを生成できる。ただしシフト量は離散的で粗い。また、あまりシフト量を大きくしすぎると今度はアドレスやRAS, CAS等の信号のタイミングマージンに影響がでてくる可能性がある。  今回はFPGA内部の400MHzとDRAMに出力する400MHzとで-45°の位相差を持つようにした。  つまり、このクロック位相でDQSの位相を粗く設定し、DQSBUFDのDYNDELAYで微調整するという方針で行くことにし、以下のように調整できた。DYNDELAYでの遅延量は約500psになった。

合成も成功してビットストリームの生成の成功したので次は実機での確認だ。


さーて、動くか???


0 件のコメント:

コメントを投稿

ERROR: Failed to spawn fakeroot worker to run ...

なにかと忙しくてなかなか趣味の時間を確保できない。 ...orz  家の開発機のOSはLinux Mintなのだが、最近バージョンを22に更新したところ、myCNC用のpetalinuxをビルドできなくなってしまった。ビルドの途中で ERROR: Failed to spawn ...