|  | `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 |