blob: f3ee30150ebdba3cfec02be0be7f85f126b47d09 [file] [log] [blame]
`default_nettype none
module plle2_test
(
input wire CLK,
input wire RST,
input wire I_CLKINSEL,
output wire O_LOCKED,
output wire [5:0] O_CNT
);
// ============================================================================
// Input clock divider (to get different clkins)
wire clk100;
reg clk50;
assign clk100 = CLK;
always @(posedge clk100)
clk50 <= !clk50;
// ============================================================================
// The PLL
wire clk_fb_o;
wire clk_fb_i;
wire [5:0] clk;
PLLE2_ADV #
(
.BANDWIDTH ("HIGH"),
.COMPENSATION ("BUF_IN"),
.CLKIN1_PERIOD (20.0), // 50MHz
.CLKIN2_PERIOD (10.0), // 100MHz
.CLKFBOUT_MULT (16),
.CLKFBOUT_PHASE (0.0),
.CLKOUT0_DIVIDE (16),
.CLKOUT0_DUTY_CYCLE (0.53125),
.CLKOUT0_PHASE (45.0),
.CLKOUT1_DIVIDE (32),
.CLKOUT1_DUTY_CYCLE (0.5),
.CLKOUT1_PHASE (90.0),
.CLKOUT2_DIVIDE (48),
.CLKOUT2_DUTY_CYCLE (0.5),
.CLKOUT2_PHASE (135.0),
.CLKOUT3_DIVIDE (64),
.CLKOUT3_DUTY_CYCLE (0.5),
.CLKOUT3_PHASE (-45.0),
.CLKOUT4_DIVIDE (80),
.CLKOUT4_DUTY_CYCLE (0.5),
.CLKOUT4_PHASE (-90.0),
.CLKOUT5_DIVIDE (96),
.CLKOUT5_DUTY_CYCLE (0.5),
.CLKOUT5_PHASE (-135.0),
.STARTUP_WAIT ("FALSE")
)
pll
(
.CLKIN1 (clk50),
.CLKIN2 (clk100),
.CLKINSEL (I_CLKINSEL),
.RST (RST),
.LOCKED (O_LOCKED),
.CLKFBIN (clk_fb_i),
.CLKFBOUT (clk_fb_o),
.CLKOUT0 (clk[0]),
.CLKOUT1 (clk[1]),
.CLKOUT2 (clk[2]),
.CLKOUT3 (clk[3]),
.CLKOUT4 (clk[4]),
.CLKOUT5 (clk[5])
);
BUFG clk_fb_buf (.I(clk_fb_o), .O(clk_fb_i));
// ============================================================================
// Counters
wire rst = RST || !O_LOCKED;
genvar i;
generate for (i=0; i<6; i=i+1) begin
reg [23:0] counter;
always @(posedge clk[i] or posedge rst)
if (rst) counter <= 0;
else counter <= counter + 1;
assign O_CNT[i] = counter[21];
end endgenerate
endmodule