-/*
- * Generate clk4x_rd. This clock is sourced from clk2x_90.
- * An IODELAY2 element is included in the path of this clock so that
- * any variation in IDELAY element's base delay is compensated when this clock
- * is used to capture read data which also goes through IDELAY element.
- */
-
-wire rd_clk_out;
-
-ODDR2 #(
- .DDR_ALIGNMENT("C0"),
- .INIT(1'b0),
- .SRTYPE("ASYNC")
-) rd_clk_out_inst (
- .Q(rd_clk_out),
- .C0(clk2x_90),
- .C1(~clk2x_90),
- .CE(1'b1),
- .D0(1'b1),
- .D1(1'b0),
- .R(1'b0),
- .S(1'b0)
-);
-
-wire rd_clk_out_oe_n;
-
-ODDR2 #(
- .DDR_ALIGNMENT("C0"),
- .INIT(1'b0),
- .SRTYPE("ASYNC")
-) rd_clk_out_oe_inst (
- .Q(rd_clk_out_oe_n),
- .C0(clk2x_90),
- .C1(~clk2x_90),
- .CE(1'b1),
- .D0(1'b0),
- .D1(1'b0),
- .R(1'b0),
- .S(1'b0)
-);
-
-wire rd_clk_fb;
-
-/* Dummy pin used for calibration */
-IOBUF rd_clk_loop_back_inst(
- .O(rd_clk_fb),
- .IO(rd_clk_lb),
- .I(rd_clk_out),
- .T(rd_clk_out_oe_n)
-);
-
-wire rd_clk_fb_dly;
-
-IODELAY2 #(
- .DATA_RATE("DDR"),
- .IDELAY_VALUE(0),
- .IDELAY2_VALUE(0),
- .IDELAY_MODE("NORMAL"),
- .ODELAY_VALUE(0),
- .IDELAY_TYPE("FIXED"),
- .COUNTER_WRAPAROUND("STAY_AT_LIMIT"),
- .DELAY_SRC("IDATAIN"),
- .SERDES_MODE("NONE"),
- .SIM_TAPDELAY_VALUE(49)
-) iodelay_cm (
- .IDATAIN(rd_clk_fb),
- .TOUT(),
- .DOUT(),
- .T(1'b1),
- .ODATAIN(1'b0),
- .DATAOUT(rd_clk_fb_dly),
- .DATAOUT2(),
- .IOCLK0(1'b0),
- .IOCLK1(1'b0),
- .CLK(1'b0),
- .CAL(1'b0),
- .INC(1'b0),
- .CE(1'b0),
- .RST(1'b0),
- .BUSY()
-);
-
-wire rd_clk_fb_dly_bufio;
-
-BUFIO2 #(
- .DIVIDE(1),
- .DIVIDE_BYPASS("FALSE"),
- .I_INVERT("FALSE")
-) bufio2_inst (
- .I(rd_clk_fb_dly),
- .IOCLK(),
- .DIVCLK(rd_clk_fb_dly_bufio),
- .SERDESSTROBE()
-);
-
-wire pll2_lckd;
-wire buf_pll2_fb_out;
-wire pll2out0;
-wire pll2out1;
-
-PLL_ADV #(
- .BANDWIDTH("OPTIMIZED"),
- .CLKFBOUT_MULT(4),
- .CLKFBOUT_PHASE(0.0),
- .CLKIN1_PERIOD(clk2x_period),
- .CLKIN2_PERIOD(clk2x_period),
- .CLKOUT0_DIVIDE(2),
- .CLKOUT0_DUTY_CYCLE(0.5),
- .CLKOUT0_PHASE(0.0),
- .CLKOUT1_DIVIDE(2),
- .CLKOUT1_DUTY_CYCLE(0.5),
- .CLKOUT1_PHASE(0.0),
- .CLKOUT2_DIVIDE(7),
- .CLKOUT2_DUTY_CYCLE(0.5),
- .CLKOUT2_PHASE(0.0),
- .CLKOUT3_DIVIDE(7),
- .CLKOUT3_DUTY_CYCLE(0.5),
- .CLKOUT3_PHASE(0.0),
- .CLKOUT4_DIVIDE(7),
- .CLKOUT4_DUTY_CYCLE(0.5),
- .CLKOUT4_PHASE(0.0),
- .CLKOUT5_DIVIDE(7),
- .CLKOUT5_DUTY_CYCLE (0.5),
- .CLKOUT5_PHASE(0.0),
- .COMPENSATION("INTERNAL"),
- .DIVCLK_DIVIDE(1),
- .REF_JITTER(0.100),
- .CLK_FEEDBACK("CLKFBOUT"),
- .SIM_DEVICE("SPARTAN6")
-) pll2 (
- .CLKFBDCM(),
- .CLKFBOUT(buf_pll2_fb_out),
- .CLKOUT0(pll2out0), /* < x4 clock to capture read data */
- .CLKOUT1(pll2out1), /* < x4 clock to capture read data */
- .CLKOUT2(),
- .CLKOUT3(),
- .CLKOUT4(),
- .CLKOUT5(),
- .CLKOUTDCM0(),
- .CLKOUTDCM1(),
- .CLKOUTDCM2(),
- .CLKOUTDCM3(),
- .CLKOUTDCM4(),
- .CLKOUTDCM5(),
- .DO(),
- .DRDY(),
- .LOCKED(pll2_lckd),
- .CLKFBIN(buf_pll2_fb_out),
- .CLKIN1(rd_clk_fb_dly_bufio),
- .CLKIN2(1'b0),
- .CLKINSEL(1'b1),
- .DADDR(5'b00000),
- .DCLK(1'b0),
- .DEN(1'b0),
- .DI(16'h0000),
- .DWE(1'b0),
- .RST(~pll1_lckd),
- .REL(1'b0)
-);
-
-BUFPLL #(
- .DIVIDE(4)
-) rd_bufpll_left (
- .PLLIN(pll2out0),
- .GCLK(sys_clk),
- .LOCKED(pll2_lckd),
- .IOCLK(clk4x_rd_left),
- .LOCK(),
- .SERDESSTROBE(clk4x_rd_strb_left)
-);
-
-BUFPLL #(
- .DIVIDE(4)
-) rd_bufpll_right (
- .PLLIN(pll2out1),
- .GCLK(sys_clk),
- .LOCKED(pll2_lckd),
- .IOCLK(clk4x_rd_right),
- .LOCK(),
- .SERDESSTROBE(clk4x_rd_strb_right)
-);
-
-wire sdram_sys_clk_lock_d16;
-reg sdram_sys_clk_lock_d17;
-
-/*
- * Async reset generation
- * The reset is de-asserted 16 clocks after both internal clocks are locked.
- */
-
-SRL16 reset_delay_sr(
- .CLK(sys_clk),
- .D(pll1_lckd & pll2_lckd),
- .A0(1'b1),
- .A1(1'b1),
- .A2(1'b1),
- .A3(1'b1),
- .Q(sdram_sys_clk_lock_d16)