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¥³¥ó¥È¥í¡¼¥é¤Î¥¤¥ó¥×¥ê¥á¥ó¥È¥Æ¥¹¥È£²¡Êưºî¼þÇÈ¿ô¤Î³ÎÊÝ£²¡Ë¡É¤ÎÊýË¡¤Ç²óÈò¤¹¤ë¤¬¡¢controller.v¤Î¥Ñ¥¹¤ÏRouter¤Ë¤µ¤é¤Ë¤¬¤ó¤Ð¤Ã¤Æ¤â¤é¤ª¤¦¤È»×¤¦¡£º£¤Ç¤â¥×¥í¥Ñ¥Æ¥£¤ÏºÇ¹â¤Ê¤Î¤Ç¡¢¥³¥¹¥È¥Æ¡¼¥Ö¥ë¤òÊѤ¨¤Æ¤ß¤ë¤³¤È¤Ë¤¹¤ë¡£
¤³¤ÎFPGA¤Ç¡¢¤³¤Îcontroller.v¤Ç¤Ï¸Â³¦¤¬¶á¤½¤¦¤À¡£¤É¤¦¤·¤Æ¤â¤À¤á¤À¤Ã¤¿¤é¡¢¥¢¡¼¥­¥Æ¥¯¥Á¥ã¤òÊѤ¨¤ë¤«¡¢¤µ¤é¤Ë®¤¤¥Ç¥Ð¥¤¥¹¤Ë¤¹¤ëɬÍפ¬¤¢¤ê¤½¤¦¤À¡£

COMMENT




 

.

TRACKBACK http://marsee101.blog19.fc2.com/tb.php/733-c7215987