blob: c2a34f4c017be3b16ec380331f36be8e708dd806 [file] [log] [blame] [edit]
`default_nettype none
`define CLKFBOUT_MULT 2
// ============================================================================
module top
(
input wire clk,
input wire rst,
input wire [1:0] sw,
output wire [9:0] led,
);
// ============================================================================
// Clock & reset
reg [3:0] rst_sr;
initial rst_sr <= 4'hF;
wire CLK;
BUFG bufg(.I(clk), .O(CLK));
always @(posedge CLK)
if (rst)
rst_sr <= 4'hF;
else
rst_sr <= rst_sr >> 1;
wire RST = rst_sr[0];
// ============================================================================
// Clocks for ISERDES
wire PRE_BUFG_SYSCLK;
wire PRE_BUFG_CLKDIV;
wire PRE_BUFG_REFCLK;
wire SYSCLK;
wire CLKDIV;
wire REFCLK;
wire clk_fb_i;
wire clk_fb_o;
PLLE2_ADV #(
.BANDWIDTH ("HIGH"),
.COMPENSATION ("ZHOLD"),
.CLKIN1_PERIOD (10.0), // 100MHz
.CLKFBOUT_MULT (`CLKFBOUT_MULT),
.CLKOUT0_DIVIDE (`CLKFBOUT_MULT / 2), // SYSCLK, 200MHz (Fast clock)
.CLKOUT1_DIVIDE ((`CLKFBOUT_MULT * 4) / 2), // CLKDIV, 50MHz (Slow clock)
.CLKOUT2_DIVIDE (`CLKFBOUT_MULT / 2), // REFCLK (IDELAYCTRL), 200 MHz
.STARTUP_WAIT ("FALSE"),
.DIVCLK_DIVIDE (1'd1)
)
pll
(
.CLKIN1 (CLK),
.CLKINSEL (1),
.RST (RST),
.PWRDWN (0),
.CLKFBIN (clk_fb_i),
.CLKFBOUT (clk_fb_o),
.CLKOUT0 (PRE_BUFG_SYSCLK),
.CLKOUT1 (PRE_BUFG_CLKDIV),
.CLKOUT2 (PRE_BUFG_REFCLK)
);
BUFG bufg_clk(.I(PRE_BUFG_SYSCLK), .O(SYSCLK));
BUFG bufg_clkdiv(.I(PRE_BUFG_CLKDIV), .O(CLKDIV));
BUFG bufg_refclk(.I(PRE_BUFG_REFCLK), .O(REFCLK));
IDELAYCTRL idelayctrl_1 (
.REFCLK(REFCLK)
);
IDELAYCTRL idelayctrl_2 (
.REFCLK(REFCLK)
);
assign led[0] = 0;
assign led[1] = 0;
wire OUTPUTS[7:0];
// ISERDES reset generator
wire i_rstdiv;
// First ISERDES/IDELAY bank
wire DDLY_1;
IDELAYE2 #
(
.IDELAY_TYPE ("FIXED"),
.DELAY_SRC ("IDATAIN"),
.IDELAY_VALUE (5'd31)
)
idelay_1
(
.C (SYSCLK),
.CE (1'b1),
.LD (1'b1),
.INC (1'b1),
.IDATAIN (sw[0]),
.DATAOUT (DDLY_1)
);
ISERDESE2 #
(
.DATA_RATE ("SDR"),
.DATA_WIDTH (3'd4),
.INTERFACE_TYPE ("NETWORKING"),
.NUM_CE (2)
)
iserdes_1
(
.CLK (SYSCLK),
.CLKB (SYSCLK),
.CLKDIV (CLKDIV),
.CE1 (1'b1),
.CE2 (1'b1),
.RST (RST),
.DDLY (DDLY_1),
.Q1 (led[5]),
.Q2 (led[4]),
.Q3 (led[3]),
.Q4 (led[2]),
);
// Second ISERDES/IDELAY bank
wire DDLY_2;
IDELAYE2 #
(
.IDELAY_TYPE ("FIXED"),
.DELAY_SRC ("IDATAIN"),
.IDELAY_VALUE (5'd31)
)
idelay_2
(
.C (SYSCLK),
.CE (1'b1),
.LD (1'b1),
.INC (1'b1),
.IDATAIN (sw[1]),
.DATAOUT (DDLY_2)
);
ISERDESE2 #
(
.DATA_RATE ("SDR"),
.DATA_WIDTH (3'd4),
.INTERFACE_TYPE ("NETWORKING"),
.NUM_CE (2)
)
iserdes_2
(
.CLK (SYSCLK),
.CLKB (SYSCLK),
.CLKDIV (CLKDIV),
.CE1 (1'b1),
.CE2 (1'b1),
.RST (RST),
.DDLY (DDLY_2),
.Q1 (led[9]),
.Q2 (led[8]),
.Q3 (led[7]),
.Q4 (led[6]),
);
endmodule