FC2カウンター FPGAの部屋 2009年06月19日
FC2ブログ

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

FPGAの部屋

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

Spartan3A Starter KitのDDR2 SDRAMコントローラのバーストテストのデバック2(sd_loop_outの処理)

Spartan3A Starter KitのDDR2 SDRAMコントローラのバーストテストのデバック”でsd_loop_inを前に1クロック前に伸ばすという結論になった。sd_loop_inを前に1クロック前に伸ばすには、sd_loop_outを1クロック前に伸ばす必要がある。(結局、sd_loop_outのタイミングはそのままとしました)
その前に、そういえばsd_loop_outのケアを忘れていたことに気がついた。はたしてsd_loop_outはどのようにインプリメントされているの調べるということでFPGA Editorを立ち上げて調べてみた。
sd_loop_outのIOBをのぞいてみたところが下の図。
Spa3A_STKit_DDR2_Debug_3_090617.png

IOBのフリップフロップ(FF)を使用していない。これはまずい。最初にIOBのFFを使うようにVerilog ソースを変更し、もう一度データを取る必要がある。この状態ではsd_loop_outが遅れてREADの時の最初のデータを取れていない可能性がある。UCFも調べてみたらsd_loop_outの制約もなかった。早速、sd_loop_outの最終のフリップフロップ(FF)をIOBに入れることにした。具体的には下のようにVerilogファイルを変更した。(一部です)

    (* IOB = "FORCE" *)output    reg    sd_loop_out;    // DDR2の遅延をキャンセルするための出力パッド


    always @ (posedge clk) begin
        if (reset)
            sd_loop_out = 1'b0;
        else begin
            sd_loop_out = read_timing_1b;
        end
    end


一番上の行は宣言文だが(* IOB ="FORCE" *)制約を付けている。今回、制約ガイドを見て初めて知ったのだが、こうするとsd_loop_outがIOBに入らないとエラーが出るそうだ。
これでインプリメントしたところに下に示すようにIOBにFFが入った。
Spa3A_STKit_DDR2_Debug_4_090617.png

これでコンフィグしてやってみたところ、ChipScopeでの波形もOKだった。波形は下。信号名が表示されていないが、前回と一緒で、その下にread_error信号が追加されている。
Spa3A_STKit_DDR2_Debug_5_090617.png

前回のシミュレーション波形と比べてみる。
Spa3A_STKit_DDR2_Debug_2_090617.png

シミュレーションと波形が一致した。
この前、シミュレーションでマージンがないという話をしたが、それはTiming Analyzerで性的 静的に解析したタイミング情報を論理シミュレーションに反映していないためだった。実際はReadデータとDQSのクロックはFPGA内部では1.5nsの差がある。同位相できたReadデータとDQSクロックは、DQSクロックのほうが約1.5ns程度、FPGA内部で遅れるようにタイミングを組み上げている。よってsd_loop_outから出たReadのタイミング信号はsd_loop_inから入って、ReadのEnableとして使えば、Readのデータが読めるはずだ。そのためにsd_loop_inにはMAXDEALY制約とMAXSKEW制約をかけてある。
ずーとバーストテストをしながらSparatan3A Starter Kitを放置していたが、エラーは出ていないようだ。
ChipScopeで見ても、正常にテストを行っている。
Spa3A_STKit_DDR2_Debug_6_090617.png

1時間バーストテストを行ったが結局エラーは出なかった。これでSpartan3A Starter KitのDDR2-300 SDRAMコントローラは完成とする!!!
うれしいです!!!みなさん、拍手などでのご声援ありがとうございました。
思えばいろいろな苦労があった。自分で非同期FIFOも作ることになったし、Readデータを受ける初段に分散RAMを使用したので、フロアプランに苦労した。でも、だいぶ勉強になった気がする。
Spartan3A Starter KitのDDR2-300 SDRAMコントローラ、誰か欲しいでしょうか? Verilog ソースとUCFにノウハウが詰まっているので、Verilogをそのまま他の基板に移植しただけでは、まず動かないと思います。Spartan3A Starter Kitの下の写真のような等長配線があって初めて実現できたとも言えます。
Spa3A_STKit_DDR2_1_090619.jpg

インプリメント結果ですが、ChipScopeを入れると、少しですがタイミングエラーが出ていますが、動作には問題ないようです。
Spa3A_STKit_DDR2_Debug_7_090617.png

ChipScopeを入れないとタイミングエラーは出ません。どっちにしろタイミングはきついところみたいです。やりませんけど、IPとして配布する場合には相対配置制約をかけたほうがいいかもしれません。
  1. 2009年06月19日 04:52 |
  2. Spartan3A Starter Kit
  3. | トラックバック:0
  4. | コメント:2