CMX
CMX firmware code in-line documentation
 All Classes Namespaces Files Functions Variables
daq_collector.vhd
Go to the documentation of this file.
1 ----------------------------------------------------------------------------------
8 ----------------------------------------------------------------------------------
9 library IEEE;
10 use IEEE.STD_LOGIC_1164.ALL;
11 use IEEE.NUMERIC_STD.ALL;
12 use IEEE.STD_LOGIC_UNSIGNED.ALL;
13 use IEEE.STD_LOGIC_ARITH.CONV_STD_LOGIC_VECTOR;
14 
15 LIBRARY work;
16 use work.CMXpackage.all;
17 use work.CMX_flavor_package.all;
18 
19 
20 entity daq_collector is
21  port (
22  clk : in std_logic;
23  datai : in arr_4Xword(max_jems-1 downto 0);
24  energy_remote : in std_logic_vector(26*4-1 downto 0);
25  energy_local : in std_logic_vector(26*4-1 downto 0);
26  energy_total : in arr_ctr_15bit(5 downto 0);
27  energy_ovflw : in std_logic_vector(5 downto 0);
28  energy_extra0 : in std_logic_vector(23 downto 0);
29  energy_extra1 : in std_logic_vector(23 downto 0);
30  data_in_daq : out arr_96(19 downto 0);
31  BCID_in : in std_logic_vector(11 downto 0);
32  BCID_delayed : out std_logic_vector(11 downto 0));
33 end daq_collector;
34 
35 architecture Behavioral of daq_collector is
36 
37  component parity_gen
38  GENERIC(
39  width : integer := 60
40  );
41  PORT(
42  din : IN std_logic_vector (width-1 downto 0) ;
43  parity : OUT std_logic
44  );
45  end component;
46 
47 -- signal declarations
48 
49  attribute keep : string;
50 
51  signal datai_r : arr_4Xword(max_jems-1 downto 0);
52  signal energy_remote_r : std_logic_vector(26*4-1 downto 0);
53  signal energy_remote_rr : std_logic_vector(26*4-1 downto 0);
54  signal energy_local_r : std_logic_vector(26*4-1 downto 0);
55  signal energy_local_rr : std_logic_vector(26*4-1 downto 0);
56  signal energy_total_r : arr_ctr_15bit(5 downto 0);
57  signal energy_total_rr : arr_ctr_15bit(5 downto 0);
58  signal energy_ovflw_r : std_logic_vector(5 downto 0);
59  signal energy_ovflw_rr : std_logic_vector(5 downto 0);
60  signal energy_extra0_r : std_logic_vector(23 downto 0);
61  signal energy_extra1_r : std_logic_vector(23 downto 0);
62  signal energy_extra0_rr : std_logic_vector(23 downto 0);
63  signal energy_extra1_rr : std_logic_vector(23 downto 0);
64 
65  signal datai_corr : arr_4Xword(max_jems-1 downto 0);
66  signal calc_par : calc_parity_type(max_jems-1 downto 0);
67  signal par_err : calc_parity_type(max_jems-1 downto 0);
68 
69  signal par_calc_cbla_mux0 : std_logic;
70  signal par_calc_cbla_mux1 : std_logic;
71  signal par_calc_cblb_mux0 : std_logic;
72  signal par_calc_cblb_mux1 : std_logic;
73 
74  signal par_err_cbla_mux0 : std_logic;
75  signal par_err_cbla_mux1 : std_logic;
76  signal par_err_cblb_mux0 : std_logic;
77  signal par_err_cblb_mux1 : std_logic;
78 
79  signal BCID_r : std_logic_vector(11 downto 0);
80 
81 
83 
84 
85 begin
86 
87  --first register all data locally, and everything except data_i doublr reg
88  --data_i_r will have parity error added synchroneously below
89  process(clk)
90  begin
91  if rising_edge(clk) then
92 
94  BCID_r<=BCID_in;
95 
96  datai_r <= datai;
103 
104 
111 
112  end if;
113  end process;
114 
115 
116  par_err_i: for i in 0 to max_jems-1 generate
117  par_err_j: for j in 0 to 3 generate
118 
120  generic map (
121  width => 23
122  )
123  port map (
124  din => datai_r (i)((24*j)+22 downto 24*j),
125  parity => calc_par(i)(j)
126  );
127 
128  par_err(i)(j) <= calc_par(i)(j) xor datai_r(i)((24*j)+23); -- parity error
129 
130 
131  process(clk)
132  begin
133  if rising_edge(clk) then
134  datai_corr(i)((24*j)+23 downto 24*j) <= par_err(i)(j) & datai_r(i)((24*j)+22 downto 24*j);
135  end if;
136  end process;
137 
138 
139  end generate;
140  end generate;
141 
142 
143  calc_par_cbla_mux0 : parity_gen -- parity bit calc. (cbla,mux0)
144  generic map (
145  width => 25
146  )
147 
148 
149  port map (
150  din => energy_remote_r(24 downto 0),
151  parity => par_calc_cbla_mux0
152  );
153 
154  calc_par_cbla_mux1 : parity_gen -- parity bit calc. (cbla,mux1)
155  generic map (
156  width => 25
157  )
158  port map (
159  din => energy_remote_r(50 downto 26),
160  parity => par_calc_cbla_mux1
161  );
162 
163  -- overflow bit added by Pawel Plucinski 2015-08-21
164  calc_par_cblb_mux0 : parity_gen -- parity bit calc. (cblb,mux0)
165  generic map (
166  width => 23
167  )
168  port map (
169  din => energy_remote_r(74) & -- overflow YR
170  energy_remote_r(73) & -- overflow XR
171  energy_remote_r(72) & -- overflow Y
172  energy_remote_r(71) & -- overflow X
173  energy_remote_r(70 downto 52),
174  parity => par_calc_cblb_mux0
175  );
176 
177  -- overflow bit added by Pawel Plucinski 2015-08-21
178  calc_par_cblb_mux1 : parity_gen -- parity bit calc. (cblb,mux1)
179  generic map (
180  width => 21
181  )
182  port map (
183  din => energy_remote_r(98) & -- overflow TR
184  energy_remote_r(97) & -- overflow T
185  energy_remote_r(96 downto 78),
186  parity => par_calc_cblb_mux1
187  );
188 
189  process(clk)
190  begin
191  if rising_edge(clk) then
192  par_err_cbla_mux0 <= par_calc_cbla_mux0 xor energy_remote_r(25); -- parity error (cbla,mux0)
193  par_err_cbla_mux1 <= par_calc_cbla_mux1 xor energy_remote_r(51); -- parity error (cbla,mux1)
194 
195  par_err_cblb_mux0 <= par_calc_cblb_mux0 xor energy_remote_r(77); -- parity error (cblb,mux0)
196  par_err_cblb_mux1 <= par_calc_cblb_mux1 xor energy_remote_r(103); -- parity error (cblb,mux1)
197  end if;
198  end process;
199 
200 --
201 -- backplane data
202 --
203 
204  gen_daq_data: for i_source in 0 to max_jems-1 generate
205  data_in_daq(i_source)<=datai_corr(i_source);
206  end generate gen_daq_data;
207 
208 --
209 -- remote energy
210 --
211  data_in_daq(16)(14 downto 0) <= energy_remote_rr(14 downto 0); -- Ex(15b)
212  data_in_daq(16)(15) <= par_err_cbla_mux0; -- parity error, cbla, mux0
213  data_in_daq(16)(30 downto 16) <= energy_remote_rr(40 downto 26); -- Ex(restricted eta range,15b)
214  data_in_daq(16)(31) <= par_err_cbla_mux1; -- parity error (cbla,mux1)
215  data_in_daq(16)(32) <= energy_remote_rr(71); -- overflow Ex
216 
217  data_in_daq(16)(47 downto 33) <= energy_remote_rr(66 downto 52); -- Ey(15b)
218  data_in_daq(16)(48) <= par_err_cblb_mux0; -- parity error, cblb, mux0
219  data_in_daq(16)(63 downto 49) <= energy_remote_rr(92 downto 78); -- Ey(restricted eta range,15b)
220  data_in_daq(16)(64) <= par_err_cblb_mux1; -- parity error (cblb,mux1)
221  data_in_daq(16)(65) <= energy_remote_rr(72); -- Overflow Ey
222 
223  data_in_daq(16)(75 downto 66) <= energy_remote_rr(24 downto 15); -- Et(10b)
224  data_in_daq(16)(79 downto 76) <= energy_remote_rr(70 downto 67); -- Et(4b)
225  data_in_daq(16)(80) <= '0'; -- zero
226  data_in_daq(16)(90 downto 81) <= energy_remote_rr(50 downto 41); -- Et(weighted,10b)
227  data_in_daq(16)(94 downto 91) <= energy_remote_rr(96 downto 93); -- Et(weighted,4b)
228  data_in_daq(16)(95) <= energy_remote_rr(97); -- Overflow Et
229 
230 --
231 -- energy local
232 --
233 
234  data_in_daq(17)(14 downto 0) <= energy_local_rr(14 downto 0); -- Ex(15b)
235  data_in_daq(17)(15) <= '0';
236  data_in_daq(17)(30 downto 16) <= energy_local_rr(40 downto 26); -- Ex(restricted eta range,15b)
237  data_in_daq(17)(31) <= '0';
238  data_in_daq(17)(32) <= energy_local_rr(71); -- overflow Ex
239 
240  data_in_daq(17)(47 downto 33) <= energy_local_rr(66 downto 52); -- Ey(15b)
241  data_in_daq(17)(48) <= '0';
242  data_in_daq(17)(63 downto 49) <= energy_local_rr(92 downto 78); -- Ey(restricted eta range,15b)
243  data_in_daq(17)(64) <= '0';
244  data_in_daq(17)(65) <= energy_local_rr(72); -- Overflow Ey
245 
246  data_in_daq(17)(75 downto 66) <= energy_local_rr(24 downto 15); -- Et(10b)
247  data_in_daq(17)(79 downto 76) <= energy_local_rr(70 downto 67); -- Et(4b)
248  data_in_daq(17)(80) <= '0'; -- zero
249  data_in_daq(17)(90 downto 81) <= energy_local_rr(50 downto 41); -- Et(weighted,10b)
250  data_in_daq(17)(94 downto 91) <= energy_local_rr(96 downto 93); -- Et(weighted,4b)
251  data_in_daq(17)(95) <= energy_local_rr(97); -- Overflow Et
252 
253 --
254 -- energy global
255 --
256 -- 0 - sum ex ; 1 - sum ey, 2 - sum et
257 -- 3 - res sum ex ; 4 - res sum ey, 5 - res sum et
258 
259  data_in_daq(18)(14 downto 0) <= std_logic_vector(energy_total_rr(0)); -- Ex(15b)
260  data_in_daq(18)(15) <= '0';
261  data_in_daq(18)(30 downto 16) <= std_logic_vector(energy_total_rr(3)); -- Ex(Res,15b)
262  data_in_daq(18)(31) <= '0';
263  data_in_daq(18)(32) <= energy_ovflw_rr(0); -- Overflow Ex
264 
265  data_in_daq(18)(47 downto 33) <= std_logic_vector(energy_total_rr(1)); -- Ey
266  data_in_daq(18)(48) <= '0';
267  data_in_daq(18)(63 downto 49) <= std_logic_vector(energy_total_rr(4)); -- Ey(Res,15b)
268  data_in_daq(18)(64) <= energy_ovflw_rr(2); -- Overflow Et;
269  data_in_daq(18)(65) <= energy_ovflw_rr(1); -- Overflow Ey
270 
271  data_in_daq(18)(80 downto 66) <= std_logic_vector(energy_total_rr(2)); -- Et(15b)
272  data_in_daq(18)(95 downto 81) <= std_logic_vector(energy_total_rr(5)); -- Et(Res,15b)
273 
274 --
275 -- energy extra and results
276 --
277 
278  data_in_daq(19)(12 downto 0) <= (others =>'0');
279  data_in_daq(19)(36 downto 13) <= energy_extra0_rr(23 downto 0);
280  data_in_daq(19)(52 downto 37) <= energy_extra1_rr(15 downto 0);
281  data_in_daq(19)(95 downto 53) <= (others =>'0');
282 
283 
284 end Behavioral;
285 
arr_ctr_15bit (5 downto 0) energy_total_rr
out data_in_daqarr_96 (19 downto 0)
_library_ IEEEIEEE
std_logic_vector (26 * 4 - 1 downto 0) energy_remote_r)
std_logic_vector (23 downto 0) energy_extra0_rr
out BCID_delayedstd_logic_vector (11 downto 0)
std_logic_vector (5 downto 0) energy_ovflw_r
in energy_extra1std_logic_vector (23 downto 0)
std_logic_vector (26 * 4 - 1 downto 0) energy_local_rr)
in energy_extra0std_logic_vector (23 downto 0)
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
arr_ctr_15bit (5 downto 0) energy_total_r
std_logic_vector (26 * 4 - 1 downto 0) energy_remote_rr)
std_logic_vector (23 downto 0) energy_extra0_r
_library_ workwork
std_logic_vector (23 downto 0) energy_extra1_r
in energy_localstd_logic_vector (26 * 4 - 1 downto 0)
std_logic_vector (5 downto 0) energy_ovflw_rr
widthinteger :=60
Definition: parity_gen.vhd:20
in energy_totalarr_ctr_15bit (5 downto 0)
in energy_ovflwstd_logic_vector (5 downto 0)
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 dataiarr_4Xword (max_jems - 1 downto 0)
std_logic_vector (23 downto 0) energy_extra1_rr
in energy_remotestd_logic_vector (26 * 4 - 1 downto 0)
std_logic_vector (26 * 4 - 1 downto 0) energy_local_r)
in dinstd_logic_vector (width - 1 downto 0)
Definition: parity_gen.vhd:23
arr_4Xword (max_jems - 1 downto 0) datai_corr