CMX
CMX firmware code in-line documentation
 All Classes Namespaces Files Functions Variables
daq_collector.vhd
Go to the documentation of this file.
1 
11 
12 library IEEE;
13 use IEEE.STD_LOGIC_1164.ALL;
14 use IEEE.NUMERIC_STD.ALL;
15 use IEEE.STD_LOGIC_UNSIGNED.ALL;
16 use IEEE.STD_LOGIC_ARITH.CONV_STD_LOGIC_VECTOR;
17 
18 LIBRARY work;
19 use work.CMXpackage.all;
20 use work.CMX_flavor_package.all;
21 
22 
23 entity daq_collector is
24  port (
25  clk : in std_logic;
26  datai : in arr_4Xword(max_cps-1 downto 0);
27  din_cbl : in T_SLV150;
28  din_cbla_ro : in T_SL;
29  din_cblb_ro : in T_SL;
30  din_cblc_ro : in T_SL;
31  din_lcl : in T_SLV48;
32  din_lcl_ro : in T_SL;
33  dout : in T_SLV62;
34  dout_ro : in T_SL;
35  data_in_daq : out arr_96(19 downto 0);
36  BCID_in : in std_logic_vector(11 downto 0);
37  BCID_delayed : out std_logic_vector(11 downto 0));
38 end daq_collector;
39 
40 architecture Behavioral of daq_collector is
41 
42  component parity_gen
43  GENERIC(
44  width : integer := 60
45  );
46  PORT(
47  din : IN std_logic_vector (width-1 downto 0) ;
48  parity : OUT std_logic
49  );
50  end component;
51 
52 
53 -- signal declarations
54 
55 
56  attribute keep : string;
57 
58 
59  signal datai_r : arr_4Xword(max_cps-1 downto 0);
60  signal din_cbl_r : T_SLV150;
61  signal din_cbla_ro_r : T_SL;
62  signal din_cblb_ro_r : T_SL;
63  signal din_cblc_ro_r : T_SL;
64  signal din_lcl_r : T_SLV48;
65  signal din_lcl_ro_r : T_SL;
66  signal dout_r : T_SLV62;
67  signal dout_ro_r : T_SL;
68 
69  signal din_cbl_rr : T_SLV150;
70  signal din_cbla_ro_rr : T_SL;
71  signal din_cblb_ro_rr : T_SL;
72  signal din_cblc_ro_rr : T_SL;
73  signal din_lcl_rr : T_SLV48;
74  signal din_lcl_ro_rr : T_SL;
75  signal dout_rr : T_SLV62;
76  signal dout_ro_rr : T_SL;
77 
78  signal cpm_occupied_map : T_SLV14;
79  signal cpm_mult : T_SLV42;
80  signal datai_corr : arr_4Xword(max_cps-1 downto 0);
81 
82  signal calc_par : calc_parity_type(max_cps-1 downto 0);
83  signal par_err : calc_parity_type(max_cps-1 downto 0);
84 
85  signal par_err_cbla_mux0 : T_SL;
86  signal par_err_cbla_mux1 : T_SL;
87  signal par_err_cblb_mux0 : T_SL;
88  signal par_err_cblb_mux1 : T_SL;
89  signal par_err_cblc_mux0 : T_SL;
90  signal par_err_cblc_mux1 : T_SL;
91 
92  signal par_calc_cbla_mux0 : T_SL;
93  signal par_calc_cbla_mux1 : T_SL;
94  signal par_calc_cblb_mux0 : T_SL;
95  signal par_calc_cblb_mux1 : T_SL;
96  signal par_calc_cblc_mux0 : T_SL;
97  signal par_calc_cblc_mux1 : T_SL;
98 
99  signal ntobs_low : ntobsA_type(max_cps-1 downto 0);
100  signal ntobs_high : ntobsA_type(max_cps-1 downto 0);
101  signal ntobs_tot : ntobstot_type(max_cps-1 downto 0);
102 
103  signal BCID_r : std_logic_vector(11 downto 0);
104 
105 
107 
108 
109 
110 
111 
112 
113 begin
114 
115  --first register all data locally, and everything except data_i doublr reg
116  --data_i_r will have parity error added synchroneously below
117  process(clk)
118  begin
119  if rising_edge(clk) then
120 
122  BCID_r<=BCID_in;
123 
124  datai_r <= datai;
125  din_cbl_r <= din_cbl;
129  din_lcl_r <= din_lcl;
131  dout_r <= dout;
132  dout_ro_r <= dout_ro;
133 
134  din_cbl_rr <= din_cbl_r;
138  din_lcl_rr <= din_lcl_r;
140  dout_rr <= dout_r;
142 
143  end if;
144  end process;
145 
146 
147 
148  par_err_i: for i in 0 to max_cps-1 generate
149  par_err_j: for j in 0 to 3 generate
150 
152  generic map (
153  width => 23
154  )
155  port map (
156  din => datai_r (i)((24*j)+22 downto 24*j),
157  parity => calc_par(i)(j)
158  );
159 
160  par_err(i)(j) <= calc_par(i)(j) xor datai_r(i)((24*j)+23); -- parity error
161 
162 
163  process(clk)
164  begin
165  if rising_edge(clk) then
166  datai_corr(i)((24*j)+23 downto 24*j) <= par_err(i)(j) & datai_r(i)((24*j)+22 downto 24*j);
167  end if;
168  end process;
169 
170 
171  end generate;
172  end generate;
173 
174 
175  calc_par_cbla_mux0 : parity_gen -- parity bit calc. (cbla,mux0)
176  generic map (
177  width => 24
178  )
179  port map (
180  din => din_cbl_r(23 downto 0),
181  parity => par_calc_cbla_mux0
182  );
183 
184  -- overflow added by Pawel Plucinski 2015-08-21
185  calc_par_cbla_mux1 : parity_gen -- parity bit calc. (cbla,mux1)
186  generic map (
187  width => 25
188  )
189  port map (
190  din => din_cbla_ro_r & din_cbl_r (47 downto 24),
191  parity => par_calc_cbla_mux1
192  );
193 
194  calc_par_cblb_mux0 : parity_gen -- parity bit calc. (cblb,mux0)
195  generic map (
196  width => 24
197  )
198  port map (
199  din => din_cbl_r(71 downto 48),
200  parity => par_calc_cblb_mux0
201  );
202 
203 
204  -- overflow added by Pawel Plucinski 2015-08-21
205  calc_par_cblb_mux1 : parity_gen -- parity bit calc. (cblb,mux1)
206  generic map (
207  width => 25
208  )
209  port map (
210  din => din_cblb_ro_r & din_cbl_r (95 downto 72),
211  parity => par_calc_cblb_mux1
212  );
213 
214  calc_par_cblc_mux0 : parity_gen -- parity bit calc. (cblc,mux0)
215  generic map (
216  width => 24
217  )
218  port map (
219  din => din_cbl_r(119 downto 96),
220  parity => par_calc_cblc_mux0
221  );
222 
223  -- overflow added by Pawel Plucinski 2015-08-21
224  calc_par_cblc_mux1 : parity_gen -- parity bit calc. (cblc,mux1)
225  generic map (
226  width => 25
227  )
228  port map (
229  din => din_cblc_ro_r & din_cbl_r (143 downto 120),
230  parity => par_calc_cblc_mux1
231  );
232 
233 
234  process(clk)
235  begin
236  if rising_edge(clk) then
237  par_err_cbla_mux0 <= par_calc_cbla_mux0 xor din_cbl_r(144); -- parity error (cbla,mux0)
238  par_err_cbla_mux1 <= par_calc_cbla_mux1 xor din_cbl_r(145); -- parity error (cbla,mux1)
239 
240  par_err_cblb_mux0 <= par_calc_cblb_mux0 xor din_cbl_r(146); -- parity error (cblb,mux0)
241  par_err_cblb_mux1 <= par_calc_cblb_mux1 xor din_cbl_r(147); -- parity error (cblb,mux1)
242 
243  par_err_cblc_mux0 <= par_calc_cblc_mux0 xor din_cbl_r(148); -- parity error (cblc,mux0)
244  par_err_cblc_mux1 <= par_calc_cblc_mux1 xor din_cbl_r(149); -- parity error (cblc,mux1)
245  end if;
246  end process;
247 
248 --
249 -- backplane data
250 --
251 
252  gen_daq_data: for i_source in 0 to max_cps-1 generate
253  data_in_daq(i_source)<=datai_corr(i_source);
254  end generate gen_daq_data;
255 
256 --
257 -- multiplicity remote, cbla
258 --
259  data_in_daq(14)(23 downto 0) <= din_cbl_rr(23 downto 0); -- 3 bit multiplicity
260  data_in_daq(14)(24) <= par_err_cbla_mux0; -- parity error
261  data_in_daq(14)(48 downto 25) <= din_cbl_rr(47 downto 24); -- 3 bit multiplicity
262  data_in_daq(14)(49) <= par_err_cbla_mux1;
263  data_in_daq(14)(50) <= din_cbla_ro_rr; -- remote overflow, cbla
264  data_in_daq(14)(95 downto 51) <= (others=>'0');
265 
266 --
267 -- multiplicity remote, cblb
268 --
269  data_in_daq(15)(23 downto 0) <= din_cbl_rr(71 downto 48); -- 3 bit multiplicity
270  data_in_daq(15)(24) <= par_err_cblb_mux0; -- parity error
271  data_in_daq(15)(48 downto 25) <= din_cbl_rr(95 downto 72); -- 3 bit multiplicity
272  data_in_daq(15)(49) <= par_err_cblb_mux1;
273  data_in_daq(15)(50) <= din_cblb_ro_rr; -- remote overflow, cblb
274  data_in_daq(15)(95 downto 51) <= (others=>'0');
275 
276 --
277 -- multiplicity remote, cblc
278 --
279  data_in_daq(16)(23 downto 0) <= din_cbl_rr(119 downto 96); -- 3 bit multiplicity
280  data_in_daq(16)(24) <= par_err_cblc_mux0; -- parity error
281  data_in_daq(16)(48 downto 25) <= din_cbl_rr(143 downto 120); -- 3 bit multiplicity
282  data_in_daq(16)(49) <= par_err_cblc_mux1;
283  data_in_daq(16)(50) <= din_cblc_ro_rr; -- remote overflow, cblc
284  data_in_daq(16)(95 downto 51) <= (others=>'0');
285 
286 --
287 -- multiplicity local
288 --
289 
290  data_in_daq(17)(23 downto 0) <= din_lcl_rr(23 downto 0); -- 3 bit multiplicity
291  data_in_daq(17)(24) <= '0';
292  data_in_daq(17)(48 downto 25) <= din_lcl_rr(47 downto 24); -- 3 bit multiplicity
293  data_in_daq(17)(49) <= '0';
294  data_in_daq(17)(50) <= din_lcl_ro_rr; -- local overflow
295  data_in_daq(17)(95 downto 51) <= (others=>'0');
296 
297 --
298 -- multiplicity global
299 --
300 
301  data_in_daq(18)(23 downto 0) <= dout_rr(23 downto 0); -- 3 bit multiplicity
302  data_in_daq(18)(24) <= '0';
303  data_in_daq(18)(48 downto 25) <= dout_rr(54 downto 31); -- 3 bit multiplicity
304  data_in_daq(18)(49) <= '0';
305  data_in_daq(18)(50) <= dout_ro_rr; -- local overflow
306  data_in_daq(18)(95 downto 51) <= (others=>'0');
307 
308 
309 --
310 -- Additional data
311 --
312 
313  data_in_daq(19)(28 downto 0) <= (others=>'0');
314  data_in_daq(19)(42 downto 29) <= cpm_occupied_map;
315  data_in_daq(19)(84 downto 43) <= cpm_mult;
316  data_in_daq(19)(95 downto 85) <= (others=>'0'); -- zero
317 
318  gen_cpm_occupied_map: for i_cpm in 0 to max_cps-1 generate
319  process(clk)
320  begin
321  if rising_edge(clk) then
322  if datai_r(i_cpm)(15 downto 0) > 0 then
323  cpm_occupied_map(i_cpm) <= '1';
324  else
325  cpm_occupied_map(i_cpm) <= '0';
326  end if;
327  end if;
328  end process;
329  end generate;
330 
331 
332 -- CPM multiplicity calc.
333 
334  gen_cpm_ntobs: for i_cpm in 0 to max_cps-1 generate
335 
336  ntobs_low(i_cpm) <= Rxpos_sort(conv_integer(datai_r(i_cpm)(7 downto 0)))(7 downto 5);
337  ntobs_high(i_cpm) <= Rxpos_sort(conv_integer(datai_r(i_cpm)(15 downto 8)))(7 downto 5);
338 
339  ntobs_tot(i_cpm)<=std_logic_vector(resize(unsigned(ntobs_low(i_cpm)),4) + resize(unsigned(ntobs_high(i_cpm)),4));
340 
341  process(clk)
342  begin
343  if rising_edge(clk) then
344  if ntobs_tot(i_cpm) > 5 then
345  cpm_mult(3*i_cpm+2 downto 3*i_cpm) <= "111";
346  else
347  cpm_mult(3*i_cpm+2 downto 3*i_cpm) <= ntobs_tot(i_cpm)(2 downto 0);
348  end if;
349  end if;
350  end process;
351 
352  end generate;
353 
354 
355 end Behavioral;
356 
in din_cbla_roT_SL
in doutT_SLV62
out data_in_daqarr_96 (19 downto 0)
ntobstot_type (max_cps - 1 downto 0) ntobs_tot
_library_ IEEEIEEE
ntobsA_type (max_cps - 1 downto 0) ntobs_high
out BCID_delayedstd_logic_vector (11 downto 0)
in din_lcl_roT_SL
in din_cblT_SLV65
in BCID_instd_logic_vector (11 downto 0)
parity_gen calc_par_icalc_par_i
arr_4Xword (max_jems - 1 downto 0) datai_r
out paritystd_logic
Definition: parity_gen.vhd:24
_library_ workwork
ntobsA_type (max_cps - 1 downto 0) ntobs_low
widthinteger :=60
Definition: parity_gen.vhd:20
std_logic_vector (11 downto 0) BCID_r
calc_parity_type (max_jems - 1 downto 0) par_err
calc_parity_type (max_jems - 1 downto 0) calc_par
in din_cblc_roT_SL
in dataiarr_4Xword (max_jems - 1 downto 0)
in din_cblb_roT_SL
in dinstd_logic_vector (width - 1 downto 0)
Definition: parity_gen.vhd:23
arr_4Xword (max_jems - 1 downto 0) datai_corr
in din_lclT_SLV60