CMX
CMX firmware code in-line documentation
 All Classes Namespaces Files Functions Variables
CMX_data_delay.vhd
Go to the documentation of this file.
1 ----------------------------------------------------------------------------------
10 ----------------------------------------------------------------------------------
11 library IEEE;
12 use IEEE.STD_LOGIC_1164.ALL;
13 use IEEE.NUMERIC_STD.ALL;
14 
15 
16 -- Uncomment the following library declaration if instantiating
17 -- any Xilinx primitives in this code.
18 library UNISIM;
19 use UNISIM.VComponents.all;
20 
22 
23 USE WORK.CMXpackage.all;
24 
25 entity CMX_data_delay is
26  PORT(
27  DATA24: in arr_word (numactchan-1 downto 0);
28  CLKPAR: in std_logic_vector(numactchan - 1 downto 0);
29  REF_CLK_200: in std_logic;
30  REF_CLK_READY: in std_logic;
31  CLK_40: in std_logic;
32  del_register: in del_register_type; --input from VME holding 5 bit delay
33  --for every data and clkpar signal of
34  --every channel
35  upload_delays: in std_logic; --needs to be pulsed high for the
36  --upload of the registers into the
37  --iodelay instances
38 
39 
40  IDELAYCTRL_RDY: out std_logic_vector(num_IDELAYCTRL-1 downto 0);
41  DELAYED_DATA24: out arr_word (numactchan-1 downto 0);
42  DELAYED_CLKPAR: out std_logic_vector(numactchan - 1 downto 0);
43 
44  --VME control:
45  ncs : in std_logic;
46  rd_nwr : in std_logic;
47  ds : in std_logic;
48  addr_vme : in std_logic_vector (15 downto 0);
49  data_vme_in : in std_logic_vector (15 downto 0);
50  data_vme_out : out std_logic_vector (15 downto 0);
51  bus_drive : out std_logic
52 
53  );
54 end CMX_data_delay;
55 
56 architecture Behavioral of CMX_data_delay is
57 
58  signal rst_after_clkrdy : std_logic_vector(num_IDELAYCTRL-1 downto 0);
59 
60  signal IDELAYCTRL_RDY_sig : std_logic_vector(num_IDELAYCTRL-1 downto 0);
61 
62  signal IDELcount_rst_pulse: arr_ctr_16bit(num_IDELAYCTRL-1 downto 0);
63  signal IDELcount_rst_pulse_next: arr_ctr_16bit(num_IDELAYCTRL-1 downto 0);
64 
65  signal data_to_vme_REG_RO_IDELAYCTRL_RDY : std_logic_vector(15 downto 0);
66  signal data_to_vme_REG_RO_IDELAYCTRL_RST : std_logic_vector(15 downto 0);
67  signal data_to_vme_REG_RO_IDELAYCTRL_WAS_RST : std_logic_vector(15 downto 0);
68 
69  component vme_local_switch is
70  port (
71  data_vme_up : out std_logic_vector (15 downto 0);
72  data_vme_from_below : in arr_16;
73  bus_drive_up : out std_logic;
74  bus_drive_from_below : in std_logic_vector);
75  end component vme_local_switch;
76 
77 
78  signal data_vme_from_below : arr_16(2 downto 0);
79  signal bus_drive_from_below : std_logic_vector(2 downto 0);
80 
81 
83  generic (
84  ia_vme : integer;
85  width : integer);
86  port (
87  ncs : in std_logic;
88  rd_nwr : in std_logic;
89  ds : in std_logic;
90  addr_vme : in std_logic_vector (15 downto 0);
91  data_vme : out std_logic_vector (15 downto 0);
92  bus_drive : out std_logic;
93  data_to_vme : in std_logic_vector (width-1 downto 0));
94  end component vme_outreg_notri_async;
95 
96 begin
97 
98 
99  vme_local_switch_inst: entity work.vme_local_switch
100  port map (
105 
106 
108  generic map (
109  ia_vme => ADDR_REG_RO_IDELAYCTRL_RDY ,
110  width => 16)
111  port map (
112  ncs => ncs,
113  rd_nwr => rd_nwr,
114  ds => ds,
115  addr_vme => addr_vme,
119  );
120 
122  data_to_vme_REG_RO_IDELAYCTRL_RDY(num_IDELAYCTRL-1 downto 0)<=IDELAYCTRL_RDY_sig;
123  data_to_vme_REG_RO_IDELAYCTRL_RDY(14 downto num_IDELAYCTRL)<=(others=>'0');
124 
125 
127  generic map (
128  ia_vme => ADDR_REG_RO_IDELAYCTRL_RST ,
129  width => 16)
130  port map (
131  ncs => ncs,
132  rd_nwr => rd_nwr,
133  ds => ds,
134  addr_vme => addr_vme,
138  );
139 
140 
141  data_to_vme_REG_RO_IDELAYCTRL_RST(num_IDELAYCTRL-1 downto 0)<=rst_after_clkrdy;
142  data_to_vme_REG_RO_IDELAYCTRL_RST(15 downto num_IDELAYCTRL)<=(others=>'0');
143 
144 
146  generic map (
147  ia_vme => ADDR_REG_RO_IDELAYCTRL_WAS_RST ,
148  width => 16)
149  port map (
150  ncs => ncs,
151  rd_nwr => rd_nwr,
152  ds => ds,
153  addr_vme => addr_vme,
157  );
158 
159  data_to_vme_REG_RO_IDELAYCTRL_WAS_RST(15 downto num_IDELAYCTRL)<=(others=>'0');
160 
161 
163 
164  ioctrlgen: for ctrl in 0 to num_IDELAYCTRL - 1 generate
165 
166 
167  --this generates a long clock reset pulse for ioctrl after the MMCM has locked
169 
171  begin -- process rst_ioctrl
172  if REF_CLK_READY/='1' then
173  rst_after_clkrdy(ctrl)<='1';
174  IDELcount_rst_pulse(ctrl)<=to_unsigned(0,16);
175  else
176  if rising_edge(REF_CLK_200) then
177  if IDELcount_rst_pulse(ctrl)<to_unsigned(32768,16) then
178  rst_after_clkrdy(ctrl)<='1';
180  else
181  rst_after_clkrdy(ctrl)<='0';
182  end if;
183  end if;
184  end if;
185  end process rst_ioctrl;
186 
188 
189  IDELAYCTRL_inst : IDELAYCTRL
190  port map (
191  RDY => IDELAYCTRL_RDY_sig(ctrl), -- 1-bit output indicates validity of the REFCLK
192  REFCLK => REF_CLK_200, -- 1-bit reference clock input
193  RST => rst_after_clkrdy (ctrl) -- 1-bit reset input
194  );
195 
196  end generate ioctrlgen;
197 
198  iodelgen_chan: for channel in 0 to numactchan - 1 generate
199  iodelgen_bit: for bitnum in 0 to numbitsinchan - 1 generate
200 
201  IODELAYE1_inst_data : IODELAYE1
202  generic map (
203  CINVCTRL_SEL => FALSE, -- Enable dynamic clock inversion (TRUE/FALSE)
204  DELAY_SRC => "I", -- Delay input ("I", "CLKIN", "DATAIN", "IO", "O")
205  HIGH_PERFORMANCE_MODE => TRUE, -- Reduced jitter (TRUE), Reduced power (FALSE)
206  IDELAY_TYPE => "VAR_LOADABLE", -- "DEFAULT", "FIXED", "VARIABLE", or "VAR_LOADABLE"
207  IDELAY_VALUE => 0, -- Input delay tap setting (0-31)
208  ODELAY_TYPE => "FIXED" , -- "FIXED", "VARIABLE", or "VAR_LOADABLE"
209  ODELAY_VALUE => 0, -- Output delay tap setting (0-31)
210  REFCLK_FREQUENCY => 200.0, -- IDELAYCTRL clock input frequency in MHz
211  SIGNAL_PATTERN => "DATA" -- "DATA" or "CLOCK" input signal
212  )
213  port map (
214  CNTVALUEOUT => open, -- 5-bit output: Counter value output
215  DATAOUT => DELAYED_DATA24(channel)(bitnum), -- 1-bit output: Delayed data output
216  C => CLK_40, -- 1-bit input: Clock input
217  CE => '0', -- 1-bit input: Active high enable increment/decrement input
218  CINVCTRL => '0', -- 1-bit input: Dynamic clock inversion input
219  CLKIN => '0', -- 1-bit input: Clock delay input
220  CNTVALUEIN => del_register(channel,bitnum), -- 5-bit input: Counter value input
221  DATAIN => '0', -- 1-bit input: Internal delay data input
222  IDATAIN => DATA24 (channel)(bitnum), -- 1-bit input: Data input from the I/O
223  INC => '0', -- 1-bit input: Increment / Decrement tap delay input
224  ODATAIN => '0', -- 1-bit input: Output delay data input
225  RST => upload_delays , -- 1-bit input: Active-high reset tap-delay input
226  T => '1' -- 1-bit input: 3-state input
227  );
228 
229  end generate iodelgen_bit;
230 
231  IODELAYE1_inst_clkpar : IODELAYE1
232  generic map (
233  CINVCTRL_SEL => FALSE, -- Enable dynamic clock inversion (TRUE/FALSE)
234  DELAY_SRC => "I", -- Delay input ("I", "CLKIN", "DATAIN", "IO", "O")
235  HIGH_PERFORMANCE_MODE => TRUE, -- Reduced jitter (TRUE), Reduced power (FALSE)
236  IDELAY_TYPE => "VAR_LOADABLE", -- "DEFAULT", "FIXED", "VARIABLE", or "VAR_LOADABLE"
237  IDELAY_VALUE => 0, -- Input delay tap setting (0-31)
238  ODELAY_TYPE => "FIXED" , -- "FIXED", "VARIABLE", or "VAR_LOADABLE"
239  ODELAY_VALUE => 0, -- Output delay tap setting (0-31)
240  REFCLK_FREQUENCY => 200.0, -- IDELAYCTRL clock input frequency in MHz
241  SIGNAL_PATTERN => "CLOCK" -- "DATA" or "CLOCK" input signal
242  )
243  port map (
244  CNTVALUEOUT => open, -- 5-bit output: Counter value output
245  DATAOUT => DELAYED_CLKPAR(channel), -- 1-bit output: Delayed data output
246  C => CLK_40, -- 1-bit input: Clock input
247  CE => '0', -- 1-bit input: Active high enable increment/decrement input
248  CINVCTRL => '0', -- 1-bit input: Dynamic clock inversion input
249  CLKIN => '0', -- 1-bit input: Clock delay input
250  CNTVALUEIN => del_register(channel,numbitsinchan), -- 5-bit input: Counter value input
251  DATAIN => '0', -- 1-bit input: Internal delay data input
252  IDATAIN => CLKPAR (channel), -- 1-bit input: Data input from the I/O
253  INC => '0', -- 1-bit input: Increment / Decrement tap delay input
254  ODATAIN => '0', -- 1-bit input: Output delay data input
255  RST => upload_delays , -- 1-bit input: Active-high reset tap-delay input
256  T => '1' -- 1-bit input: 3-state input
257  );
258 
259  end generate iodelgen_chan;
260 
261 
262 end Behavioral;
263 
out data_vme_outstd_logic_vector (15 downto 0)
in ncsstd_logic
in data_vme_instd_logic_vector (15 downto 0)
in addr_vmestd_logic_vector (15 downto 0)
out data_vmestd_logic_vector (15 downto 0)
in CLK_40std_logic
rst_ioctrlREF_CLK_200,REF_CLK_READY
out IDELAYCTRL_RDYstd_logic_vector (num_IDELAYCTRL - 1 downto 0)
std_logic_vector (num_IDELAYCTRL - 1 downto 0) rst_after_clkrdy
vme_outreg_notri_async vme_outreg_reg_ro_idelayctrl_was_rstvme_outreg_reg_ro_idelayctrl_was_rst
idelayctrl idelayctrl_instidelayctrl_inst
std_logic_vector (2 downto 0) bus_drive_from_below
in data_vme_from_belowarr_16
--! inputs from local registers and from
out DELAYED_CLKPARstd_logic_vector (numactchan - 1 downto 0)
arr_ctr_16bit (num_IDELAYCTRL - 1 downto 0) IDELcount_rst_pulse_next
iodelaye1 iodelaye1_inst_dataiodelaye1_inst_data
in REF_CLK_READYstd_logic
vme_outreg_notri_async vme_outreg_reg_ro_idelayctrl_rdyvme_outreg_reg_ro_idelayctrl_rdy
std_logic_vector (15 downto 0) data_to_vme_REG_RO_IDELAYCTRL_WAS_RST
std_logic_vector (15 downto 0) data_to_vme_REG_RO_IDELAYCTRL_RST
in CLKPARstd_logic_vector (numactchan - 1 downto 0)
std_logic_vector (num_IDELAYCTRL - 1 downto 0) IDELAYCTRL_RDY_sig
std_logic_vector (15 downto 0) data_to_vme_REG_RO_IDELAYCTRL_RDY
out data_vme_upstd_logic_vector (15 downto 0)
--! connect this to
in addr_vmestd_logic_vector (15 downto 0)
in upload_delaysstd_logic
out bus_drive_upstd_logic
or of all bus drive requests from below
in rd_nwrstd_logic
in dsstd_logic
in del_registerdel_register_type
iodelaye1 iodelaye1_inst_clkpariodelaye1_inst_clkpar
out DELAYED_DATA24arr_word (numactchan - 1 downto 0)
arr_ctr_16bit (num_IDELAYCTRL - 1 downto 0) IDELcount_rst_pulse
in REF_CLK_200std_logic
test registers
in DATA24arr_word (numactchan - 1 downto 0)
vme_outreg_notri_async vme_outreg_reg_ro_idelayctrl_rstvme_outreg_reg_ro_idelayctrl_rst
in data_to_vmestd_logic_vector (width - 1 downto 0)
out bus_drivestd_logic
arr_16 (2 downto 0) data_vme_from_below
in bus_drive_from_belowstd_logic_vector