Add and use plle2 primitive for nexys boards
authorOlof Kindgren <olof.kindgren@gmail.com>
Sat, 24 Aug 2019 09:25:21 +0000 (11:25 +0200)
committerOlof Kindgren <olof.kindgren@gmail.com>
Mon, 26 Aug 2019 11:44:50 +0000 (13:44 +0200)
fpga/clk_gen_plle2.vhd [new file with mode: 0644]
microwatt.core

diff --git a/fpga/clk_gen_plle2.vhd b/fpga/clk_gen_plle2.vhd
new file mode 100644 (file)
index 0000000..57e4fe9
--- /dev/null
@@ -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;
index 1abc5584e0e2ffa92dad838b0c494839aa018d1d..7263794f6da2629aac0640dbbec17e5ef35620b8 100644 (file)
@@ -42,12 +42,12 @@ filesets:
   nexys_a7:
     files:
       - fpga/nexys_a7.xdc : {file_type : xdc}
-      - fpga/clk_gen_bypass.vhd : {file_type : vhdlSource-2008}
+      - fpga/clk_gen_plle2.vhd : {file_type : vhdlSource-2008}
 
   nexys_video:
     files:
       - fpga/nexys-video.xdc : {file_type : xdc}
-      - fpga/clk_gen_bypass.vhd : {file_type : vhdlSource-2008}
+      - fpga/clk_gen_plle2.vhd : {file_type : vhdlSource-2008}
 
 targets:
   nexys_a7: