commit
						c036363d8f
					
				@ -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