FC2カウンター FPGAの部屋 DDR2 SDRAMコントローラのインプリメントテスト(IOB)
FC2ブログ

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

FPGAの部屋

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

DDR2 SDRAMコントローラのインプリメントテスト(IOB)

DDR2 SDRAMコントローラのシミュレーションまとめで公開したVerilog HDLコードでは、インプリメントが厳しい。入力のFFがIOBに入らなかった。
やはり、IOB入出力関連はトップに持ってきてリード用、ライト用を統合したほうがPartitionをかけたときを考えてもよさそうだ

    // ddr2_dqのIOBをプリミティブでインスタンシエーション
    generate
    genvar i;
        for (i=DDR2_DATA_WIDTH-1; i>=0; i=i-1) begin: WRDATA_INOUT
            ODDR #( // data output DDR
                .DDR_CLK_EDGE("OPPOSITE_EDGE"), // SAME_EDGEモードにするとMAPでエラー。ISE9.2iSP4
                .INIT(1'b0),
                .SRTYPE("ASYNC")
            ) WRDATA_DDR2_OUT (
                .Q(ddr2_out[i]),
                .C(clk),
                .CE(dqs_enable_3d[i/8]),
                .D1(wrdata_3d[i]),
                .D2(wrdata_4d_half[i]),
                .R(reset),
                .S(1'b0)
            );
            
            ODDR #( // data tristate enable
                .DDR_CLK_EDGE("OPPOSITE_EDGE"),
                .INIT(1'b1),
                .SRTYPE("ASYNC")
            ) WRDATA_DDR2_TRI (
                .Q(out_tri[i]),
                .C(clk),
                .CE(1'b1),
                .D1(dq_tri_d0[i/8]), // DQSが0になる最初のクロックで1なので、一番最初の半クロックだけディスエーブル
                .D2(dq_tri_d1[i/8]),
                .R(reset),
                .S(1'b0)
            );
            
            IDELAY #(
                .IOBDELAY_TYPE("FIXED"),
                .IOBDELAY_VALUE(0)
            ) RDDATA_DDR2_IDELAY (
                .O(ddr2_dq_idelay[i]),
                .I(ddr2_dq_in[i]),
                .C(1'b0),
                .CE(1'b0),
                .INC(1'b0),
                .RST(1'b0)
            );
            
            IDDR #( // input DDR
                .DDR_CLK_EDGE("SAME_EDGE_PIPELINED"), // 位相あわせまでIOBのDFFで行う
                .INIT_Q1(1'b0),
                .INIT_Q2(1'b0),
                .SRTYPE("ASYNC")
            ) RDDATA_DDR2_IN (
                .Q1(dq_fall_1d[i]),
                .Q2(dq_rise_1d[i]),
                .C(clkx),
                .CE(1'b1),
                .D(ddr2_dq_idelay[i]),
                .R(reset),
                .S(1'b0)
            );
            IOBUF DDD2_DQ_BUF (
                .O(ddr2_dq_in[i]),
                .IO(ddr2_dq[i]),
                .I(ddr2_out[i]),
                .T(out_tri[i])
            );
        end
    endgenerate
    
    IDELAYCTRL WRDATA_IDELAYCTRL (
        .RDY(),
        .REFCLK(clk),
        .RST(reset)
    );


ODDR, IDDR, IDELAY, IDELAYCTRLプリミティブを使用している。
以前ODDRプリミティブを使用したときにMAPでエラーになるというブログを書いたが、ODDRを"SAME_EDGE"モードを使用するとそうなるようだ。"OPPOSITE_MODE"を使用するとMAPは通った。(ISE9.2iSP4)
IDDRは"SAME_EDGE_PIPELINED"で使用している。これで以前のクロックの位置合わせをする dq_fall_1d, dq_rise_1d までもIDDRに取り込める。
この結果、インプリメントしてFPGA Editorで見てみると、ちゃんとIOBに入っている。下の図はddr2_dq<0>のIOB。
ddr2_implement_1_080211.png

そのILOGICを下に示す。
ddr2_implement_2_080211.png

IDDRを"SAME_EDGE_PIPELINED"で使用して、IDELAYを使用しているのが見て取れる。
次にOLOGIC内のODDRを見てみよう。
ddr2_implement_3_080211.png

Outputバッファのイネーブルと出力用のODDRを使用している。これでDQは大丈夫そうだ。
次にDQSはトライステート・イネーブル用FFと出力用のODDRのクロックが違うので、OLOGIC内には入らない。そこで、Floorplannerで、すぐ近くに配線することにした。
ddr2_implement_4_080211.png

これでインプリメントしてみたが、controller.vのパスとdqs_enable_3dがクリティカルパスになっている。
ddr2_implement_5_080211.png

dqs_enable_3dは”DDR2 SDRAMコントローラのインプリメントテスト2(動作周波数の確保2)”の方法で回避するが、controller.vのパスはRouterにさらにがんばってもらおうと思う。今でもプロパティは最高なので、コストテーブルを変えてみることにする。
このFPGAで、このcontroller.vでは限界が近そうだ。どうしてもだめだったら、アーキテクチャを変えるか、さらに速いデバイスにする必要がありそうだ。
  1. 2008年02月11日 21:25 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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