--- /dev/null
+library ieee;
+use ieee.std_logic_1164.all;
+
+Library UNISIM;
+use UNISIM.vcomponents.all;
+
+entity clock_generator is
+ generic (
+ clk_period_hz : positive := 12000000);
+ port (
+ ext_clk : in std_logic;
+ pll_rst_in : in std_logic;
+ pll_clk_out : out std_logic;
+ pll_locked_out : 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 10.000 to 800.0;
+ clkfbout_mult : real range 2.0 to 64.0;
+ clkout_divide : real range 1.0 to 128.0;
+ divclk_divide : integer range 1 to 106;
+ 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.0,
+ clkout_divide => 32.0,
+ divclk_divide => 1);
+ elsif freq_hz = 12000000 then
+ return (clkin_period => 83.33,
+ clkfbout_mult => 50.0,
+ clkout_divide => 12.0,
+ divclk_divide => 1);
+ else
+ report "Unsupported input frequency" severity failure;
+ end if;
+ end function gen_pll_settings;
+
+ constant pll_settings : pll_settings_t := gen_pll_settings(clk_period_hz);
+begin
+ pll : MMCME2_BASE
+ generic map (
+ BANDWIDTH => "OPTIMIZED",
+ CLKFBOUT_MULT_F => pll_settings.clkfbout_mult,
+ CLKIN1_PERIOD => pll_settings.clkin_period,
+ CLKOUT0_DIVIDE_F => pll_settings.clkout_divide,
+ DIVCLK_DIVIDE => pll_settings.divclk_divide,
+ STARTUP_WAIT => FALSE)
+ port map (
+ CLKFBOUT => clkfb,
+ CLKFBOUTB => open,
+ CLKOUT0 => pll_clk_out,
+ CLKOUT0B => open,
+ CLKOUT1 => open,
+ CLKOUT1B => open,
+ CLKOUT2 => open,
+ CLKOUT2B => open,
+ CLKOUT3 => open,
+ CLKOUT3B => open,
+ CLKOUT4 => open,
+ CLKOUT5 => open,
+ CLKOUT6 => open,
+ LOCKED => pll_locked_out,
+ CLKFBIN => clkfb,
+ CLKIN1 => ext_clk,
+ PWRDWN => '0',
+ RST => pll_rst_in
+ );
+end architecture rtl;
--- /dev/null
+## Clock signal 12 MHz
+set_property -dict { PACKAGE_PIN L17 IOSTANDARD LVCMOS33 } [get_ports { ext_clk }];
+create_clock -add -name sys_clk_pin -period 83.33 -waveform {0 41.66} [get_ports {ext_clk}];
+
+set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { uart0_txd }];
+set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { uart0_rxd }];
+
+set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVCMOS33 } [get_ports { ext_rst }];
- fpga/arty_a7-35.xdc : {file_type : xdc}
- fpga/clk_gen_plle2.vhd : {file_type : vhdlSource-2008}
+ cmod_a7-35:
+ files:
+ - fpga/cmod_a7-35.xdc : {file_type : xdc}
+ - fpga/clk_gen_mcmm.vhd : {file_type : vhdlSource-2008}
targets:
nexys_a7:
vivado: {part : xc7a35ticsg324-1L}
toplevel : toplevel
+ cmod_a7-35:
+ default_tool: vivado
+ filesets: [core, cmod_a7-35, soc]
+ parameters : [memory_size, ram_init_file, reset_low=false]
+ tools:
+ vivado: {part : xc7a35tcpg236-1}
+ toplevel : toplevel
+
synth:
filesets: [core]
tools:
datatype : file
description : Initial on-chip RAM contents
paramtype : generic
+
+ reset_low:
+ datatype : bool
+ description : External reset button polarity
+ paramtype : generic