FC2カウンター FPGAの部屋 DDR2 SDRAMコントローラのインプリメントテスト(動作周波数の確保)
FC2ブログ

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

FPGAの部屋

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

DDR2 SDRAMコントローラのインプリメントテスト(動作周波数の確保)

DDR2 SDRAMコントローラのインプリメントテストにはまっている。
動作周波数が予定の200MHzを満足できなかった。原因はIOBの出力用のDDRレジスタに入れるところで、組み合わせ回路を入れるとその組み合わせ回路分のディレイがクリティカルパスになってしまったからだ。前のレジスタとIOBの出力用のDDRレジスタのサンプルクロックは半クロックずれていて、必要な遅延時間は5ns/2 = 2.5ns なので特に厳しい。
以前は下のような記述だった。

    // Insantiate three-state DDR registers
    assign dq_tri_d0 = dqs_reset_3d_dqtri | not_dqs_enable_3d;
    assign dq_tri_d1 = not_dqs_enable_3d;
    
    generate
    genvar j;
        for (j=DDR2_DATA_WIDTH-1; j>=0; j=j-1) begin: WRDATA_TRI
            FDDRRSE WRDATA_DDR2_TRI (
                .Q(out_tri[j]),
                .D0(dq_tri_d0[j/8]), // DQSが0になる最初のクロックで1なので、一番最初の半クロックだけディスエーブル
                .D1(dq_tri_d1[j/8]),
                .C0(clk),
                .C1(clkx),
                .CE(vcc),
                .R(reset),
                .S(gnd)
            );
        end
    endgenerate


dq_tri_d0とdq_tri_d1が組み合わせ回路出力では遅延時間が満足できなかったので、1クロック前の信号からとって、組み合わせ回路を作り、それを1クロック遅延した。
このように。。。

    // Insantiate three-state DDR registers, 組み合わせ回路があると間に合わないので、いったんラッチする
    assign dq_tri_d0_b = dqs_reset_2d_dqtri | not_dqs_enable_2d;
    assign dq_tri_d1_b = not_dqs_enable_2d;
    always @(posedge clkx) begin
        if (reset) begin
            dq_tri_d0 <= {DDR2_DQS_DM_WIDTH*8{1'b1}};
            dq_tri_d1 <= {DDR2_DQS_DM_WIDTH*8{1'b1}};
        end else begin
            dq_tri_d0 <= dq_tri_d0_b;
            dq_tri_d1 <= dq_tri_d1_b;
        end
    end
    
    generate
    genvar j;
        for (j=DDR2_DATA_WIDTH-1; j>=0; j=j-1) begin: WRDATA_TRI
            FDDRRSE WRDATA_DDR2_TRI (
                .Q(out_tri[j]),
                .D0(dq_tri_d0[j/8]), // DQSが0になる最初のクロックで1なので、一番最初の半クロックだけディスエーブル
                .D1(dq_tri_d1[j/8]),
                .C0(clk),
                .C1(clkx),
                .CE(vcc),
                .R(reset),
                .S(gnd)
            );
        end
    endgenerate


Timing Analyzerの遅延時間をとってなかったので、どのくらい遅延時間の予定値を外れていたか?忘れてしまったが、大して外れていなかったと思う。100psとか、数100psだったと思う。
動作周波数を満足するのは難しい。いろいろ試行錯誤をしている。
もう1箇所、クリティカルパスになってしまって、遅延時間が延びてしまったところがあった。そのために、もう1つテクニック?を使ったが、それはまたの機会に。。。
  1. 2008年01月31日 05:13 |
  2. DDR SDRAMコントローラ
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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