blob: 19234909e787e604714f9066251757facacd4bf1 [file] [log] [blame] [edit]
`default_nettype none
module plle2_test
(
input wire CLK,
input wire RST,
output wire CLKFBOUT,
input wire CLKFBIN,
input wire I_PWRDWN,
input wire I_CLKINSEL,
output wire O_LOCKED,
output wire [5:0] O_CNT
);
// "INTERNAL" - PLL's internal feedback
// "BUF" - Feedback through a BUFG
// "EXTERNAL" - Feedback external to the FPGA chip (use CLKFB* ports)
parameter FEEDBACK = "INTERNAL";
// ============================================================================
// Input clock divider (to get different clkins)
wire clk100;
reg clk50;
assign clk100 = CLK;
always @(posedge clk100)
clk50 <= !clk50;
wire clk50_bufg;
BUFG bufgctrl (.I(clk50), .O(clk50_bufg));
// ============================================================================
// The PLL
wire clk_fb_o;
wire clk_fb_i;
wire [5:0] clk;
wire [5:0] gclk;
PLLE2_ADV #
(
.BANDWIDTH ("HIGH"),
.COMPENSATION ("ZHOLD"),
.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),
*/
.CLKFBOUT_MULT (16),
.CLKFBOUT_PHASE (0),
.CLKOUT0_DIVIDE (16),
.CLKOUT0_DUTY_CYCLE (53125),
.CLKOUT0_PHASE (45000),
.CLKOUT1_DIVIDE (32),
.CLKOUT1_DUTY_CYCLE (50000),
.CLKOUT1_PHASE (90000),
.CLKOUT2_DIVIDE (48),
.CLKOUT2_DUTY_CYCLE (50000),
.CLKOUT2_PHASE (135000),
.CLKOUT3_DIVIDE (64),
.CLKOUT3_DUTY_CYCLE (50000),
.CLKOUT3_PHASE (-45000),
.CLKOUT4_DIVIDE (80),
.CLKOUT4_DUTY_CYCLE (50000),
.CLKOUT4_PHASE (-90000),
.CLKOUT5_DIVIDE (96),
.CLKOUT5_DUTY_CYCLE (50000),
.CLKOUT5_PHASE (-135000),
.STARTUP_WAIT ("FALSE")
)
pll
(
.CLKIN1 (clk50_bufg),
.CLKIN2 (clk100),
.CLKINSEL (I_CLKINSEL),
.RST (RST),
.PWRDWN (I_PWRDWN),
.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])
);
generate if (FEEDBACK == "INTERNAL") begin
assign clk_fb_i = clk_fb_o;
end else if (FEEDBACK == "BUFG") begin
BUFG clk_fb_buf (.I(clk_fb_o), .O(clk_fb_i));
end else if (FEEDBACK == "EXTERNAL") begin
assign CLKFBOUT = clk_fb_o;
assign clk_fb_i = CLKFBIN;
end endgenerate
// ============================================================================
// Counters
wire rst = RST || !O_LOCKED;
genvar i;
generate for (i=0; i<6; i=i+1) begin
BUFG bufg(.I(clk[i]), .O(gclk[i]));
reg [23:0] counter;
always @(posedge gclk[i] or posedge rst)
if (rst) counter <= 0;
else counter <= counter + 1;
assign O_CNT[i] = counter[21];
end endgenerate
endmodule