FC2カウンター FPGAの部屋 DDR SDRAMコントローラ
fc2ブログ

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

FPGAの部屋

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

DDR3 SDRAMの新機能のまとめ

さて、Spartan-6 FPGA SP605 評価キットを試してみたいのだが、その前にDDR3 SDRAMの新機能について勉強してみることにした。参照する資料はエルピーダ社のDDR3 SDRAMの新機能の使い方 - ユーザーズマニュアルを使用した。日本語でうまくまとまっていて、このシリーズにはDDR SDRAMの時代からお世話になっている。ありがとうございます。

1. 電源電圧が1.5V
2. バンク数が8、前のDDR2は4バンクだったのだが、DDR2でも8バンクもあるとのこと。
3. バースト数は当然8だが、4もあるとのこと。4の場合は、残りの4バーストを出さないで待っているようだ(Burst Chop4(BC4))。
4. ZQ Calibration:PVT (プロセス、電圧、温度)による Ron と ODT 値の変動の補正を行うそうだ。DDR2のOCDはオプション機能で肩透かしをくらったが、これは標準機能なのか?なお、Calib.コマンド(ZQCL,ZQCSを発行すると DRAM が自動で調整を行うセルフキャリブレーションだそうだ。DDR3 が正常動作するために必須の機能だそうだ。
5. RL,WLの扱いが変更になっている。この辺の機能はDDR2コントローラでも使っていない。(Posted CAS, Additive Latency)は使っていない。
6. DDR3ではディファレンシャルDQSのみ対応とのこと(DQS, DQS#)
7. /RESETピンが追加された。リセットすることができる。
8. Dynamic ODT:MRSコマンド発行なしにWrite時のODT抵抗値を動的に切り替えることが出来る機能。Write 時の信号品質向上に寄与。だそうです。Asynchoronous ODTも追加されたようだ。
9. DDR3 SDRAMのメモリモジュールでは、CMD/ADDRESS/CLK配線は各DDR3モジュールを一筆書き配線で結ぶとのこと。一筆書きの最初と最後では到達時間差が発生する。DQとDQSはそれぞれのDR3モジュールにつながっているため、CMD/ADDRESS/CLKとの間に時間差が発生する。そこで、 Write levelingモードで、DQ/DQSとCMD/ADDRESS/CLKの到達時間を合わせる。これはDQ/DQSの出力遅延を操作する必要があるので、Virtex-5以上でないと実装出来ないわけだ。
10. Read leveling:DDR3 SDRAM があらかじめ決められたデータパターンを出力してくれるようだ。これで、READデータの取り込みタイミングを最適な位置に調整しやすくなる。


DDR3は1ピン当たり、1Gbit/sec以上の転送レートを持っているので、かなりシビアになっていた。CMD/ADDRESS/CLK配線の時間差も考慮に入れて、DQ/DQSを遅延させるなど、コントローラの実装面でも厳しい。Xilinx社のFPGAでは、Virtex-5以上でないと厳しいだろう。DLLをイネーブルすると、最低動作周波数もかなり高いことが予想される。自作は厳しいだろう?
とりあえずMIGでSpartan-6のDDR3 SDRAMコントローラのハードIPを試してみたい。

ここまでやるとすると、次のメモリ規格が心配になってきた。次はどうなっているのだったろうか?DDR4?
  1. 2010年03月31日 05:55 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

なひたふさんのところでSpartan3EでDDR2-400動作確認

いつものように”なふたふJTAG日記”を見に行ったら、なひたふさんの作っているPCIeの基板でSpartan3EでDDR2-400が動作したと言う記事(Spartan3E+DDR2メモリで400Mbps)を見た。
いや、Spartan3EでDDR2-400行けたなんて凄い。しかもバースト転送も問題ないそうだ。DDR2 SDRAMは、マイクロン社の533MHzのDDR2で、Suzaku-Vについているのと同じものだ。内部クロックでリードデータを受けられていると言うのも凄い。Spartan3Eの限界を超えたオーバークロックのようだ。しかも-4グレードと一番下のスピードグレード。なひたふさんのアイディアの豊富さと技術の確かさ、チャレンジ精神を感じた。

私もSpartan3E Starter Kit でもっとクロックをあげてみようと思ったが、CL=2 では133MHz(DDR-266) だったのでやめた。CL=2.5 だと167MHz(DDR-333)か、こっちのほうが良いかな?
Spartan3A Starter Kit のDDR2 SDRAMも試してみたくなってきた。FPGAの中身を詳しく理解するには限界までチューンすると良くわかってくると思う。
とにかく、今後のなひたふさんの日記に注目しようと思う。
  1. 2009年01月06日 05:13 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

DDR2 SDRAMコントローラにODT機能を追加しインプリメント

前回”DDR2 SDRAMコントローラにODT機能を追加”でDDR2 SDRAMコントローラにODT機能を追加しシミュレーションしたが、ISE10.1i でインプリメントして確かめてみた。
その結果、以前と一緒でシングル転送の時はリード・ライトできるが、バースト転送の場合はどこかでエラーになるようだった。他のところが悪いのか?SUZAKU-Vの回路図もないので、これはとりあえずペンディングとする。
SUZAKU-Vでは本来の使い方?のEDKで使ってみようと思っている。
  1. 2008年12月01日 05:50 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

DDR2 SDRAMコントローラにODT機能を追加

ET2008のDDR SDRAMのセミナに行って、ODT(On-Die Termination) はWrite時にだけONすると良いと言うことを聞いてきた。それも、FPGA側にDCI (Digitally Controlled Impedance) を使用するとベストだそうだ。(しかし、DCIを使用すると電力を消費しFPGAが熱くなる)ここでFPGAとDDR2 SDRAM間の配線にはダンピング抵抗のみ実装を想定しているそうだ。
SUZAKU-Vの配線がどうなっているのかいまいちわからないのだが、ODTをWriteのときにだけONしてみることにした。ifdefを使って実装して、いらないときにはすぐにはずせるようにした。
まずはODTのタイミングは下のようになる。Micron社のDDR2 SDRAM MT47H64M4 のデータシート(256MbDDR2_3.fm Rev.J 11/05 EN) の76ページの図を転載させていただきます。
ddr2_odt_2_081127.png

これによるとODT turn-on delay は2tckなので、WriteのDQやDQSが出力される2クロック前にODTを1にする必要がある。次にODT turn-off delay は2.5tckなのでDQやDQSが出力されなくなる2.5クロック前にODTを0にする必要がある。ということでODTを制御するステートマシンを組んでみた。Verilogコードを下に示す。

    // DDR2_ODT
`ifdef DDR2_ODT_ENABLE
    always @(posedge clkx) begin
        if (reset)
            cs_odt <= IDLE_ODT;
        else
            cs_odt <= ns_odt;
    end
    
    always @ * begin
        case (cs_odt)
            IDLE_ODT : begin
                odt_node <= 1'b0;
                if (write_timing)
                    ns_odt <= WRITE_ACTIVE;
                else
                    ns_odt <= IDLE_ODT;
            end
            WRITE_ACTIVE : begin
                odt_node <= 1'b1;
                ns_odt <= WRITE_TEST; // write_timingがまだ1のままかをテスト
            end
            WRITE_TEST : begin
                odt_node <= 1'b1;
                if (write_timing)
                    ns_odt <= WRITE_ACTIVE;
                else
                    ns_odt <= WRITE_HOLDOFF1;
            end
            WRITE_HOLDOFF1: begin
                odt_node <= 1'b1;
                ns_odt <= IDLE_ODT;
            end
        endcase
    end
    
    always @(posedge clkx) begin
        if (reset)
            odt_node_1d <= 1'b0;
        else
            odt_node_1d <= odt_node;
    end
    assign ddr2_odt = odt_node_1d;
`else
    assign ddr2_odt = 1'b0;
`endif


そのシミュレーション結果を下に示す。
ddr2_odt_081127.png

黒いカーソルのところでDDR2 SDRAMはODTが1だと認識して、緑のM1カーソルのところで終端抵抗をONにする。次に赤のカーソルのところでDDR2 SDRAMはODTが1だと認識して、緑のM2カーソルのところで終端抵抗をOFFにする。
Writeでスイングするddr2_dq, ddr2_dqs, ddr2_dqs_n, ddr2_dm がその範囲に入っていることが確認できると思う。
これでODTはWriteのときのみONとなったと思う。
次にDCIだがこれはFPGAのDCIのインピーダンスを決定する抵抗を実装する端子VRPとVRNに抵抗が実装されていないと使えない。これだけでもアットマークテクノに聞いてみないと使えない。。。ODTにしても、終端抵抗が実装されていると2重に終端抵抗をつけてしまうことになるので、ODTはOFFとする必要があるが、回路図を教えてもらえないのでやってみようと思っている。
  1. 2008年11月28日 05:50 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

DQSをクロックとしてDQをリードするDDR2 SDRAMコントローラの再検討

DQSをクロックとしてDQをリードするDDR2 SDRAMコントローラの初期化時に、トレーニング・シーケンスを行って、うまくリードデータが受かる遅延を探る方法を検討している。
今の計算では、FPGA内部や配線遅延を含めた総合的な遅延が6nsを超えるくらいなので、遅延を加えていっても、条件が悪くなるばかりのような気がする。
上のリンクの記事”DQSをクロックとしてDQをリードするDDR2 SDRAMコントローラの遅延の検討”から引用すると、
”これをFPGA動作クロックの270度で受けようとすると2クロック目で8.75ns となり、DQSクロックから270度クロックの乗せ変えのためのセットアップ時間として、8.75ns - 6.986ns = 1.764ns 見込めることになる。”
DQとDQSに遅延を加えていくと、この1.764nsの余裕がどんどんすくなるなるはず。。。

それから、このところ一番参考にしているXilinx社のアプリケーションノートXAPP721J、”ISERDES とOSERDESを使用した高性能DDR2 SDRAMインターフェイスのデー タキャプチャ”の9ページの遅延キャリブレーションフロー図の最初でDQSを2タップしか遅延していないがこれで大丈夫なのだろうか?
その前のページに”BUFIOとクロックリソースの伝搬遅延により 、 DQの遅延よりもDQS の遅延の方が大き く な り ます。”と書いてある。しかし、ISEのTiming AnalyzerでDQとDQSの.IOBDELAY_TYPE("FIXED"), .IOBDELAY_VALUE(0),のときの遅延値の比較は下の図のようになる。
DDR2_inquest_1_080905.png
これを見る限り、DQSのBUFIOの出力とDQ入力の遅延差は0.199ns、約200ps だ。それほど遅延差はないと思われる。
よって、Xilinx社のアプリケーションノートXAPP721JでDQより2タップしかDQSを遅延しないでうまく受かるのだろうか?ちょっと疑問?なぜだろう?
後はデータ・キャプチャ・ウインドウに入るようにDQとDQSの遅延タップを一緒に遅延させている。
しかしここまでやらないとスイートスポットが見つけられないのか?
ilinx社のアプリケーションノートXAPP721Jをみると、300MHz動作でジッタなどの不確定値が1.378ns もあり、ワーストケースのウインドウはたった289ps だそうだ。本当にこれで大丈夫なのだろうか?
それでトレーニングシーケンスでいろいろDQとDQSを一緒に細かく遅延させて受かるかどうかを確認しているようだ。
そういえばISERDESの内部のレジスタのセットアップ時間などのデータがデータシートに載っていない。clkはDQSが入っているし、OCLKとCLKDIVにはclk270度が入っているので、Timing Analyzerで解析できないはずなんだが、データシートに載っていないのでわからない。
とりあえず、今の状況でDQの遅延を加えていくと、ウインドウに入らない方向にいってしまうことが考えられる。実際に遅延値を変えながら、ちょっとやってみたんだが受からなかった。これを根本的に変えるには、ISERDESのOCLKとCLKDIVにクロック位相0度のclk を入れる必要がありそう。そうなると必然的にOSERDESの出力クロックもclk となるので、tDQSSをMAXに戻す必要が出てくる。
どうしようと思っていたが、お手軽にDQの入力遅延を約740ps 少なくできそうな方法を見つけた。

ここで、Virtex-4 FPGA Data Sheet:DC and Switching Characteristicsの28ページの表を見てみる。下にその一部を転載する。
DDR2_inquest_2_080905.png
上の表はISERDES Switching Characteristics の1部だ。データラインのセットアップとホールド時間をして示しているが、今はDDRモードを使用しているので、下のピンクで囲った部部になる。
現在は、緑で囲った部分を使用している。緑の部分の表で、最初の列が-12スピードグレードの遅延値、次の列が-11、最後の列が-10スピードグレードの遅延値だ。今使用しているVirtex4は-10 スピードグレードなので、右端の遅延値ということになる。これをみると.IOBDELAY_TYPE("FIXED") の時のセットアップタイムは1.08ns になる。これはTiming Analyzerのデータ遅延の一番下の値と符合している。
よって、.IOBDELAY_TYPE("NONE") にすれば約740ps 遅延が短くなるはず。。。(実際には.IOBDELAY("IFD"), を.IOBDELAY("NONE"), にしました)
そこでやってみたのが下の図。
DDR2_inquest_3_080905.png
DQをサンプルする入力用FFのセットアップタイムが1.08ns から0.335ns へ短縮されている。これは入力用遅延素子をバイパスしているためだろう。
これで、DQSクロックの遅延(3.107ns) - DQの遅延(2.163ns) = 0.994ns。DQとDQSの遅延の差はクロック周期(5ns)の1/4 (1.25ns) にしてみるとして(DDRで両エッジでデータをサンプルするから)、(1250- 994)/75 = 3.4 よって、3タップ遅延を入れることとする。
これでインプリメントしてどうなるか見てみることにした。

2008/09/07:追記:手動で確かめたところ動作しました。ですが、チップスコープの試用期限が過ぎたので、その後が確かめられません。
  1. 2008年09月06日 06:24 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

SuzakuVのDQSでリードデータを受けるDDR2 SDRAMコントローラ

SuzakuVのDQSでリードデータを受けるDDR2 SDRAMコントローラのISEプロジェクトとVerilogファイルをここにおいて置くので、興味のある方はダウンロードしてください。
例によって保証はありません。プロジェクトやファイルは個人的に実験するのみで、商用に使用することや再配布は禁止します。ダウンロードして試してみた方も動いたどうかコメントで教えてください。ただし、多分、DDR2 SDRAMコントローラ部分にバグがあってバーストアクセスは今のところできないようである。

このプロジェクトはSuzakuV(SZ410) スタータキットの7セグメントLEDとスイッチ、ロータリーエンコーダーを使用して、DDR2 SDRAMの読み書きをテストするためのものだ。

ISE10.1iでのインプリメントの仕方は別にISE10.1iのインプリメントのやり方編として、別の記事に書こうと思う。

とりあえず、今の”SuzakuVのDQSでリードデータを受けるDDR2 SDRAMコントローラ”は遅延が計算から求めた固定の遅延値でやっている。やはり、以前、”DQの最適な遅延値を測定するDDR2 SDRAMコントローラのシミュレーション”などでやったように、最適な遅延値を測定するフェーズを”SuzakuVのDQSでリードデータを受けるDDR2 SDRAMコントローラ”にも追加しようと思っている。幸いにも、以前使用した回路は無効にしているだけで残っているので、それを改造しようと思う。
しかし、やはり、DQSを使ってトレーニングシーケンスを使うところまで来てしまった。やはりDDR2 SDRAMを使うのは難しいのか? それとも私がぼんくらなのかもしれないが。。。
  1. 2008年08月23日 20:37 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

DDR2 SDRAMコントローラの経過説明

DDR2 SDRAMコントローラはどうもバーストテストがうまくいかない。Chipscopeを入れてもリードデータの2バーストデータのうち1個だけ受かっているように見えるときもあるが、ほんの少しパラメータを変えたら(関係のなさそうな)リードデータがなくなったりしてしまう。どうも、趣味のレベルではとりあえずうまくいかなそう。。。

後で、Suzaku-V(SZ410)でのDDR2 SDRAMのスイッチでの単発読み書きのプロジェクトと、DDR2 SDRAMのバーストテスト用Verilogファイル(シミュレーション用、インプリしてうまくいかなかったので。。。)を公開しようと思う。どなたたか、やる気ある方は、やってみてぜひ、どこが悪いのかを指摘してほしい。
  1. 2008年08月22日 20:50 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0
»