SURF  1.0
ClockManager7.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : ClockManager7.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2014-10-28
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 use ieee.math_real.all;
23 
24 library unisim;
25 use unisim.vcomponents.all;
26 
27 use work.StdRtlPkg.all;
28 use work.AxiLitePkg.all;
29 
30 --! @see entity
31  --! @ingroup xilinx_7Series_general
32 entity ClockManager7 is
33  generic (
34  TPD_G : time := 1 ns;
35  TYPE_G : string := "MMCM"; -- or "PLL"
36  INPUT_BUFG_G : boolean := true;
37  FB_BUFG_G : boolean := true;
38  OUTPUT_BUFG_G : boolean := true;
39  RST_IN_POLARITY_G : sl := '1'; -- '0' for active low
40  NUM_CLOCKS_G : integer range 1 to 7;
42  -- MMCM attributes
43  BANDWIDTH_G : string := "OPTIMIZED";
44  CLKIN_PERIOD_G : real := 10.0; -- Input period in ns );
45  DIVCLK_DIVIDE_G : integer range 1 to 106 := 1;
46  CLKFBOUT_MULT_F_G : real range 1.0 to 64.0 := 1.0;
47  CLKFBOUT_MULT_G : integer range 2 to 64 := 5;
48  CLKOUT0_DIVIDE_F_G : real range 1.0 to 128.0 := 1.0;
49  CLKOUT0_DIVIDE_G : integer range 1 to 128 := 1;
50  CLKOUT1_DIVIDE_G : integer range 1 to 128 := 1;
51  CLKOUT2_DIVIDE_G : integer range 1 to 128 := 1;
52  CLKOUT3_DIVIDE_G : integer range 1 to 128 := 1;
53  CLKOUT4_DIVIDE_G : integer range 1 to 128 := 1;
54  CLKOUT5_DIVIDE_G : integer range 1 to 128 := 1;
55  CLKOUT6_DIVIDE_G : integer range 1 to 128 := 1;
56  CLKOUT0_PHASE_G : real range -360.0 to 360.0 := 0.0;
57  CLKOUT1_PHASE_G : real range -360.0 to 360.0 := 0.0;
58  CLKOUT2_PHASE_G : real range -360.0 to 360.0 := 0.0;
59  CLKOUT3_PHASE_G : real range -360.0 to 360.0 := 0.0;
60  CLKOUT4_PHASE_G : real range -360.0 to 360.0 := 0.0;
61  CLKOUT5_PHASE_G : real range -360.0 to 360.0 := 0.0;
62  CLKOUT6_PHASE_G : real range -360.0 to 360.0 := 0.0;
63  CLKOUT0_DUTY_CYCLE_G : real range 0.01 to 0.99 := 0.5;
64  CLKOUT1_DUTY_CYCLE_G : real range 0.01 to 0.99 := 0.5;
65  CLKOUT2_DUTY_CYCLE_G : real range 0.01 to 0.99 := 0.5;
66  CLKOUT3_DUTY_CYCLE_G : real range 0.01 to 0.99 := 0.5;
67  CLKOUT4_DUTY_CYCLE_G : real range 0.01 to 0.99 := 0.5;
68  CLKOUT5_DUTY_CYCLE_G : real range 0.01 to 0.99 := 0.5;
69  CLKOUT6_DUTY_CYCLE_G : real range 0.01 to 0.99 := 0.5;
70  CLKOUT0_RST_HOLD_G : integer range 3 to positive'high := 3;
71  CLKOUT1_RST_HOLD_G : integer range 3 to positive'high := 3;
72  CLKOUT2_RST_HOLD_G : integer range 3 to positive'high := 3;
73  CLKOUT3_RST_HOLD_G : integer range 3 to positive'high := 3;
74  CLKOUT4_RST_HOLD_G : integer range 3 to positive'high := 3;
75  CLKOUT5_RST_HOLD_G : integer range 3 to positive'high := 3;
76  CLKOUT6_RST_HOLD_G : integer range 3 to positive'high := 3;
84  port (
85  clkIn : in sl;
86  rstIn : in sl := '0';
87  clkOut : out slv(NUM_CLOCKS_G-1 downto 0);
88  rstOut : out slv(NUM_CLOCKS_G-1 downto 0);
89  locked : out sl;
90  -- AXI-Lite Interface
91  axilClk : in sl := '0';
92  axilRst : in sl := '0';
97 end entity ClockManager7;
98 
99 architecture rtl of ClockManager7 is
100 
101  constant RST_HOLD_C : IntegerArray(0 to 6) := (
104 
105  constant RST_POLARITY_C : slv(0 to 6) := (
108 
109  constant CLKOUT0_DIVIDE_F_C : real := ite(CLKOUT0_DIVIDE_F_G = 1.0, real(CLKOUT0_DIVIDE_G), CLKOUT0_DIVIDE_F_G);
110  constant CLKFBOUT_MULT_F_C : real := ite(CLKFBOUT_MULT_F_G = 1.0, real(CLKFBOUT_MULT_G), CLKFBOUT_MULT_F_G);
111 
112  signal rstInLoc : sl;
113  signal clkInLoc : sl;
114  signal lockedLoc : sl;
115  signal clkOutMmcm : slv(6 downto 0);
116  signal clkOutLoc : slv(6 downto 0);
117  signal clkFbOut : sl;
118  signal clkFbIn : sl;
119 
120  signal drpRdy : sl;
121  signal drpEn : sl;
122  signal drpWe : sl;
123  signal drpAddr : slv(6 downto 0);
124  signal drpDi : slv(15 downto 0);
125  signal drpDo : slv(15 downto 0);
126 
127  attribute keep_hierarchy : string;
128  attribute keep_hierarchy of rtl : architecture is "yes";
129 
130 begin
131 
132  assert (TYPE_G = "MMCM" or (TYPE_G = "PLL" and NUM_CLOCKS_G < 7))
133  report "ClockManager7: Cannot have 7 clocks if TYPE_G is PLL" severity failure;
134 
135  assert(TYPE_G = "MMCM" or TYPE_G = "PLL")
136  report "ClockManger7: TYPE_G must be either MMCM or PLL" severity failure;
137 
138  rstInLoc <= '1' when rstIn = RST_IN_POLARITY_G else '0';
139 
140  U_AxiLiteToDrp : entity work.AxiLiteToDrp
141  generic map (
142  TPD_G => TPD_G,
144  COMMON_CLK_G => true,
145  EN_ARBITRATION_G => false,
146  TIMEOUT_G => 4096,
147  ADDR_WIDTH_G => 7,
148  DATA_WIDTH_G => 16)
149  port map (
150  -- AXI-Lite Port
151  axilClk => axilClk,
152  axilRst => axilRst,
157  -- DRP Interface
158  drpClk => axilClk,
159  drpRst => axilRst,
160  drpRdy => drpRdy,
161  drpEn => drpEn,
162  drpWe => drpWe,
163  drpAddr => drpAddr,
164  drpDi => drpDi,
165  drpDo => drpDo);
166 
167  MmcmGen : if (TYPE_G = "MMCM") generate
168  U_Mmcm : MMCME2_ADV
169  generic map (
170  BANDWIDTH => BANDWIDTH_G,
171  CLKOUT4_CASCADE => false,
172  STARTUP_WAIT => false,
173  CLKIN1_PERIOD => CLKIN_PERIOD_G,
174  DIVCLK_DIVIDE => DIVCLK_DIVIDE_G,
175  CLKFBOUT_MULT_F => CLKFBOUT_MULT_F_C,
176  CLKOUT0_DIVIDE_F => CLKOUT0_DIVIDE_F_C,
177  CLKOUT1_DIVIDE => CLKOUT1_DIVIDE_G,
178  CLKOUT2_DIVIDE => CLKOUT2_DIVIDE_G,
179  CLKOUT3_DIVIDE => CLKOUT3_DIVIDE_G,
180  CLKOUT4_DIVIDE => CLKOUT4_DIVIDE_G,
181  CLKOUT5_DIVIDE => CLKOUT5_DIVIDE_G,
182  CLKOUT6_DIVIDE => CLKOUT6_DIVIDE_G,
183  CLKOUT0_PHASE => CLKOUT0_PHASE_G,
184  CLKOUT1_PHASE => CLKOUT1_PHASE_G,
185  CLKOUT2_PHASE => CLKOUT2_PHASE_G,
186  CLKOUT3_PHASE => CLKOUT3_PHASE_G,
187  CLKOUT4_PHASE => CLKOUT4_PHASE_G,
188  CLKOUT5_PHASE => CLKOUT5_PHASE_G,
189  CLKOUT6_PHASE => CLKOUT6_PHASE_G,
190  CLKOUT0_DUTY_CYCLE => CLKOUT0_DUTY_CYCLE_G,
191  CLKOUT1_DUTY_CYCLE => CLKOUT1_DUTY_CYCLE_G,
192  CLKOUT2_DUTY_CYCLE => CLKOUT2_DUTY_CYCLE_G,
193  CLKOUT3_DUTY_CYCLE => CLKOUT3_DUTY_CYCLE_G,
194  CLKOUT4_DUTY_CYCLE => CLKOUT4_DUTY_CYCLE_G,
195  CLKOUT5_DUTY_CYCLE => CLKOUT5_DUTY_CYCLE_G,
196  CLKOUT6_DUTY_CYCLE => CLKOUT6_DUTY_CYCLE_G)
197  port map (
198  DCLK => axilClk,
199  DRDY => drpRdy,
200  DEN => drpEn,
201  DWE => drpWe,
202  DADDR => drpAddr,
203  DI => drpDi,
204  DO => drpDo,
205  PSCLK => '0',
206  PSEN => '0',
207  PSINCDEC => '0',
208  PWRDWN => '0',
209  RST => rstInLoc,
210  CLKIN1 => clkInLoc,
211  CLKIN2 => '0',
212  CLKINSEL => '1',
213  CLKFBOUT => clkFbOut,
214  CLKFBIN => clkFbIn,
215  LOCKED => lockedLoc,
216  CLKOUT0 => clkOutMmcm(0),
217  CLKOUT1 => clkOutMmcm(1),
218  CLKOUT2 => clkOutMmcm(2),
219  CLKOUT3 => clkOutMmcm(3),
220  CLKOUT4 => clkOutMmcm(4),
221  CLKOUT5 => clkOutMmcm(5),
222  CLKOUT6 => clkOutMmcm(6));
223  end generate MmcmGen;
224 
225  PllGen : if (TYPE_G = "PLL") generate
226  U_Pll : PLLE2_ADV
227  generic map (
228  BANDWIDTH => BANDWIDTH_G,
229  CLKIN1_PERIOD => CLKIN_PERIOD_G,
230  DIVCLK_DIVIDE => DIVCLK_DIVIDE_G,
231  CLKFBOUT_MULT => CLKFBOUT_MULT_G,
232  CLKOUT0_DIVIDE => CLKOUT0_DIVIDE_G,
233  CLKOUT1_DIVIDE => CLKOUT1_DIVIDE_G,
234  CLKOUT2_DIVIDE => CLKOUT2_DIVIDE_G,
235  CLKOUT3_DIVIDE => CLKOUT3_DIVIDE_G,
236  CLKOUT4_DIVIDE => CLKOUT4_DIVIDE_G,
237  CLKOUT5_DIVIDE => CLKOUT5_DIVIDE_G,
238  CLKOUT0_PHASE => CLKOUT0_PHASE_G,
239  CLKOUT1_PHASE => CLKOUT1_PHASE_G,
240  CLKOUT2_PHASE => CLKOUT2_PHASE_G,
241  CLKOUT3_PHASE => CLKOUT3_PHASE_G,
242  CLKOUT4_PHASE => CLKOUT4_PHASE_G,
243  CLKOUT5_PHASE => CLKOUT5_PHASE_G,
244  CLKOUT0_DUTY_CYCLE => CLKOUT0_DUTY_CYCLE_G,
245  CLKOUT1_DUTY_CYCLE => CLKOUT1_DUTY_CYCLE_G,
246  CLKOUT2_DUTY_CYCLE => CLKOUT2_DUTY_CYCLE_G,
247  CLKOUT3_DUTY_CYCLE => CLKOUT3_DUTY_CYCLE_G,
248  CLKOUT4_DUTY_CYCLE => CLKOUT4_DUTY_CYCLE_G,
249  CLKOUT5_DUTY_CYCLE => CLKOUT5_DUTY_CYCLE_G)
250  port map (
251  DCLK => axilClk,
252  DRDY => drpRdy,
253  DEN => drpEn,
254  DWE => drpWe,
255  DADDR => drpAddr,
256  DI => drpDi,
257  DO => drpDo,
258  PWRDWN => '0',
259  RST => rstInLoc,
260  CLKIN1 => clkInLoc,
261  CLKIN2 => '0',
262  CLKINSEL => '1',
263  CLKFBOUT => clkFbOut,
264  CLKFBIN => clkFbIn,
265  LOCKED => lockedLoc,
266  CLKOUT0 => clkOutMmcm(0),
267  CLKOUT1 => clkOutMmcm(1),
268  CLKOUT2 => clkOutMmcm(2),
269  CLKOUT3 => clkOutMmcm(3),
270  CLKOUT4 => clkOutMmcm(4),
271  CLKOUT5 => clkOutMmcm(5));
272  end generate;
273 
274  InputBufgGen : if (INPUT_BUFG_G) generate
275  U_Bufg : BUFG
276  port map (
277  I => clkIn,
278  O => clkInLoc);
279  end generate;
280 
281  InputNoBufg : if (not INPUT_BUFG_G) generate
282  clkInLoc <= clkIn;
283  end generate;
284 
285  FbBufgGen : if (FB_BUFG_G) generate
286  U_Bufg : BUFG
287  port map (
288  I => clkFbOut,
289  O => clkFbIn);
290  end generate;
291 
292  FbNoBufg : if (not FB_BUFG_G) generate
293  clkFbOut <= clkFbIn;
294  end generate;
295 
296  OutBufgGen : if (OUTPUT_BUFG_G) generate
297  ClkOutGen : for i in NUM_CLOCKS_G-1 downto 0 generate
298  U_Bufg : BUFG
299  port map (
300  I => clkOutMmcm(i),
301  O => clkOutLoc(i));
302  clkOut(i) <= clkOutLoc(i);
303  end generate;
304  end generate OutBufgGen;
305 
306  NoOutBufgGen : if (not OUTPUT_BUFG_G) generate
307  clkOutLoc <= clkOutMmcm;
308  clkOut <= clkOutLoc;
309  end generate NoOutBufgGen;
310 
311  locked <= lockedLoc;
312 
313  RstOutGen : for i in NUM_CLOCKS_G-1 downto 0 generate
314  RstSync_1 : entity work.RstSync
315  generic map (
316  TPD_G => TPD_G,
317  IN_POLARITY_G => '0',
318  OUT_POLARITY_G => RST_POLARITY_C(i),
319  BYPASS_SYNC_G => false,
320  RELEASE_DELAY_G => RST_HOLD_C(i))
321  port map (
322  clk => clkOutLoc(i),
323  asyncRst => lockedLoc,
324  syncRst => rstOut(i));
325  end generate;
326 
327 end architecture rtl;
ADDR_WIDTH_Gpositive range 1 to 32:= 16
CLKOUT0_PHASE_Greal range - 360.0 to 360.0:= 0.0
CLKOUT3_DIVIDE_Ginteger range 1 to 128:= 1
CLKOUT2_DUTY_CYCLE_Greal range 0.01 to 0.99:= 0.5
CLKOUT3_PHASE_Greal range - 360.0 to 360.0:= 0.0
CLKOUT1_RST_HOLD_Ginteger range 3 to positive'high:= 3
out syncRstsl
Definition: RstSync.vhd:36
CLKOUT0_DIVIDE_Ginteger range 1 to 128:= 1
IN_POLARITY_Gsl := '1'
Definition: RstSync.vhd:28
out drpAddrslv( ADDR_WIDTH_G- 1 downto 0)
CLKOUT2_DIVIDE_Ginteger range 1 to 128:= 1
AxiLiteWriteMasterType
Definition: AxiLitePkg.vhd:111
out axilReadSlaveAxiLiteReadSlaveType
std_logic sl
Definition: StdRtlPkg.vhd:28
CLKOUT1_PHASE_Greal range - 360.0 to 360.0:= 0.0
EN_ARBITRATION_Gboolean := false
CLKOUT5_PHASE_Greal range - 360.0 to 360.0:= 0.0
DATA_WIDTH_Gpositive range 1 to 32:= 16
out axilReadSlaveAxiLiteReadSlaveType
in drpDoslv( DATA_WIDTH_G- 1 downto 0)
COMMON_CLK_Gboolean := false
CLKIN_PERIOD_Greal := 10.0
CLKOUT6_DIVIDE_Ginteger range 1 to 128:= 1
CLKOUT0_RST_POLARITY_Gsl := '1'
RST_IN_POLARITY_Gsl := '1'
CLKOUT5_RST_HOLD_Ginteger range 3 to positive'high:= 3
in rstInsl := '0'
out rstOutslv( NUM_CLOCKS_G- 1 downto 0)
in asyncRstsl
Definition: RstSync.vhd:35
TPD_Gtime := 1 ns
CLKOUT2_RST_POLARITY_Gsl := '1'
out axilWriteSlaveAxiLiteWriteSlaveType
CLKOUT0_DUTY_CYCLE_Greal range 0.01 to 0.99:= 0.5
INPUT_BUFG_Gboolean := true
in clksl
Definition: RstSync.vhd:34
OUT_POLARITY_Gsl := '1'
Definition: RstSync.vhd:29
out axilWriteSlaveAxiLiteWriteSlaveType
BYPASS_SYNC_Gboolean := false
Definition: RstSync.vhd:30
AXI_ERROR_RESP_Gslv( 1 downto 0) := AXI_RESP_DECERR_C
CLKOUT6_DUTY_CYCLE_Greal range 0.01 to 0.99:= 0.5
RELEASE_DELAY_Ginteger range 3 to positive'high:= 3
Definition: RstSync.vhd:31
CLKOUT1_RST_POLARITY_Gsl := '1'
CLKOUT2_RST_HOLD_Ginteger range 3 to positive'high:= 3
CLKOUT4_DUTY_CYCLE_Greal range 0.01 to 0.99:= 0.5
slv( 1 downto 0) := "11" AXI_RESP_DECERR_C
Definition: AxiLitePkg.vhd:49
CLKOUT1_DUTY_CYCLE_Greal range 0.01 to 0.99:= 0.5
CLKFBOUT_MULT_Ginteger range 2 to 64:= 5
in axilReadMasterAxiLiteReadMasterType
in axilWriteMasterAxiLiteWriteMasterType := AXI_LITE_WRITE_MASTER_INIT_C
FB_BUFG_Gboolean := true
BANDWIDTH_Gstring := "OPTIMIZED"
CLKOUT5_DUTY_CYCLE_Greal range 0.01 to 0.99:= 0.5
CLKOUT1_DIVIDE_Ginteger range 1 to 128:= 1
CLKOUT4_PHASE_Greal range - 360.0 to 360.0:= 0.0
AxiLiteReadMasterType
Definition: AxiLitePkg.vhd:59
CLKOUT3_RST_HOLD_Ginteger range 3 to positive'high:= 3
CLKOUT4_RST_POLARITY_Gsl := '1'
CLKFBOUT_MULT_F_Greal range 1.0 to 64.0:= 1.0
CLKOUT5_DIVIDE_Ginteger range 1 to 128:= 1
DIVCLK_DIVIDE_Ginteger range 1 to 106:= 1
CLKOUT0_RST_HOLD_Ginteger range 3 to positive'high:= 3
TPD_Gtime := 1 ns
Definition: RstSync.vhd:27
TIMEOUT_Gpositive := 4096
out clkOutslv( NUM_CLOCKS_G- 1 downto 0)
CLKOUT6_RST_HOLD_Ginteger range 3 to positive'high:= 3
CLKOUT6_PHASE_Greal range - 360.0 to 360.0:= 0.0
AxiLiteReadMasterType :=(araddr =>( others => '0'),arprot =>( others => '0'),arvalid => '0',rready => '1') AXI_LITE_READ_MASTER_INIT_C
Definition: AxiLitePkg.vhd:69
AxiLiteReadSlaveType
Definition: AxiLitePkg.vhd:85
CLKOUT0_DIVIDE_F_Greal range 1.0 to 128.0:= 1.0
in axilWriteMasterAxiLiteWriteMasterType
in axilRstsl := '0'
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
CLKOUT6_RST_POLARITY_Gsl := '1'
CLKOUT5_RST_POLARITY_Gsl := '1'
CLKOUT4_DIVIDE_Ginteger range 1 to 128:= 1
CLKOUT3_RST_POLARITY_Gsl := '1'
OUTPUT_BUFG_Gboolean := true
CLKOUT4_RST_HOLD_Ginteger range 3 to positive'high:= 3
_library_ ieeeieee
Definition: UartWrapper.vhd:19
TYPE_Gstring := "MMCM"
CLKOUT3_DUTY_CYCLE_Greal range 0.01 to 0.99:= 0.5
in axilReadMasterAxiLiteReadMasterType := AXI_LITE_READ_MASTER_INIT_C
array(natural range <> ) of integer IntegerArray
Definition: StdRtlPkg.vhd:33
in axilClksl := '0'
out drpDislv( DATA_WIDTH_G- 1 downto 0)
std_logic_vector slv
Definition: StdRtlPkg.vhd:29
NUM_CLOCKS_Ginteger range 1 to 7
CLKOUT2_PHASE_Greal range - 360.0 to 360.0:= 0.0