SURF  1.0
ClockManagerUltraScale.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : ClockManagerUltraScale.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2015-07-09
5 -- Last update: 2016-08-24
6 -------------------------------------------------------------------------------
7 -- Description: A wrapper over MMCM/PLL to avoid coregen use.
8 -------------------------------------------------------------------------------
9 -- This file is part of 'SLAC Firmware Standard Library'.
10 -- It is subject to the license terms in the LICENSE.txt file found in the
11 -- top-level directory of this distribution and at:
12 -- https://confluence.slac.stanford.edu/display/ppareg/LICENSE.html.
13 -- No part of 'SLAC Firmware Standard Library', including this file,
14 -- may be copied, modified, propagated, or distributed except according to
15 -- the terms contained in the LICENSE.txt file.
16 -------------------------------------------------------------------------------
17 
18 library ieee;
19 use ieee.std_logic_1164.all;
20 use ieee.std_logic_unsigned.all;
21 use ieee.std_logic_arith.all;
22 
23 library unisim;
24 use unisim.vcomponents.all;
25 
26 use work.StdRtlPkg.all;
27 use work.AxiLitePkg.all;
28 
29 --! @see entity
30  --! @ingroup xilinx_UltraScale_general
32  generic (
33  TPD_G : time := 1 ns;
34  TYPE_G : string := "MMCM"; -- or "PLL"
35  INPUT_BUFG_G : boolean := true;
36  FB_BUFG_G : boolean := true;
37  RST_IN_POLARITY_G : sl := '1'; -- '0' for active low
38  NUM_CLOCKS_G : integer range 1 to 7;
40  -- MMCM attributes
41  BANDWIDTH_G : string := "OPTIMIZED";
42  CLKIN_PERIOD_G : real := 10.0; -- Input period in ns );
43  DIVCLK_DIVIDE_G : integer range 1 to 106 := 1;
44  CLKFBOUT_MULT_F_G : real range 1.0 to 64.0 := 1.0;
45  CLKFBOUT_MULT_G : integer range 2 to 64 := 5;
46  CLKOUT0_DIVIDE_F_G : real range 1.0 to 128.0 := 1.0;
47  CLKOUT0_DIVIDE_G : integer range 1 to 128 := 1;
48  CLKOUT1_DIVIDE_G : integer range 1 to 128 := 1;
49  CLKOUT2_DIVIDE_G : integer range 1 to 128 := 1;
50  CLKOUT3_DIVIDE_G : integer range 1 to 128 := 1;
51  CLKOUT4_DIVIDE_G : integer range 1 to 128 := 1;
52  CLKOUT5_DIVIDE_G : integer range 1 to 128 := 1;
53  CLKOUT6_DIVIDE_G : integer range 1 to 128 := 1;
54  CLKOUT0_PHASE_G : real range -360.0 to 360.0 := 0.0;
55  CLKOUT1_PHASE_G : real range -360.0 to 360.0 := 0.0;
56  CLKOUT2_PHASE_G : real range -360.0 to 360.0 := 0.0;
57  CLKOUT3_PHASE_G : real range -360.0 to 360.0 := 0.0;
58  CLKOUT4_PHASE_G : real range -360.0 to 360.0 := 0.0;
59  CLKOUT5_PHASE_G : real range -360.0 to 360.0 := 0.0;
60  CLKOUT6_PHASE_G : real range -360.0 to 360.0 := 0.0;
61  CLKOUT0_DUTY_CYCLE_G : real range 0.01 to 0.99 := 0.5;
62  CLKOUT1_DUTY_CYCLE_G : real range 0.01 to 0.99 := 0.5;
63  CLKOUT2_DUTY_CYCLE_G : real range 0.01 to 0.99 := 0.5;
64  CLKOUT3_DUTY_CYCLE_G : real range 0.01 to 0.99 := 0.5;
65  CLKOUT4_DUTY_CYCLE_G : real range 0.01 to 0.99 := 0.5;
66  CLKOUT5_DUTY_CYCLE_G : real range 0.01 to 0.99 := 0.5;
67  CLKOUT6_DUTY_CYCLE_G : real range 0.01 to 0.99 := 0.5;
68  CLKOUT0_RST_HOLD_G : integer range 3 to positive'high := 3;
69  CLKOUT1_RST_HOLD_G : integer range 3 to positive'high := 3;
70  CLKOUT2_RST_HOLD_G : integer range 3 to positive'high := 3;
71  CLKOUT3_RST_HOLD_G : integer range 3 to positive'high := 3;
72  CLKOUT4_RST_HOLD_G : integer range 3 to positive'high := 3;
73  CLKOUT5_RST_HOLD_G : integer range 3 to positive'high := 3;
74  CLKOUT6_RST_HOLD_G : integer range 3 to positive'high := 3;
82  port (
83  clkIn : in sl;
84  rstIn : in sl := '0';
85  clkOut : out slv(NUM_CLOCKS_G-1 downto 0);
86  rstOut : out slv(NUM_CLOCKS_G-1 downto 0);
87  locked : out sl;
88  -- AXI-Lite Interface
89  axilClk : in sl := '0';
90  axilRst : in sl := '0';
95 end entity ClockManagerUltraScale;
96 
97 architecture rtl of ClockManagerUltraScale is
98 
99  constant RST_HOLD_C : IntegerArray(0 to 6) := (
102 
103  constant RST_POLARITY_C : slv(0 to 6) := (
106 
107  constant CLKOUT0_DIVIDE_F_C : real := ite(CLKOUT0_DIVIDE_F_G = 1.0, real(CLKOUT0_DIVIDE_G), CLKOUT0_DIVIDE_F_G);
108  constant CLKFBOUT_MULT_F_C : real := ite(CLKFBOUT_MULT_F_G = 1.0, real(CLKFBOUT_MULT_G), CLKFBOUT_MULT_F_G);
109 
110  signal rstInLoc : sl;
111  signal clkInLoc : sl;
112  signal lockedLoc : sl;
113  signal clkOutMmcm : slv(6 downto 0);
114  signal clkOutLoc : slv(6 downto 0);
115  signal clkFbOut : sl;
116  signal clkFbIn : sl;
117 
118  signal drpRdy : sl;
119  signal drpEn : sl;
120  signal drpWe : sl;
121  signal drpAddr : slv(6 downto 0);
122  signal drpDi : slv(15 downto 0);
123  signal drpDo : slv(15 downto 0);
124 
125  attribute keep_hierarchy : string;
126  attribute keep_hierarchy of rtl : architecture is "yes";
127 
128 begin
129 
130  assert (TYPE_G = "MMCM" or (TYPE_G = "PLL" and NUM_CLOCKS_G <= 2))
131  report "ClockManager7: Cannot have 2 clocks if TYPE_G is PLL" severity failure;
132 
133  assert(TYPE_G = "MMCM" or TYPE_G = "PLL")
134  report "ClockManger7: TYPE_G must be either MMCM or PLL" severity failure;
135 
136  rstInLoc <= '1' when rstIn = RST_IN_POLARITY_G else '0';
137 
138  U_AxiLiteToDrp : entity work.AxiLiteToDrp
139  generic map (
140  TPD_G => TPD_G,
142  COMMON_CLK_G => true,
143  EN_ARBITRATION_G => false,
144  TIMEOUT_G => 4096,
145  ADDR_WIDTH_G => 7,
146  DATA_WIDTH_G => 16)
147  port map (
148  -- AXI-Lite Port
149  axilClk => axilClk,
150  axilRst => axilRst,
155  -- DRP Interface
156  drpClk => axilClk,
157  drpRst => axilRst,
158  drpRdy => drpRdy,
159  drpEn => drpEn,
160  drpWe => drpWe,
161  drpAddr => drpAddr,
162  drpDi => drpDi,
163  drpDo => drpDo);
164 
165  MmcmGen : if (TYPE_G = "MMCM") generate
166  U_Mmcm : MMCME3_ADV
167  generic map (
168  BANDWIDTH => BANDWIDTH_G,
169  CLKOUT4_CASCADE => "FALSE",
170  STARTUP_WAIT => "FALSE",
171  CLKIN1_PERIOD => CLKIN_PERIOD_G,
172  DIVCLK_DIVIDE => DIVCLK_DIVIDE_G,
173  CLKFBOUT_MULT_F => CLKFBOUT_MULT_F_C,
174  CLKOUT0_DIVIDE_F => CLKOUT0_DIVIDE_F_C,
175  CLKOUT1_DIVIDE => CLKOUT1_DIVIDE_G,
176  CLKOUT2_DIVIDE => CLKOUT2_DIVIDE_G,
177  CLKOUT3_DIVIDE => CLKOUT3_DIVIDE_G,
178  CLKOUT4_DIVIDE => CLKOUT4_DIVIDE_G,
179  CLKOUT5_DIVIDE => CLKOUT5_DIVIDE_G,
180  CLKOUT6_DIVIDE => CLKOUT6_DIVIDE_G,
181  CLKOUT0_PHASE => CLKOUT0_PHASE_G,
182  CLKOUT1_PHASE => CLKOUT1_PHASE_G,
183  CLKOUT2_PHASE => CLKOUT2_PHASE_G,
184  CLKOUT3_PHASE => CLKOUT3_PHASE_G,
185  CLKOUT4_PHASE => CLKOUT4_PHASE_G,
186  CLKOUT5_PHASE => CLKOUT5_PHASE_G,
187  CLKOUT6_PHASE => CLKOUT6_PHASE_G,
188  CLKOUT0_DUTY_CYCLE => CLKOUT0_DUTY_CYCLE_G,
189  CLKOUT1_DUTY_CYCLE => CLKOUT1_DUTY_CYCLE_G,
190  CLKOUT2_DUTY_CYCLE => CLKOUT2_DUTY_CYCLE_G,
191  CLKOUT3_DUTY_CYCLE => CLKOUT3_DUTY_CYCLE_G,
192  CLKOUT4_DUTY_CYCLE => CLKOUT4_DUTY_CYCLE_G,
193  CLKOUT5_DUTY_CYCLE => CLKOUT5_DUTY_CYCLE_G,
194  CLKOUT6_DUTY_CYCLE => CLKOUT6_DUTY_CYCLE_G)
195  port map (
196  DCLK => axilClk,
197  DRDY => drpRdy,
198  DEN => drpEn,
199  DWE => drpWe,
200  DADDR => drpAddr,
201  DI => drpDi,
202  DO => drpDo,
203  CDDCREQ => '0',
204  PSCLK => '0',
205  PSEN => '0',
206  PSINCDEC => '0',
207  PWRDWN => '0',
208  RST => rstInLoc,
209  CLKIN1 => clkInLoc,
210  CLKIN2 => '0',
211  CLKINSEL => '1',
212  CLKFBOUT => clkFbOut,
213  CLKFBIN => clkFbIn,
214  LOCKED => lockedLoc,
215  CLKOUT0 => clkOutMmcm(0),
216  CLKOUT1 => clkOutMmcm(1),
217  CLKOUT2 => clkOutMmcm(2),
218  CLKOUT3 => clkOutMmcm(3),
219  CLKOUT4 => clkOutMmcm(4),
220  CLKOUT5 => clkOutMmcm(5),
221  CLKOUT6 => clkOutMmcm(6));
222  end generate MmcmGen;
223 
224  PllGen : if (TYPE_G = "PLL") generate
225  U_Pll : PLLE3_ADV
226  generic map (
227  STARTUP_WAIT => "FALSE",
228  CLKIN_PERIOD => CLKIN_PERIOD_G,
229  DIVCLK_DIVIDE => DIVCLK_DIVIDE_G,
230  CLKFBOUT_MULT => CLKFBOUT_MULT_G,
231  CLKOUT0_DIVIDE => CLKOUT0_DIVIDE_G,
232  CLKOUT1_DIVIDE => CLKOUT1_DIVIDE_G,
233  CLKOUT0_PHASE => CLKOUT0_PHASE_G,
234  CLKOUT1_PHASE => CLKOUT1_PHASE_G,
235  CLKOUT0_DUTY_CYCLE => CLKOUT0_DUTY_CYCLE_G,
236  CLKOUT1_DUTY_CYCLE => CLKOUT1_DUTY_CYCLE_G)
237  port map (
238  DCLK => axilClk,
239  DRDY => drpRdy,
240  DEN => drpEn,
241  DWE => drpWe,
242  DADDR => drpAddr,
243  DI => drpDi,
244  DO => drpDo,
245  PWRDWN => '0',
246  RST => rstInLoc,
247  CLKIN => clkInLoc,
248  CLKOUTPHYEN => '0',
249  CLKFBOUT => clkFbOut,
250  CLKFBIN => clkFbIn,
251  LOCKED => lockedLoc,
252  CLKOUT0 => clkOutMmcm(0),
253  CLKOUT1 => clkOutMmcm(1));
254  end generate;
255 
256  InputBufgGen : if (INPUT_BUFG_G) generate
257  U_Bufg : BUFG
258  port map (
259  I => clkIn,
260  O => clkInLoc);
261  end generate;
262 
263  InputNoBufg : if (not INPUT_BUFG_G) generate
264  clkInLoc <= clkIn;
265  end generate;
266 
267  FbBufgGen : if (FB_BUFG_G) generate
268  U_Bufg : BUFG
269  port map (
270  I => clkFbOut,
271  O => clkFbIn);
272  end generate;
273 
274  FbNoBufg : if (not FB_BUFG_G) generate
275  clkFbOut <= clkFbIn;
276  end generate;
277 
278  ClkOutGen : for i in NUM_CLOCKS_G-1 downto 0 generate
279  U_Bufg : BUFG
280  port map (
281  I => clkOutMmcm(i),
282  O => clkOutLoc(i));
283  clkOut(i) <= clkOutLoc(i);
284  end generate;
285 
286  locked <= lockedLoc;
287 
288  RstOutGen : for i in NUM_CLOCKS_G-1 downto 0 generate
289  RstSync_1 : entity work.RstSync
290  generic map (
291  TPD_G => TPD_G,
292  IN_POLARITY_G => '0',
293  OUT_POLARITY_G => RST_POLARITY_C(i),
294  BYPASS_SYNC_G => false,
295  RELEASE_DELAY_G => RST_HOLD_C(i))
296  port map (
297  clk => clkOutLoc(i),
298  asyncRst => lockedLoc,
299  syncRst => rstOut(i));
300  end generate;
301 
302 end architecture rtl;
ADDR_WIDTH_Gpositive range 1 to 32:= 16
CLKOUT4_RST_HOLD_Ginteger range 3 to positive'high:= 3
CLKOUT4_DIVIDE_Ginteger range 1 to 128:= 1
CLKFBOUT_MULT_F_Greal range 1.0 to 64.0:= 1.0
out syncRstsl
Definition: RstSync.vhd:36
IN_POLARITY_Gsl := '1'
Definition: RstSync.vhd:28
out drpAddrslv( ADDR_WIDTH_G- 1 downto 0)
CLKOUT5_PHASE_Greal range - 360.0 to 360.0:= 0.0
CLKOUT3_DIVIDE_Ginteger range 1 to 128:= 1
CLKOUT5_DIVIDE_Ginteger range 1 to 128:= 1
CLKOUT2_PHASE_Greal range - 360.0 to 360.0:= 0.0
AxiLiteWriteMasterType
Definition: AxiLitePkg.vhd:111
std_logic sl
Definition: StdRtlPkg.vhd:28
CLKOUT6_DUTY_CYCLE_Greal range 0.01 to 0.99:= 0.5
EN_ARBITRATION_Gboolean := false
DATA_WIDTH_Gpositive range 1 to 32:= 16
out axilReadSlaveAxiLiteReadSlaveType
NUM_CLOCKS_Ginteger range 1 to 7
DIVCLK_DIVIDE_Ginteger range 1 to 106:= 1
in drpDoslv( DATA_WIDTH_G- 1 downto 0)
COMMON_CLK_Gboolean := false
in axilReadMasterAxiLiteReadMasterType := AXI_LITE_READ_MASTER_INIT_C
CLKOUT2_DUTY_CYCLE_Greal range 0.01 to 0.99:= 0.5
CLKOUT6_DIVIDE_Ginteger range 1 to 128:= 1
CLKOUT1_DIVIDE_Ginteger range 1 to 128:= 1
in asyncRstsl
Definition: RstSync.vhd:35
out clkOutslv( NUM_CLOCKS_G- 1 downto 0)
CLKOUT0_DIVIDE_F_Greal range 1.0 to 128.0:= 1.0
in clksl
Definition: RstSync.vhd:34
OUT_POLARITY_Gsl := '1'
Definition: RstSync.vhd:29
out axilWriteSlaveAxiLiteWriteSlaveType
BANDWIDTH_Gstring := "OPTIMIZED"
CLKOUT0_PHASE_Greal range - 360.0 to 360.0:= 0.0
CLKFBOUT_MULT_Ginteger range 2 to 64:= 5
BYPASS_SYNC_Gboolean := false
Definition: RstSync.vhd:30
CLKOUT6_PHASE_Greal range - 360.0 to 360.0:= 0.0
RELEASE_DELAY_Ginteger range 3 to positive'high:= 3
Definition: RstSync.vhd:31
slv( 1 downto 0) := "11" AXI_RESP_DECERR_C
Definition: AxiLitePkg.vhd:49
CLKOUT6_RST_HOLD_Ginteger range 3 to positive'high:= 3
CLKOUT3_PHASE_Greal range - 360.0 to 360.0:= 0.0
in axilReadMasterAxiLiteReadMasterType
CLKOUT0_DUTY_CYCLE_Greal range 0.01 to 0.99:= 0.5
AxiLiteReadMasterType
Definition: AxiLitePkg.vhd:59
CLKOUT5_DUTY_CYCLE_Greal range 0.01 to 0.99:= 0.5
CLKOUT3_RST_HOLD_Ginteger range 3 to positive'high:= 3
TPD_Gtime := 1 ns
Definition: RstSync.vhd:27
TIMEOUT_Gpositive := 4096
out axilWriteSlaveAxiLiteWriteSlaveType
CLKOUT5_RST_HOLD_Ginteger range 3 to positive'high:= 3
CLKOUT2_RST_HOLD_Ginteger range 3 to positive'high:= 3
AxiLiteReadMasterType :=(araddr =>( others => '0'),arprot =>( others => '0'),arvalid => '0',rready => '1') AXI_LITE_READ_MASTER_INIT_C
Definition: AxiLitePkg.vhd:69
out axilReadSlaveAxiLiteReadSlaveType
AxiLiteReadSlaveType
Definition: AxiLitePkg.vhd:85
CLKOUT4_DUTY_CYCLE_Greal range 0.01 to 0.99:= 0.5
in axilWriteMasterAxiLiteWriteMasterType
AxiLiteWriteMasterType :=(awaddr =>( others => '0'),awprot =>( others => '0'),awvalid => '0',wdata =>( others => '0'),wstrb =>( others => '1'),wvalid => '0',bready => '1') AXI_LITE_WRITE_MASTER_INIT_C
Definition: AxiLitePkg.vhd:125
AXI_ERROR_RESP_Gslv( 1 downto 0) := AXI_RESP_DECERR_C
TPD_Gtime := 1 ns
CLKOUT1_RST_HOLD_Ginteger range 3 to positive'high:= 3
CLKOUT0_RST_HOLD_Ginteger range 3 to positive'high:= 3
CLKOUT1_PHASE_Greal range - 360.0 to 360.0:= 0.0
CLKOUT2_DIVIDE_Ginteger range 1 to 128:= 1
CLKOUT0_DIVIDE_Ginteger range 1 to 128:= 1
CLKOUT1_DUTY_CYCLE_Greal range 0.01 to 0.99:= 0.5
_library_ ieeeieee
Definition: Iprog.vhd:18
array(natural range <> ) of integer IntegerArray
Definition: StdRtlPkg.vhd:33
in axilWriteMasterAxiLiteWriteMasterType := AXI_LITE_WRITE_MASTER_INIT_C
out drpDislv( DATA_WIDTH_G- 1 downto 0)
AXI_ERROR_RESP_Gslv( 1 downto 0) := AXI_RESP_DECERR_C
std_logic_vector slv
Definition: StdRtlPkg.vhd:29
out rstOutslv( NUM_CLOCKS_G- 1 downto 0)
CLKOUT4_PHASE_Greal range - 360.0 to 360.0:= 0.0
CLKOUT3_DUTY_CYCLE_Greal range 0.01 to 0.99:= 0.5