FC2カウンター FPGAの部屋 2006年01月29日
FC2ブログ

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

FPGAの部屋

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

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

最初に私のDDR SDRAMコントローラのタイミング図を示す。このタイミングチャートはアクティベートコマンドでROWアドレスとバンクを指定してアクティベートした後のリード、ライトコマンドの動作の様子だ。CAS LATENCY=2、バースト長=2、動作周波数133MHzの予定だ。
DDR_timing_chart_rw1_060129.png


昨日の続き。
2.のDQSを使う方法だ。DQSはライト時にはDQに対して90度位相がずれているが(上図参照) リードの時にはDQと同位相で出てくる。よってDQSを何らかの方法で遅延させてDQをサンプルしなければいけない。これには2つ方法があるようだ。
1つはDQSを配線遅延でDQがサンプルできるまで遅延させる方法、もう1つはDQSをLUTなどを使って内部で遅延させる方法だ。
配線遅延でDQSを遅延させる方法では動作周波数によって配線遅延の長さが異なる。つまり一度決めた周波数を動かせないということだ。うちとしては基板を何度も作るわけには行かないのでこの方法は取れない。設計動作周波数で動かなかったら基板を作り直さなければいけない。
もう1つの内部遅延ではLUTなどを使うようだ。実際の受信回路はj_xapp802.pdfの4ページの図4に書いてある。遅延回路はj_xapp688.pdfの6ページの図8に載っている。実際に私もmfreemanさんの回路をもとに実験してみた。(Re: FPGAでディレイ >>>保証なし)
LUTプリミティブを使用して可変ディレイを作ることが出来るだろう。
今回の基板のFPGAのピンアサインもDDR使う方向でやっている時点では8つのDQに対して1つのDQSをグルーピングしてピンに割り当てて、DQSを配置固定したLUTで遅延しSRL16でDQをサンプルという予定でいた。
ただし、ここで注意しなければいけないのはDQSの遅延量はDQのデータウインドウの真ん中ではないかもしれない。
検証してみよう。IOBの入力パッドからI出力までの遅延はTiopi=0.87ns(V2pro-6)、IOBの入力FFのセットアップ/ホールド時間TIOPICK/TIOICKP=0.86/-0.63ns(V2proデータシート、ユーザーズマニュアルより) 大体同じなのでこれは考慮しないくても良いようだ。LUTで真ん中まで遅延するとすると1LUT遅延はTilo=0.32ns、仮に配線遅延を0.3nsとすると、7.5nsの半分3.75nsの半分で1.875nsとすると3個遅延素子を入れればよいことになる。
ちなみにDCMの位相シフトを利用したクロックを使用したIOBのセットアップ/ホールド時間はどうかというとj_xapp259.pdfの6ページからにあるようにTpsdcm/TphdcmはXC2VP30では1.81/-0.74と記載されている。データの変化点からクロックエッジまでの遅延を計算すると、クロックの変化点からTac=500ps必要だ。次にDCMのジッタ100ps、そしてセットアップ時間1.81nsを足すと、合計2.41ns。真ん中から0.535nsずれたところにクロックエッジを設定することになる。

次にDQSはリードの時のみDDR SDRAMがドライブして、それ以外の時にはフローティングしている。リード時のみクロックが出て来てそのほかはクロックが入ってこなければいいのだが、どうやらチップスコープでDQSを見ているとフローティングの時にはちらちら波形が出ているようだ。こうなるとDQの受けをSRL16などのシフトレジスタを使ったFIFOで構成した時にどこがデータかを判定しなければならない。CL=2ならばコマンドを送った2クロック後にデータがSDRAMから来るはずであるが、データ受信FIFOにコントローラからイネーブルを与えるのが難しいと思う。
任意の配線長で使える方法ではイネーブル信号を出力して、DDR SDRAM間での行き帰り配線長を通して、イネーブル信号入力に加えてイネーブルする方法か。
配線長が決まっていれば、その分を計算して、LUT遅延で作り出してイネーブルを遅延させるか。こちらのほうは正確な配線遅延の計算が必要なはずである。配線遅延で回路も変わってくるはずだ。
結局、異なるクロック間のデータの受け渡しが面倒くさいし、タイミングもずれる可能性がある。DQSのクロックがマスタクロックに近く、今のクロックでデータを取れるかどうかという状況だとするとどうだろう。間に1つマスタクロックの反転クロックでデータを取って、マスタクロックに受け渡さないといけないかもしれない。(イネーブル信号などを受け渡す場合)という訳で配線遅延に影響されないように回路を作ろうとするとかなり難しいことになると思っている。

これが3.のIOBの可変遅延回路でデータを遅らせるとどうなるだろう。データが遅れるのでマスタクロックでサンプルできる。ということはリード時にコントローラからのリードデータイネーブルがそのまま使用できるということだ。かなりDDR SDRAMコントローラを作るのが楽になる。ここでも遅延をサーチしてちゃんと受かる遅延を見つける回路をつけなければ。
配線遅延からうまく受かる遅延を決定するのが重要になると思う。
スパルタン3Eのデータシートを見ると4nsの遅延が入っているということである。これじゃちょっと少ないが配線遅延で調節すればよいだろう。

何か取りとめがなく、まとまっていないで申し訳ない。このようなことを考えている。
私のDDR SDRAMコントローラはこの辺のことはどうしているかというと、DQSもDQと一緒にサンプルして特徴的なパターンを抽出している。DQSとDQを一緒にFIFOに入れてDQSのパターンを確認して、同時に入ってるDQをデータと認識している。一応これで83MHzだったらちゃんと受けられるようだ。
データシートを見て遅延を調整しても最大値しかわからないので、遅延の実力値は未知数だ。実際は微調整が必要だろう。ロットごとに遅延値が変わって回路を変更しなければならなくなったとしてもおかしくない。それを嫌って、私のDDR SDRAMコントローラは配線遅延に影響されない回路構成を目指している。
DDR SDRAMコントローラ使わなくなったので、ちょっともったいない。スパルタン3Eスタータキットで確かめてみよう。
しかし、DCMのジッタが多くて100MHz以上の周波数でDDR SDRAMコントローラのデータを受けられないならば、Xilinxに頑張ってもらってジッタの少ないDCMを何とか作ってもらえないものか。。。
  1. 2006年01月29日 08:32 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:4