The clocking wizard is stupid. It's usually a lot easier to just instantiate the clocking primitives yourself, once you've taken the time to read about them in the appropriate UG. They may look scary and imposing -- and they are complicated -- but I'll take that any day over the... arbitrariness... of that dumb wizard. (Who thought it was a good idea for that thing to "automatically" choose PLL vs DCM, anyway?)
Here's some old production-ish code of mine that instantiates a PLL to double an input clock for handling DDR data coming in from an ADC. The actual problem was handling some misrouting of clock signals (do not route clocks into non-clock-capable input pads for no reason!) that was fixed on the next spin of this board, so the details are weird and not worth copying, but it shows that manual instantiation of the clocking primitives from VHDL isn't that painful. This particular example also includes manual instantiation of the PLL feedback and output buffers. I don't think that is usually needed, but cleaning up this particular routing mess was... not pleasant. This style also has the decided advantage of version controlling much better than anything the wizard ever does!
--Use a PLL to generate a DCO-derived doubled clock (for DDR sampling) and
-- divided clock (for clock domain intermediate to fabric and for SERDES
-- strobes)
u_dco_pll : PLL_BASE
generic map (
BANDWIDTH => "OPTIMIZED",
COMPENSATION => "SOURCE_SYNCHRONOUS",
CLK_FEEDBACK => "CLKOUT0",
DIVCLK_DIVIDE => 1,
CLKFBOUT_MULT => 2,
CLKOUT0_DIVIDE => 2,
CLKOUT2_DIVIDE => 12,
--VCO frequency: 576MHz
CLKIN_PERIOD => 6.9444, --144MHz
REF_JITTER => 0.1000 --pulled out of nowhere
)
port map (
--input clocks
clkin => clk_dco_in_buf,
clkfbin => pll_feedback_return,
--output clocks
clkout0 => clk_dco_double, -- 288 MHz: DDR DCO clock
--clkout1 => clk_dco_pll, -- 144 MHz: DCO clock clone
clkout2 => pll_48MHz, -- 48 MHz: double the fabric clock
-- control & status
rst => pll_reset,
locked => pll_is_locked
);
u_bufg_48mhz : BUFG
port map (
i => pll_48MHz,
o => clk_intermediate
);
u_dco_pll_feedback : BUFIO2FB
generic map (
DIVIDE_BYPASS => TRUE
)
port map (
i => clk_dcoddr_bank0,
o => pll_feedback_return
);
bank0_dco_bufpll: BUFPLL
generic map (
DIVIDE => 6,
ENABLE_SYNC => TRUE
)
port map (
pllin => clk_dco_double,
gclk => clk_intermediate,
locked => pll_is_locked,
ioclk => clk_dcoddr_bank0,
serdesstrobe => clk_dcostrobe_bank0,
lock => bufpll_bank0_is_locked
);