FC2カウンター FPGAの部屋 V2, V2proでのDDR SDRAMコントローラ1
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

V2, V2proでのDDR SDRAMコントローラ1

今度作る基板にはDDR SDRAMが搭載されなくなってしまったが、V2, V2proでのDDR SDRAMコントローラの方式について書こうと思う。
DDR SDRAMの使い方はエルピーダのマニュアルが詳しい。ここにある。
DDR SDRAMはDLLを持っていて供給されたクロックにロックする。よってtDQSCK(DQのクロックからのスキュー時間)はエルピーダのDDR333メモリだと-0.6nsから0.6nsだ。つまりデータの出力時間は入力クロックにほぼ同期している。
データの書き込みの時はDDR SDRAMはFPGAから出したデータ(DQ)をDQSでサンプルしセンスアンプに書き込む。書き込み時にはクロックとデータ(DQ)やDQM、DQSの配線長が一緒だとすると配線での遅延だけ遅れて受け取る。DQやDQMに対してDQSは位相が90度ずれていて、DQやDQMの真ん中でサンプルできるようになっている。DDR SDRAMのセットアップ時間、ホールド時間のマージンやクロックとDQ,DQMの出力時間の誤差、配線遅延の誤差を考慮しなければならない。だがそれらの誤差を押さえ込めれば、133MHzの場合は一様にクロック、データが遅れるので書き込みの時には問題は少ない。当然動作周波数が高くなるとマージンが少なくなって厳しくなってくると思うが。基板屋さんにはマージンを含めて配線遅延について要求をだすだろう。
基板での配線遅延は良くわからないが、例えば1ns配線で遅延するとしよう。DDR SDRAMコントローラから出たクロックは配線で遅延してDDR SDRAMに届くのでDDR SDRAMの動作はFPGA(DDR SDRAMコントローラ)から見ると1ns遅れていることになる。
次にデータ読み出しの場合だが、DDR SDRAMの動作はFPGAから見ると1ns遅れているので、クロックに同期してDDR SDRAMがデータを出力すると、DDR SDRAMコントローラから見ると2ns受け取るデータが遅れていることになる。
133MHz動作とすると周期は7.5ns、DDRなので1データは半分の3.75ns、これでデータの遷移時間を前後0.5nsずつとすると1nsなくなるので2.75nsになる。このデータが2ns遅れているとなると残りは0.75ns。
データ書き込み時のクロックとコマンドやデータの位相を合わせるためにクロックをIOBのDDRレジスタから生成するとさらに基準クロックから5ns程度遅れてしまう。さらにIOBのセットアップ時間も加算される。
これではもうSDR SDRAMのように同じクロックでサンプルすることは無理である。
DDR SDRAMコントローラがデータをリードする場合はDQSがリードクロックとして使用できるが、データと位相が同じである。
以上のことを踏まえると、Xilinxのアプリケーションノートによると以下のリード方法がある。
1.100MHz以下の周波数ではDCMの位相シフトを利用したり、配線による遅延を利用したりして受信クロックをデータがサンプル出来る位置に持ってくる。
2.100~200MHzではDQSをクロックとして使う。DQSはいつもクロックが出ているわけではなく使いづらいし、データと位相が同じなので配線遅延かFPGA内部遅延を使って位相を90度遅らせなければならない。
3.200MHz以上ではV4,S3EのようにIOBの専用遅延回路でデータを遅延させる。

1.では最初100MHz間でしかだめというのを知らなかったので、私はこの方法を取った。私が取った方法はDCMの動的位相シフトを利用して、最初にDDR SDRAMにリードコマンドを連続して送ってDQSを発生させ、だんだんに受信クロックを位相シフトしていってうまく受かる位相シフト量を見つける方法だった。確かに83MHzでの動作は完璧だが、133MHzでは今の所リードできない。やはりDCMのジッタなどで100MHzが限界なのか?
その他、配線を使用してDDR SDRAMへ行く配線の遅延をキャンセルする方法もあるようだ。これはML310というXilinxのV2pro基板のマニュアルに詳しい。ここを見てほしい。
ML310では片道分の配線遅延とIOBのDDRレジスタのクロックからの出力時間をDCMのフィードバックでキャンセルしている。それから配線遅延やIOBのセットアップ時間、Tacを計算して受信クロックのシフト量を計算している。つまり配線遅延もパラメータの内に入っていてここが狂うとデータ読み出せなくなる。

-------------------------------------------
この辺で疲れたので、また続きは次回に。
  1. 2006年01月28日 19:59 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:11

コメント

興味深い内容でした。
「クロックに同期してDDR SDRAMがデータを出力すると、DDR SDRAMコントローラから見ると2ns受け取るデータが遅れていることになる」
これって、思い当たる節があって。。
以前DIMM型のDDRをコントローラーを中心に左右と下側の3方向へ配置するような案件がありまして、配線長が200mm近いものとなってしまってお客さんがスペックが満たされないって嘆いていたのが思い出されました。泣く泣くCLK周波数を半分位に落とすって言ってましたが、私あら見ればなんのことやら・・
時間長でいくと、確か1.8nsくらいに相当しますが、読み出し時には倍の3.6nsの遅延ってことになるんですね。
ってことは、使用する周波数帯域によってCLKの時間長制限が存在するってことかぁ。なるほどですねぇ。

私ら基板設計のCADではものによりますが、層構成や誘電率等電気的なパラメーターを設定しておくと時間長でDRC(DesignRuleCheck)がかかるものもあります。まぁ、あくまで計算によるsimですけどね。なんにも無いよりはましかなぁって思いながら使っておりますけどw
マイクロストリップとストリップでは伝播時間係数が異なるので、このようなsimが後ろで回って時間長を出してくれると設計的には一応裏付けが取れますからね。
  1. 2006/01/29(日) 02:41:00 |
  2. URL |
  3. kanata #-
  4. [ 編集 ]

やっぱりDDRは基本的に全線等長配線でないとだめですね。
今開発しているV2P基盤はリード用のクロックにDDRへの出力クロックのフィードバックを使っているのですが、このクロックが暴れているようで50MHzでもうまく動作しません。
それで、1.の方法で動かしているのですが動作周波数が50MHzで頭打ちです。
  1. 2006/01/29(日) 04:05:30 |
  2. URL |
  3. windy #JalddpaA
  4. [ 編集 ]

皆さん、遅い時間まで起きてらっしゃいますね。私は11時すぎころ寝て6時前ころ起床です。
DDR SDRAMコントローラ思い出しながら書きました。皆さんのお役に少しでも立てたなら良かったです。2回目は自分のDDR SDRAMコントローラでの疑問点も交えながら書こうと思っています。普段は浮いているDQSとリードデータを受け取るタイミングをどうやって知るかです。
  1. 2006/01/29(日) 06:52:01 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

windyさん1つ気になったのですが、50MHzという周波数はどのように入れてますか?
もしDCMのCLKFXから作っているようだとジッタが増えているということもあるのではないでしょうか?
もしそうでしたら、一回動作周波数の水晶発信器に付け替えてやってみてはいかがでしょうか?
  1. 2006/01/29(日) 08:01:43 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

50MHzは外付けのOsc→DCM1→DCM2と経由しています。
DCM1は周波数合成でシステム全体の基準クロックを作ってDCM2でフェーズシフトしています。
DCM1は現状2/2の設定で入力50MHzをそのまま出力しています。
14cm×6.5cmの基板にFF1152のV2Proを2個!!も乗せてる超高密度実装なので等長配線なんて全くされてません。
DDRのパターン長はMaxとMinで倍くらい差があります。
「できる範囲で動かそう」というスタンスなので、きっちり計算して作られてるわけではないのがつらいところです。
50MHzのクロックにしても、「FPGAのDCMで何とでもなるから」という理由でつけられてます。
  1. 2006/02/01(水) 03:20:52 |
  2. URL |
  3. windy #JalddpaA
  4. [ 編集 ]

ML310の資料はとても参考になりました。
配線遅延とIOパッドの入出力遅延はそれなりにはあるんだろうなという認識でしたが、具体的に計算するとバカにならない遅延量ですね。
僕の方のDDRコントローラですが、XAPP806の動的位相シフトを使って正しくリードできるところを探す方法で解決できないか試行中です。
marseeさんも同じことをやってましたよね。
  1. 2006/02/01(水) 03:41:36 |
  2. URL |
  3. windy #JalddpaA
  4. [ 編集 ]

V2のESの時にDCMをカスケード接続して痛い目にあったことがるので慎重になっています。V2proのDCMは良くなったと有名な方に聞いたことがありますが。FX出力は余り信用していません。
そのときの現象は66MHzをDCMで100MHzにFXで逓倍して、ちがうDCMにいれて1倍(clk0)で駆動したら波形が出なくなるという現象でした。アレ逆だったかな?どちらにせよカスケードをやめたらOKでした。
FX出力はジッタが多いようです。
http://www.xilinx.co.jp/applications/web_ds_v2pro/jitter_calc.htm
にジッタ計算機がありますよ。
私でしたら1倍はclk0から取ります。
  1. 2006/02/01(水) 09:01:52 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

私の場合も動的位相シフト使ってます。最初のイニシャル時にDDR SDRAMに可能な限りずっとリードコマンドを発行して、位相シフトしながらでうまく受けられる場所をサーチします。周期一回りしたら、ちょうど真ん中の位置に位相シフトを戻しています。それで初期化完了。ちょうどRAMBUSのイエローストーン?見たいな感じですね。
動的位相シフトについては
http://marsee101.blog19.fc2.com/blog-entry-19.html
をご覧ください。といってもEDKなので違うのかな?
http://www.xilinx.co.jp/xlnx/xil_ans_display.jsp?iLanguageID=2&iCountryID=2&getPagePath=15130
このアンサーサーチ困ります。bitgenでオプション付けるのでシミュレーションで確認できません。
  1. 2006/02/01(水) 09:32:13 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

Architecture Wizardではジッタの影響が大きくなるのでCLKFXの後ろにはDCMのカスケードはできないようになっているんです。
それだけCLKFXはジッタが大きいという事なのでしょう。
OSCの変更を検討した方が良いかもしれませんね。

bitgenのオプションの件は知りませんでした。ありがとうございます。
あと、知ってたらお聞きしたいのですがDCMのPSCLKってフリーランニングのクロックでないと駄目ですかね?
データシートを見ても良いとも悪いとも書かれていないようで、手っ取り早く試すために今はPPCにGPIOコアをつけてCPUのプログラムからPSCLKを作っています。
  1. 2006/02/01(水) 21:22:30 |
  2. URL |
  3. windy #JalddpaA
  4. [ 編集 ]

フリーランニングクロックしか入れてないのでわかりません。うちではアプリケーションのリファレンスデザインと一緒でたしか16分周のCLKDV入れていたと思います。
  1. 2006/02/01(水) 21:43:52 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

XAPP806のデザインはEDKでPPCかMicroBlazeのプログラムからGPIOで制御するものですが、DCMのPSCLKとPSENは実際にはGPIOの出力を受けてハードウェアロジックで出力するようになっています。
このことから考えて、PSCLKはフリーランニングを使用するべきであるようですね。
  1. 2006/02/01(水) 22:54:09 |
  2. URL |
  3. windy #JalddpaA
  4. [ 編集 ]

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
http://marsee101.blog.fc2.com/tb.php/138-086daefb
この記事にトラックバックする(FC2ブログユーザー)