CMX
CMX firmware code in-line documentation
 All Classes Namespaces Files Functions Variables
CMX_clock_manager.vhd
Go to the documentation of this file.
1 ----------------------------------------------------------------------------------
9 ----------------------------------------------------------------------------------
10 library IEEE;
11 use IEEE.STD_LOGIC_1164.ALL;
12 
13 library work;
14 use work.CMXpackage.all;
15 
16 
17 -- Uncomment the following library declaration if using
18 -- arithmetic functions with Signed or Unsigned values
19 --use IEEE.NUMERIC_STD.ALL;
20 
21 -- Uncomment the following library declaration if instantiating
22 -- any Xilinx primitives in this code.
23 library UNISIM;
24 use UNISIM.VComponents.all;
26 
28 
29  port (
30  I_DS1 : in std_logic; -- inputs from the top level pins
31  IB_DS1 : in std_logic;
32  buf_clk40 : out std_logic; -- globally buffered clocks
33  buf_clk40_90o :out std_logic;
34  buf_clk40_m180o : out std_logic;
35  buf_clk40_m90o : out std_logic;
36  buf_clk320 : out std_logic;
37  buf_clk160 : out std_logic;
38  buf_clk200 : out std_logic;
39  pll_locked : out std_logic;
40  I_DS2 : in std_logic;
41  IB_DS2 : in std_logic;
42  buf_clk40_ds2: out std_logic;
43  pll_locked_ds2: out std_logic;
44  ncs : in std_logic;
45  rd_nwr : in std_logic;
46  ds : in std_logic;
47  addr_vme : in std_logic_vector (15 downto 0);
48  data_vme_in : in std_logic_vector (15 downto 0);
49  data_vme_out : out std_logic_vector (15 downto 0);
50  bus_drive : out std_logic
51  );
52 end CMX_clock_manager;
53 
54 architecture Behavioral of CMX_clock_manager is
55 
56  signal clk40_ibufgds1,clk40_ibufgds2 : std_logic; -- outside clock buffered at the input
57  -- pin pair, drives the MMCM
58 
59  signal FEEDBACK_CLK_DS1 : std_logic; -- feedback clock for the MMCM
60  signal FEEDBACK_CLK_DS2 : std_logic; -- feedback clock for the MMCM
61 
62  signal clk40, clk40_90o, clk40_m90o, clk40_m180o, clk320, clk160, clk200 : std_logic; -- unbuffered clocks, mmcm
63  -- outputs (ds1)
64  signal buf_clk40_sig : std_logic; --local copy of the buggered ds1 40 MHz
65  --clock for use in the pll status reg
66 
67  signal clk40_ds2: std_logic; --mmcm 2 output
68 
69 
71 
72 
73 ---- component IBUFGDS
74 ---- port (
75 ---- I : in std_logic;
76 ---- IB : in std_logic;
77 ---- O : out std_logic);
78 ---- end component;
79 
80  component vme_local_switch is
81  port (
82  data_vme_up : out std_logic_vector (15 downto 0);
83  data_vme_from_below : in arr_16;
84  bus_drive_up : out std_logic;
85  bus_drive_from_below : in std_logic_vector);
86  end component vme_local_switch;
87 
88  signal data_vme_out_local : arr_16(1 downto 0);
89  signal bus_drive_local : std_logic_vector(1 downto 0);
90 
91 
92  component vme_inreg_notri_async is
93  generic (
94  ia_vme : integer;
95  width : integer);
96  port (
97  ncs : in std_logic;
98  rd_nwr : in std_logic;
99  ds : in std_logic;
100  addr_vme : in std_logic_vector (15 downto 0);
101  data_vme_in : in std_logic_vector (15 downto 0);
102  data_vme_out : out std_logic_vector (15 downto 0);
103  bus_drive : out std_logic;
104  data_from_vme : out std_logic_vector (width-1 downto 0);
105  data_to_vme : in std_logic_vector (width-1 downto 0));
106  end component vme_inreg_notri_async;
107 
108 
110  generic (
111  ia_vme : integer;
112  width : integer);
113  port (
114  ncs : in std_logic;
115  rd_nwr : in std_logic;
116  ds : in std_logic;
117  addr_vme : in std_logic_vector (15 downto 0);
118  data_vme : out std_logic_vector (15 downto 0);
119  bus_drive : out std_logic;
120  data_to_vme : in std_logic_vector (width-1 downto 0));
121  end component vme_outreg_notri_async;
122 
123  signal data_from_vme_REG_RW_CLOCK_MANAGER_RESET : std_logic_vector (15 downto 0);
124  signal data_to_vme_REG_RW_CLOCK_MANAGER_RESET : std_logic_vector (15 downto 0);
125 
126  signal data_to_vme_REG_RO_CLOCK_MANAGER_STATUS : std_logic_vector (15 downto 0);
127 
128 
129 begin
130 
131 
132  vme_local_switch_inst: entity work.vme_local_switch
133  port map (
138 
139 
140  IBUFGDS_inst_ds1: IBUFGDS
141  generic map (
142  DIFF_TERM => TRUE, -- Differential Termination
143  IBUF_LOW_PWR => TRUE, -- Low power (TRUE) vs. performance (FALSE) setting for referenced I/O standards
144  IOSTANDARD => "LVDS_25")
145  port map (
146  I => I_DS1,
147  IB => IB_DS1,
148  O => clk40_ibufgds1);
149 
150  IBUFGDS_inst_ds2: IBUFGDS
151  generic map (
152  DIFF_TERM => TRUE, -- Differential Termination
153  IBUF_LOW_PWR => TRUE, -- Low power (TRUE) vs. performance (FALSE) setting for referenced I/O standards
154  IOSTANDARD => "LVDS_25")
155  port map (
156  I => I_DS2,
157  IB => IB_DS2 ,
158  O => clk40_ibufgds2);
159 
160  --the MMCM for the global reference for iodelay
161  MMCM_BASE_inst_ds1 : MMCM_BASE
162  generic map (
163  BANDWIDTH => "OPTIMIZED", -- Jitter programming ("HIGH","LOW","OPTIMIZED")
164  CLKFBOUT_MULT_F => 32.0, -- Multiply value for all CLKOUT (5.0-64.0).
165  -- F_VCO = 32*40 MHz =1280 MHz
166  CLKFBOUT_PHASE => 0.0, -- Phase offset in degrees of CLKFB (0.00-360.00).
167  CLKIN1_PERIOD => 24.95, -- Input clock period in ns to ps resolution (i.e. 33.333 is 30
168  -- MHz) WTF: 25ns = 40MHz, 24.95=40.08 MHz - actual LHC BC
169  CLKOUT0_DIVIDE_F => 6.4, -- Divide amount for CLKOUT0 (1.000-128.000).
170  -- 200 MHz
171  -- CLKOUT0_DUTY_CYCLE - CLKOUT6_DUTY_CYCLE: Duty cycle for each CLKOUT (0.01-0.99).
172  CLKOUT0_DUTY_CYCLE => 0.5,
173  CLKOUT1_DUTY_CYCLE => 0.5,
174  CLKOUT2_DUTY_CYCLE => 0.5,
175  CLKOUT3_DUTY_CYCLE => 0.5,
176  CLKOUT4_DUTY_CYCLE => 0.5,
177  CLKOUT5_DUTY_CYCLE => 0.5,
178  CLKOUT6_DUTY_CYCLE => 0.5,
179  -- CLKOUT0_PHASE - CLKOUT6_PHASE: Phase offset for each CLKOUT (-360.000-360.000).
180  CLKOUT0_PHASE => 0.0,
181  CLKOUT1_PHASE => 0.0,
182  CLKOUT2_PHASE => 0.0,-- -45.0,
183  CLKOUT3_PHASE => 0.0,
184  CLKOUT4_PHASE => 90.0,
185  CLKOUT5_PHASE => 0.0,
186  CLKOUT6_PHASE => -90.0,
187  -- CLKOUT1_DIVIDE - CLKOUT6_DIVIDE: Divide amount for each CLKOUT (1-128)
188  CLKOUT1_DIVIDE => 32, --40 MHz
189  CLKOUT2_DIVIDE => 4, --320 MHz
190  CLKOUT3_DIVIDE => 8, --160 MHz
191  CLKOUT4_DIVIDE => 32,
192  CLKOUT5_DIVIDE => 32,
193  CLKOUT6_DIVIDE => 32,
194  CLKOUT4_CASCADE => FALSE, -- Cascase CLKOUT4 counter with CLKOUT6 (TRUE/FALSE)
195  CLOCK_HOLD => FALSE, -- Hold VCO Frequency (TRUE/FALSE)
196  DIVCLK_DIVIDE => 1, -- Master division value (1-80)
197  REF_JITTER1 => 0.0, -- Reference input jitter in UI (0.000-0.999).
198  STARTUP_WAIT => FALSE -- Not supported. Must be set to FALSE.
199  )
200  port map (
201  -- Clock Outputs: 1-bit (each) output: User configurable clock outputs
202  CLKOUT0 => clk200, -- 1-bit output: CLKOUT0 output
203  CLKOUT0B => open, -- 1-bit output: Inverted CLKOUT0 output
204  CLKOUT1 => clk40, -- 1-bit output: CLKOUT1 output
205  CLKOUT1B => clk40_m180o, -- 1-bit output: Inverted CLKOUT1 output
206  CLKOUT2 => clk320, -- 1-bit output: CLKOUT2 output
207  CLKOUT2B => open, -- 1-bit output: Inverted CLKOUT2 output
208  CLKOUT3 => clk160, -- 1-bit output: CLKOUT3 output
209  CLKOUT3B => open, -- 1-bit output: Inverted CLKOUT3 output
210  CLKOUT4 => clk40_90o, -- 1-bit output: CLKOUT4 output
211  CLKOUT5 => open, -- 1-bit output: CLKOUT5 output
212  CLKOUT6 => clk40_m90o, -- 1-bit output: CLKOUT6 output
213  -- Feedback Clocks: 1-bit (each) output: Clock feedback ports
214  CLKFBOUT => FEEDBACK_CLK_DS1 , -- 1-bit output: Feedback clock output
215  CLKFBOUTB => open, -- 1-bit output: Inverted CLKFBOUT output
216  -- Status Port: 1-bit (each) output: MMCM status ports
217  LOCKED => pll_locked_ds1_sig, -- 1-bit output: LOCK output
218  -- Clock Input: 1-bit (each) input: Clock input
219  CLKIN1 => clk40_ibufgds1 ,
220  -- Control Ports: 1-bit (each) input: MMCM control ports
221  PWRDWN => '0', -- 1-bit input: Power-down input
222  RST => data_from_vme_REG_RW_CLOCK_MANAGER_RESET(0), -- 1-bit input: Reset input
223  -- Feedback Clocks: 1-bit (each) input: Clock feedback ports
224  CLKFBIN => FEEDBACK_CLK_DS1 -- 1-bit input: Feedback clock input
225  );
226 
228 
229 
231  generic map (
232  ia_vme => ADDR_REG_RW_CLOCK_MANAGER_RESET ,
233  width => 16)
234  port map (
235  ncs => ncs,
236  rd_nwr => rd_nwr,
237  ds => ds,
238  addr_vme => addr_vme,
241  bus_drive => bus_drive_local (0),
244 
246 
247  BUFG_40 : BUFG
248  port map (
249  O => buf_clk40_sig, -- Buffer output
250  I => clk40 -- Buffer input
251  );
252 
253 
254  BUFG_40_90o : BUFG
255  port map (
256  O => buf_clk40_90o, -- Buffer output
257  I => clk40_90o -- Buffer input
258  );
259 
260  BUFG_40_m90o : BUFG
261  port map (
262  O => buf_clk40_m90o, -- Buffer output
263  I => clk40_m90o -- Buffer input
264  );
265 
266  BUFG_40_m180o : BUFG
267  port map (
268  O => buf_clk40_m180o, -- Buffer output
269  I => clk40_m180o -- Buffer input
270  );
271 
272 
273  BUFG_200 : BUFG
274  port map (
275  O => buf_clk200, -- Buffer output
276  I => clk200 -- Buffer input
277  );
278 
279  BUFG_160 : BUFG
280  port map (
281  O => buf_clk160, -- Buffer output
282  I => clk160 -- Buffer input
283  );
284 
285  BUFG_320 : BUFG
286  port map (
287  O => buf_clk320, -- Buffer output
288  I => clk320 -- Buffer input
289  );
290 
292 
293  --the MMCM for the ds2 clock
294  MMCM_BASE_inst_ds2 : MMCM_BASE
295  generic map (
296  BANDWIDTH => "OPTIMIZED", -- Jitter programming ("HIGH","LOW","OPTIMIZED")
297  CLKFBOUT_MULT_F => 32.0, -- Multiply value for all CLKOUT (5.0-64.0).
298  -- F_VCO = 32*40 MHz =1280 MHz
299  CLKFBOUT_PHASE => 0.0, -- Phase offset in degrees of CLKFB (0.00-360.00).
300  CLKIN1_PERIOD => 24.95, -- Input clock period in ns to ps resolution (i.e. 33.333 is 30
301  -- MHz) WTF: 25ns = 40MHz, 24.95=40.08 MHz - actual LHC BC
302  CLKOUT0_DIVIDE_F => 32.0, -- Divide amount for CLKOUT0 (1.000-128.000).
303  -- 20 MHz
304  -- CLKOUT0_DUTY_CYCLE - CLKOUT6_DUTY_CYCLE: Duty cycle for each CLKOUT (0.01-0.99).
305  CLKOUT0_DUTY_CYCLE => 0.5,
306  CLKOUT1_DUTY_CYCLE => 0.5,
307  CLKOUT2_DUTY_CYCLE => 0.5,
308  CLKOUT3_DUTY_CYCLE => 0.5,
309  CLKOUT4_DUTY_CYCLE => 0.5,
310  CLKOUT5_DUTY_CYCLE => 0.5,
311  CLKOUT6_DUTY_CYCLE => 0.5,
312  -- CLKOUT0_PHASE - CLKOUT6_PHASE: Phase offset for each CLKOUT (-360.000-360.000).
313  CLKOUT0_PHASE => 0.0,
314  CLKOUT1_PHASE => 0.0,
315  CLKOUT2_PHASE => 0.0,-- -45.0,
316  CLKOUT3_PHASE => 0.0,
317  CLKOUT4_PHASE => 90.0,
318  CLKOUT5_PHASE => 0.0,
319  CLKOUT6_PHASE => 0.0,
320  -- CLKOUT1_DIVIDE - CLKOUT6_DIVIDE: Divide amount for each CLKOUT (1-128)
321  CLKOUT1_DIVIDE => 32, --40 MHz
322  CLKOUT2_DIVIDE => 4, --320 MHz
323  CLKOUT3_DIVIDE => 8, --160 MHz
324  CLKOUT4_DIVIDE => 32,
325  CLKOUT5_DIVIDE => 1,
326  CLKOUT6_DIVIDE => 1,
327  CLKOUT4_CASCADE => FALSE, -- Cascase CLKOUT4 counter with CLKOUT6 (TRUE/FALSE)
328  CLOCK_HOLD => FALSE, -- Hold VCO Frequency (TRUE/FALSE)
329  DIVCLK_DIVIDE => 1, -- Master division value (1-80)
330  REF_JITTER1 => 0.0, -- Reference input jitter in UI (0.000-0.999).
331  STARTUP_WAIT => FALSE -- Not supported. Must be set to FALSE.
332  )
333  port map (
334  -- Clock Outputs: 1-bit (each) output: User configurable clock outputs
335  CLKOUT0 => clk40_ds2, -- 1-bit output: CLKOUT0 output
336  CLKOUT0B => open, -- 1-bit output: Inverted CLKOUT0 output
337  CLKOUT1 => open, -- 1-bit output: CLKOUT1 output
338  CLKOUT1B => open, -- 1-bit output: Inverted CLKOUT1 output
339  CLKOUT2 => open, -- 1-bit output: CLKOUT2 output
340  CLKOUT2B => open, -- 1-bit output: Inverted CLKOUT2 output
341  CLKOUT3 => open, -- 1-bit output: CLKOUT3 output
342  CLKOUT3B => open, -- 1-bit output: Inverted CLKOUT3 output
343  CLKOUT4 => open, -- 1-bit output: CLKOUT4 output
344  CLKOUT5 => open, -- 1-bit output: CLKOUT5 output
345  CLKOUT6 => open, -- 1-bit output: CLKOUT6 output
346  -- Feedback Clocks: 1-bit (each) output: Clock feedback ports
347  CLKFBOUT => FEEDBACK_CLK_DS2 , -- 1-bit output: Feedback clock output
348  CLKFBOUTB => open, -- 1-bit output: Inverted CLKFBOUT output
349  -- Status Port: 1-bit (each) output: MMCM status ports
350  LOCKED => pll_locked_ds2_sig, -- 1-bit output: LOCK output
351  -- Clock Input: 1-bit (each) input: Clock input
352  CLKIN1 => clk40_ibufgds2 ,
353  -- Control Ports: 1-bit (each) input: MMCM control ports
354  PWRDWN => '0', -- 1-bit input: Power-down input
355  RST => data_from_vme_REG_RW_CLOCK_MANAGER_RESET(1), -- 1-bit input: Reset input
356  -- Feedback Clocks: 1-bit (each) input: Clock feedback ports
357  CLKFBIN => FEEDBACK_CLK_DS2 -- 1-bit input: Feedback clock input
358  );
359 
361 
362 
363  BUFG_40_ds2 : BUFG
364  port map (
365  O => buf_clk40_ds2, -- Buffer output
366  I => clk40_ds2 -- Buffer input
367  );
368 
369 
372  data_to_vme_REG_RO_CLOCK_MANAGER_STATUS(15 downto 2)<=(others=>'0');
373 
374  vme_outreg_REG_RO_CLOCK_MANAGER_STATUS: entity work.vme_outreg_notri_async
375  generic map (
376  ia_vme => ADDR_REG_RO_CLOCK_MANAGER_STATUS ,
377  width => 16)
378  port map (
379  ncs => ncs,
380  rd_nwr => rd_nwr,
381  ds => ds,
382  addr_vme => addr_vme,
384  bus_drive => bus_drive_local (1),
386 
387 end Behavioral;
388 
in addr_vmestd_logic_vector (15 downto 0)
mmcm_base mmcm_base_inst_ds2mmcm_base_inst_ds2
out data_vmestd_logic_vector (15 downto 0)
out buf_clk160std_logic
bufg bufg_320bufg_320
bufg bufg_40_ds2bufg_40_ds2
std_logic_vector (15 downto 0) data_to_vme_REG_RW_CLOCK_MANAGER_RESET
std_logic_vector (15 downto 0) data_to_vme_REG_RO_CLOCK_MANAGER_STATUS
mmcm_base mmcm_base_inst_ds1mmcm_base_inst_ds1
out data_from_vmestd_logic_vector (width - 1 downto 0)
out pll_lockedstd_logic
out buf_clk320std_logic
std_logic_vector (15 downto 0) data_from_vme_REG_RW_CLOCK_MANAGER_RESET
bufg bufg_160bufg_160
in data_vme_from_belowarr_16
--! inputs from local registers and from
in data_vme_instd_logic_vector (15 downto 0)
out buf_clk40_m180ostd_logic
in data_vme_instd_logic_vector (15 downto 0)
out bus_drivestd_logic
out data_vme_outstd_logic_vector (15 downto 0)
std_logic_vector (1 downto 0) bus_drive_local
in data_to_vmestd_logic_vector (width - 1 downto 0)
out data_vme_upstd_logic_vector (15 downto 0)
--! connect this to
in addr_vmestd_logic_vector (15 downto 0)
in addr_vmestd_logic_vector (15 downto 0)
out buf_clk200std_logic
out bus_drive_upstd_logic
or of all bus drive requests from below
out buf_clk40std_logic
bufg bufg_40bufg_40
bufg bufg_40_90obufg_40_90o
out buf_clk40_m90ostd_logic
arr_16 (1 downto 0) data_vme_out_local
vme_inreg_notri_async vme_inreg_notri_async_instvme_inreg_notri_async_inst
bufg bufg_40_m90obufg_40_m90o
ibufgds ibufgds_inst_ds1ibufgds_inst_ds1
out data_vme_outstd_logic_vector (15 downto 0)
out pll_locked_ds2std_logic
bufg bufg_40_m180obufg_40_m180o
bufg bufg_200bufg_200
ibufgds ibufgds_inst_ds2ibufgds_inst_ds2
out buf_clk40_90ostd_logic
test registers
in data_to_vmestd_logic_vector (width - 1 downto 0)
out buf_clk40_ds2std_logic
in bus_drive_from_belowstd_logic_vector