FC2カウンター FPGAの部屋 OSERDESとISERDESその後
FC2ブログ

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

FPGAの部屋

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

OSERDESとISERDESその後

先週、今週はパソコンのリプレース、プロバイダの乗換えなど、いろいろイベントがあってなかなか進まなかったが、DDR2 SDRAMコントローラ関連のOSERDESとISERDESの問題にはまっている。
どうも最後でPlace & Routeで配線できないと言われてエラーになってしまう。
こんな感じ。

ERROR:Route:472 - 
   This design is unrouteable.
   To evaluate the problem please use fpga_editor.
Routing Conflict 1: 
    Net:GLOBAL_LOGIC0 on pin SR on location OLOGIC_X0Y111 
    Net:SYS_RST_IBUF_1 on pin SR on location ILOGIC_X0Y111 
    Conflict detected on wire: PINFEED(-63835,80448)

Routing Conflict 2: 
    Net:GLOBAL_LOGIC0 on pin SR on location OLOGIC_X0Y113 
    Net:SYS_RST_IBUF_1 on pin SR on location ILOGIC_X0Y113 
    Conflict detected on wire: PINFEED(-63835,84320)


どうやらSR(リセット)ピンがOSERDESとISERDESで違っているのがだめなのか?
DQS付近の入出力用ソースはこの辺。

    // Instantiate DQS DDR registers
    generate
    genvar n;
        for (n=DDR2_DQS_DM_WIDTH-1; n>=0; n=n-1) begin: WRDATA_DQS
            OSERDES # (
                .DATA_RATE_OQ("DDR"),
                .DATA_RATE_TQ("DDR"),
                .DATA_WIDTH(4),
                .INIT_OQ(1'b0),
                .INIT_TQ(1'b1),
                .SERDES_MODE("MASTER"),
                .SRVAL_OQ(1'b0),
                .SRVAL_TQ(1'b1),
                .TRISTATE_WIDTH(4)
            ) WRDATA_DDR2_OUT (
                .OQ(dqs_oq[n]),
                .SHIFTOUT1(),
                .SHIFTOUT2(),
                .TQ(dqs_tq[n]),
                .CLK(clk),
                .CLKDIV(clk100MHz),
                .D1(dqs_oserdes_d_1d[n*4]),
                .D2(dqs_oserdes_d_1d[n*4+1]),
                .D3(dqs_oserdes_d_1d[n*4+2]),
                .D4(dqs_oserdes_d_1d[n*4+3]),
                .D5(),
                .D6(),
                .OCE(1'b1),
                .REV(1'b0),
                .SHIFTIN1(1'b0),
                .SHIFTIN2(1'b0),
                // .SR(dqs_reset_3d[n]),
                .SR(1'b0),
                .T1(dqs_oserdes_t_1d[n*4]),
                .T2(dqs_oserdes_t_1d[n*4+1]),
                .T3(dqs_oserdes_t_1d[n*4+2]),
                .T4(dqs_oserdes_t_1d[n*4+3]),
                .TCE(1'b1)
            );
            
             ISERDES #(
                .BITSLIP_ENABLE("TRUE"),
                .DATA_RATE("DDR"),
                .DATA_WIDTH(4),
                .INTERFACE_TYPE("NETWORKING"),
                .IOBDELAY("IFD"),
                .IOBDELAY_TYPE("FIXED"),
                .IOBDELAY_VALUE(32),
                .NUM_CE(1),
                .SERDES_MODE("MASTER")
            ) DQS_DDR2_IN (
                 .O(ddr2_dqsin_out[n]),
                 .Q1(), 
                 .Q2(), 
                 .Q3(), 
                 .Q4(), 
                 .Q5(), 
                 .Q6(), 
                 .SHIFTOUT1(), 
                 .SHIFTOUT2(),
                 .BITSLIP(1'b0),
                 .CE1(1'b1), 
                 .CE2(1'b1),
                 .CLK(1'b0),
                 .CLKDIV(1'b0),
                 .D(ddr2_dqsin[n]),
                 .DLYCE(1'b0),
                 .DLYINC(1'b0),
                 .DLYRST(1'b0),
                 .OCLK(1'b0), 
                 .REV(1'b0),  
                 .SHIFTIN1(1'b0), 
                 .SHIFTIN2(1'b0),
                 .SR(reset)
              );
             
             BUFIO DQS_DDR2_IN_BUFIO (
                .I(ddr2_dqsin_out[n]),
                .O(ddr2_dqsin_bufio[n])
            );
            
            IOBUF DDD2_DQS_BUF (
                .O(ddr2_dqsin[n]),
                .IO(ddr2_dqs[n]),
                .I(dqs_oq[n]),
                .T(dqs_tq[n])
            );
        end
    endgenerate


.SR(1'b0) と .SR(reset) の違いがある。これをどちらも .SR(reset) にしてみた。
そうするとやはり、このコンフリクトはなくなったが、まだ後、18個のコンフリクトを解消する必要がある。

次は、下のコンフリクト。

Routing Conflict 1: 
    Net:ddr2_sdram_cont_inst/clk90 on pin CLK on location OLOGIC_X0Y97 
    Net:clk on pin OCLK on location ILOGIC_X0Y97 
    Conflict detected on wire: BOUNCEIN(-63349,57088)


これはDQのclk90 と clk がコンフリクトしているようだ。DQのISERDESのOCLK と CLKDIV は clkネットがつながっていて、OSERDESのCLKには clk270 がつながっていた。どうやら、これらのピンは同じクロックがつながっている必要がありようだ。
事実、XAPP721 ISERDES と OSERDES を使用した高性能DDR2 SDRAM インターフェイスを見ても、ISERDESのOCLK と CLKDIV、OSERDESのCLKには同じ CLKfast_90 がつながっている。やはり、配線がこれしかないのだろう。
これで、Place & Route は通ったが、タイミング制約が満足していない。クロックを変更してしまったので、タイミングダイアグラムをもう一度考察する必要が出てきてしまったし。。。

今日の教訓、OSERDES, ISERDESの決まりごと
1.OSERDESとISERDESのSRには同じリセット信号をつなぐ。
2.ISERDESのOCLK と CLKDIV、OSERDESのCLKには同じクロックを入力する。


注:コンフリクトの方がclk90 なのに、なぜclk270 の話になるのかというと、グローバルバッファを削減するためにclk270 は ~clk90として定義してあるからです。
assign clk270 = ~clk90;
  1. 2008年07月11日 04:30 |
  2. Virtex4のお勉強
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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