FC2カウンター FPGAの部屋 Spratan3E Starter KitのDDR SDRAMコントローラまとめ
fc2ブログ

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

FPGAの部屋

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

Spratan3E Starter KitのDDR SDRAMコントローラまとめ

Spratan3E Starter KitのDDR SDRAMコントローラがとりあえず動いてきた。
クロックはSpratan3E Starter Kitの50MHzクロックを2倍にした100MHzだ。
以前、Internal Errorで落ちると言っていたが、少なくともODDR2とIDDR2、IOBUFの組み合わせを使うとInternal Errorで落ちるようだ。
それ以前に同じIOパッドのODDR2とIDDR2のセット・リセット信号を完全にあわせないと下図のエラーで落ちるようだ。セット・リセット信号は完全にあわせないとだめなようだ。1つだけGNDにつながっていてもだめで、完全に一致しなければだめな様である。
DDRtest_1_060624.png

そのため、以前はs(セット)で制御していたIOバッファのイネーブル用DDRレジスタだが、それを止めてDの入力信号に組み合わせ回路を加えて対処し、セット・リセット信号を完全にあわせた。

    -- Insantiate three-state DDR registers
    dq_tri_d0 <= dqs_reset_2d_dqtri or not_dqs_enable_2d;
    dq_tri_d1 <= not_dqs_enable_2d;
    
    WRDATA_DDR_TRI_INST : for i in DDR_DATA_WIDTH-1 downto 0 generate
        WRDATA_DDR_TRI : FDDRRSE port map(
            q => out_tri(i),
            d0 => dq_tri_d0(i/8), -- DQSが0になる最初のクロックで1なので、一番最初の半クロックだけディスエーブル
            d1 => dq_tri_d1(i/8),
            c0 => clk,
            c1 => clkx,
            ce => vcc,
            r => reset,
--            s => not_dqs_enable_2d(i/8)
            s => gnd
        );
    end generate WRDATA_DDR_TRI_INST;


ちなみにSpartan3EでもFDDRCPE,FDDRRSEも使用できた。ODDR2でもどっちでも良いようだが、Internal Errorの危険があるので、今のところFDDRCPE,FDDRRSEの方がいいだろう。
DDR SDRAMはいままでいろいろ書いてきたが、今回のタイミングダイアグラムは以下の図のDDR SDRAM Read timing 1のタイミングチャートでCL=2で出てきたリードデータを配線とIOB内のDELAYで3/4クロック(7.5nsもしくはセットアップ時間を確保するためにもう少し短く)ずらしてFPGA内部100MHzクロックで受ける予定だ。
DDR_timing_chart_rw1_060129.png

やっと近頃バグが取れたようなので依然作ったロータリーエンコーダ入力のLCD表示回路(下図)に接続してテストした。
Rotary_Encoder_1_060518.jpg

LCD表示器の上の4桁はロータリーエンコーダで設定することが出来る。そのデータをeast押しボタンスイッチを押すとDDR SDRAMのオール0番地に書き込むことが出来る。次にwest押しボタンスイッチを押すとDDR SDRAMのオール0番地から読み出して下の4桁の表示する。
押しボタンを押すとかなりの回数連続的に読み書きするが、とりあえずDDR SDRAMにアクセスできるかどうかはわかる。
いろいろIOB内のDELAYを変更してやった結果が下である。

IFD_DELAY_VALUE=0 確実に2番目のデータを表示(X)
IFD_DELAY_VALUE=1 確実に2番目のデータを表示(X)
IFD_DELAY_VALUE=2 確実に2番目のデータを表示(X)
IFD_DELAY_VALUE=3 確実に2番目のデータを表示(X)
IFD_DELAY_VALUE=4 正常に表示できるときもあるがミスる(△)
IFD_DELAY_VALUE=5 正常に1番目のデータを表示(○)
IFD_DELAY_VALUE=6 正常に1番目のデータを表示(○)


IFD_DELAY_VALUE=6がよさそうである。まだちょっと遅延が足りない可能性もあるが、とりあえずこれで行くことにした。
遅延量を評価してみる。
1.まずはFPGAのチップ内配線での遅延はIOパッドのクロック出力をフィードバック・パッドに戻してFBかけているので0とする。(異論もあるだろうが。。。)
2.FR-4基板の遅延量を75ps/cmとし、大体往復で6cmとすると450ps
よってDDR SDRAMのデータを受けるIOBのDDRレジスタへのクロック配線のスキューは大体0なので、データをIOBのDELAYで7.5ns - 0.45ns=7.05ns遅延させると良い。
Spartan3Eの入力用プログラマブル遅延素子を参照すると、一番近いのは”IFD_DELAY_VALUE=2 の時rot_aデータパス遅延は6.930ns”のようだが、実際にはDDRの逆側のデータが見えてしまっている。これは遅延量が少ないため次のデータがサンプルされているものと思われる。(DDR SDRAMは常に2つのデータの組でデータを出力するが、現在は最初のデータだけを使用しているため)
IFD_DELAY_VALUE=5以降は正常にデータが読めている。初めにこれはものすごく荒い計算だということを断っておかなければならない。あえて言うと、これは何を意味しているかというとTiming Analyzerの遅延値はかなり余裕を持った値かもしれないということだと思う。以前Spartan3ではTiming Analyzerの遅延値よりも実測値は70%ではないかという結果が出た。(FPGAの性能)
Timing AnalyzerでIFD_DELAY_VALUE=6 の時rot_aデータパス遅延は9.983nsなので、これの70%は約7ns。この性能の推定は大体あっているのかもしれない。
DDR SDRAMコントローラの公開をどうするかはこれからの課題だが、とりあえず、iMPACTでダウンロードできるようにBITファイルと本当にDDR使っているよということを示すためにFPGA EditorのファイルであるNCDファイルをここにおいて置くので、試したい方は試してください。例によって保証はありません。うちのキットでは動いていますが、回路が間違っているかもしれませんので、その場合はボードにダメージを与える場合も0ではありません。

一応動作するようだが、まだ腑に落ちない部分があるのでもう少しチューニングすることにする。

そういえばBIT,NCDファイルのやり方わかるだろうか? Windowsのスタートのすべてのプログラムから"Xilinx ISE 8.1i"の"アクセサリ"の中のiMPACTやFPGA Editorを使用してほしい。使い方のわからない方はコメントで問い合わせください。
  1. 2006年07月01日 20:20 |
  2. Spartan3E Starter Kit
  3. | トラックバック:0
  4. | コメント:2

コメント

遅ればせながら、動作報告です。
問題なく動作しているようでした。
  1. 2006/07/03(月) 23:14:29 |
  2. URL |
  3. Sim #mQop/nM.
  4. [ 編集 ]

動作報告ありがとうございます。クロックが出ているのをオシロで確認していないのですが、動いているのですから大丈夫ですよね???
Chipscopeで信号が出ているのは確認済みです。
IPとして出せるかどうか検討中です。
  1. 2006/07/04(火) 04:41:03 |
  2. URL |
  3. marsee #-
  4. [ 編集 ]

コメントの投稿


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

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