forked from cores/microwatt
				
			Add and use plle2 primitive for nexys boards
							parent
							
								
									8bc3e8ea0a
								
							
						
					
					
						commit
						12327034d6
					
				@ -0,0 +1,71 @@
 | 
			
		||||
library ieee;
 | 
			
		||||
use ieee.std_logic_1164.all;
 | 
			
		||||
 | 
			
		||||
Library UNISIM;
 | 
			
		||||
use UNISIM.vcomponents.all;
 | 
			
		||||
 | 
			
		||||
entity clock_generator is
 | 
			
		||||
  generic (
 | 
			
		||||
    clk_period_hz : positive := 100000000);
 | 
			
		||||
  port (
 | 
			
		||||
    clk        : in  std_logic;
 | 
			
		||||
    resetn     : in  std_logic;
 | 
			
		||||
    system_clk : out std_logic;
 | 
			
		||||
    locked     : out std_logic);
 | 
			
		||||
end entity clock_generator;
 | 
			
		||||
 | 
			
		||||
architecture rtl of clock_generator is
 | 
			
		||||
 | 
			
		||||
  signal clkfb : std_ulogic;
 | 
			
		||||
 | 
			
		||||
  type pll_settings_t is record
 | 
			
		||||
    clkin_period  : real    range 0.000 to 52.631;
 | 
			
		||||
    clkfbout_mult : integer range 2 to 64;
 | 
			
		||||
    clkout_divide : integer range 1 to 128;
 | 
			
		||||
    divclk_divide : integer range 1 to 56;
 | 
			
		||||
  end record pll_settings_t;
 | 
			
		||||
 | 
			
		||||
  function gen_pll_settings (
 | 
			
		||||
    constant freq_hz : positive)
 | 
			
		||||
    return pll_settings_t is
 | 
			
		||||
  begin
 | 
			
		||||
    if freq_hz = 100000000 then
 | 
			
		||||
      return (clkin_period  => 10.0,
 | 
			
		||||
              clkfbout_mult => 16,
 | 
			
		||||
              clkout_divide => 32,
 | 
			
		||||
              divclk_divide => 1);
 | 
			
		||||
    else
 | 
			
		||||
      report "Unsupported input frequency" severity failure;
 | 
			
		||||
--      return (clkin_period  => 0.0,
 | 
			
		||||
--              clkfbout_mult => 0,
 | 
			
		||||
--              clkout_divide => 0,
 | 
			
		||||
--              divclk_divide => 0);
 | 
			
		||||
    end if;
 | 
			
		||||
  end function gen_pll_settings;
 | 
			
		||||
 | 
			
		||||
  constant pll_settings : pll_settings_t := gen_pll_settings(clk_period_hz);
 | 
			
		||||
begin
 | 
			
		||||
 | 
			
		||||
  pll : PLLE2_BASE
 | 
			
		||||
    generic map (
 | 
			
		||||
      BANDWIDTH          => "OPTIMIZED",
 | 
			
		||||
      CLKFBOUT_MULT      => pll_settings.clkfbout_mult,
 | 
			
		||||
      CLKIN1_PERIOD      => pll_settings.clkin_period,
 | 
			
		||||
      CLKOUT0_DIVIDE     => pll_settings.clkout_divide,
 | 
			
		||||
      DIVCLK_DIVIDE      => pll_settings.divclk_divide,
 | 
			
		||||
      STARTUP_WAIT       => "FALSE")
 | 
			
		||||
    port map (
 | 
			
		||||
      CLKOUT0  => system_clk,
 | 
			
		||||
      CLKOUT1  => open,
 | 
			
		||||
      CLKOUT2  => open,
 | 
			
		||||
      CLKOUT3  => open,
 | 
			
		||||
      CLKOUT4  => open,
 | 
			
		||||
      CLKOUT5  => open,
 | 
			
		||||
      CLKFBOUT => clkfb,
 | 
			
		||||
      LOCKED   => locked,
 | 
			
		||||
      CLKIN1   => clk,
 | 
			
		||||
      PWRDWN   => '0',
 | 
			
		||||
      RST      => not resetn,
 | 
			
		||||
      CLKFBIN  => clkfb);
 | 
			
		||||
 | 
			
		||||
end architecture rtl;
 | 
			
		||||
					Loading…
					
					
				
		Reference in New Issue