CMX
CMX firmware code in-line documentation
 All Classes Namespaces Files Functions Variables
daq_collector.vhd
Go to the documentation of this file.
1 
9 
10 
11 library IEEE;
12 use IEEE.STD_LOGIC_1164.ALL;
13 use IEEE.NUMERIC_STD.ALL;
14 use IEEE.STD_LOGIC_UNSIGNED.ALL;
15 use IEEE.STD_LOGIC_ARITH.CONV_STD_LOGIC_VECTOR;
16 
17 LIBRARY work;
18 use work.CMXpackage.all;
19 use work.CMX_flavor_package.all;
20 
21 
22 entity daq_collector is
23  port (
24  clk : in T_SL;
25  datai : in arr_4Xword(max_jems-1 downto 0);
26  din_cbl : in T_SLV65;
27  din_cbl_ro : in T_SL;
28  din_lcl : in T_SLV60;
29  din_lcl_ro : in T_SL;
30  dout : in T_SLV62;
31  dout_ro : in T_SL;
32  data_in_daq : out arr_96(19 downto 0);
33  BCID_in : in std_logic_vector(11 downto 0);
34  BCID_delayed : out std_logic_vector(11 downto 0)
35  );
36 end daq_collector;
37 
38 architecture Behavioral of daq_collector is
39 
40  component parity_gen
41  GENERIC(
42  width : integer := 60
43  );
44  PORT(
45  din : IN std_logic_vector (width-1 downto 0) ;
46  parity : OUT std_logic
47  );
48  end component;
49 
50 
51 -- signal declarations
52 
53 
54  attribute keep : string;
55 
56 
57  signal datai_r : arr_4Xword(max_jems-1 downto 0);
58  signal din_cbl_r : T_SLV65;
59  signal din_cbl_ro_r : T_SL;
60  signal din_lcl_r : T_SLV60;
61  signal din_lcl_ro_r : T_SL;
62  signal dout_r : T_SLV62;
63  signal dout_ro_r : T_SL;
64 
65  signal din_cbl_rr : T_SLV65;
66  signal din_cbl_ro_rr : T_SL;
67  signal din_lcl_rr : T_SLV60;
68  signal din_lcl_ro_rr : T_SL;
69  signal dout_rr : T_SLV62;
70  signal dout_ro_rr : T_SL;
71 
72  signal jem_occupied_map : std_logic_vector(15 downto 0);
73  signal jem_mult : std_logic_vector(47 downto 0);
74  signal datai_corr : arr_4Xword(max_jems-1 downto 0);
75 
76  signal calc_par : calc_parity_type(max_jems-1 downto 0);
77  signal par_err : calc_parity_type(max_jems-1 downto 0);
78 
79  signal par_err_0 : T_SL;
80  signal par_err_1 : T_SL;
81  signal par_err_2 : T_SL;
82  signal par_err_3 : T_SL;
83 
84  signal par_calc_0 : T_SL;
85  signal par_calc_1 : T_SL;
86  signal par_calc_2 : T_SL;
87  signal par_calc_3 : T_SL;
88 
89  signal BCID_r : std_logic_vector(11 downto 0);
90 
91 
92  attribute keep of datai_r, din_cbl_r, din_cbl_ro_r, din_lcl_r, din_lcl_ro_r, dout_r, dout_ro_r : signal is "TRUE";
93 
94 
95 
96 begin
97 
98  --first register all data locally, and everything except data_i doublr reg
99  --data_i_r will have parity error added synchroneously below
100  process(clk)
101  begin
102  if rising_edge(clk) then
103 
105  BCID_r<=BCID_in;
106 
107  datai_r <= datai;
108  din_cbl_r <= din_cbl;
110  din_lcl_r <= din_lcl;
112  dout_r <= dout;
113  dout_ro_r <= dout_ro;
114 
115  din_cbl_rr <= din_cbl_r;
117  din_lcl_rr <= din_lcl_r;
119  dout_rr <= dout_r;
121 
122  end if;
123  end process;
124 
125 
126  par_err_i: for i in 0 to max_jems-1 generate
127  par_err_j: for j in 0 to 3 generate
128 
130  generic map (
131  width => 23
132  )
133  port map (
134  din => datai_r (i)((24*j)+22 downto 24*j),
135  parity => calc_par(i)(j)
136  );
137 
138  par_err(i)(j) <= calc_par(i)(j) xor datai_r(i)((24*j)+23); -- parity error
139 
140 
141  process(clk)
142  begin
143  if rising_edge(clk) then
144  datai_corr(i)((24*j)+23 downto 24*j) <= par_err(i)(j) & datai_r(i)((24*j)+22 downto 24*j);
145  end if;
146  end process;
147 
148 
149  end generate;
150  end generate;
151 
152  calc_par_cbl_0 : parity_gen -- parity bit calc. (cbl)
153  generic map (
154  width => 15
155  )
156  port map (
157  din => din_cbl_r(14 downto 0),
158  parity => par_calc_0
159  );
160 
161  --
162  -- overflow bit added by Pawel Plucinski 2015-08-21
163  --
165  generic map (
166  width => 16
167  )
168  port map (
169  din => din_cbl_ro_r & din_cbl_r (29 downto 15),
170  parity => par_calc_1
171  );
172 
174  generic map (
175  width => 16
176  )
177  port map (
178  din => din_cbl_r(45 downto 30),
179  parity => par_calc_2
180  );
181 
183  generic map (
184  width => 14
185  )
186  port map (
187  din => din_cbl_r(59 downto 46),
188  parity => par_calc_3
189  );
190 
191 
192  process(clk)
193  begin
194  if rising_edge(clk) then
195  par_err_0 <= par_calc_0 xor din_cbl_r(60); -- parity error (cbl)
196  par_err_1 <= par_calc_1 xor din_cbl_r(61);
197  par_err_2 <= par_calc_2 xor din_cbl_r(62);
198  par_err_3 <= par_calc_3 xor din_cbl_r(63);
199  end if;
200  end process;
201 
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 -- multiplicity remote
210 --
211  data_in_daq(16)(14 downto 0) <= din_cbl_rr(14 downto 0); -- 3 bit multiplicity
212  data_in_daq(16)(15) <= par_err_0; -- parity error
213  data_in_daq(16)(30 downto 16) <= din_cbl_rr(29 downto 15); -- 3 bit multiplicity
214  data_in_daq(16)(31) <= par_err_1;
215  data_in_daq(16)(47 downto 32) <= din_cbl_rr(45 downto 30); -- 2 bit multiplicity
216  data_in_daq(16)(48) <= par_err_2;
217  data_in_daq(16)(62 downto 49) <= din_cbl_rr(59 downto 46); -- 2 bit multiplicity
218  data_in_daq(16)(63) <= par_err_3;
219  data_in_daq(16)(64) <= din_cbl_ro_rr; -- remote overflow
220  data_in_daq(16)(95 downto 65) <= (others=>'0');
221 
222 --
223 -- multiplicity local
224 --
225 
226  data_in_daq(17)(14 downto 0) <= din_lcl_rr(14 downto 0); -- 3 bit multiplicity
227  data_in_daq(17)(15) <= '0';
228  data_in_daq(17)(30 downto 16) <= din_lcl_rr(29 downto 15); -- 3 bit multiplicity
229  data_in_daq(17)(31) <= '0';
230  data_in_daq(17)(47 downto 32) <= din_lcl_rr(45 downto 30); -- 2 bit multiplicity
231  data_in_daq(17)(48) <= '0';
232  data_in_daq(17)(62 downto 49) <= din_lcl_rr(59 downto 46); -- 2 bit multiplicity
233  data_in_daq(17)(63) <= '0';
234  data_in_daq(17)(64) <= din_lcl_ro_rr; -- local overflow
235  data_in_daq(17)(95 downto 65) <= (others=>'0');
236 
237 --
238 -- multiplicity global
239 --
240 
241  data_in_daq(18)(14 downto 0) <= dout_rr(14 downto 0); -- 3 bit multiplicity
242  data_in_daq(18)(15) <= '0';
243  data_in_daq(18)(30 downto 16) <= dout_rr(29 downto 15); -- 3 bit multiplicity
244  data_in_daq(18)(31) <= '0';
245  data_in_daq(18)(47 downto 32) <= dout_rr(46 downto 31); -- 2 bit multiplicity
246  data_in_daq(18)(48) <= '0';
247  data_in_daq(18)(62 downto 49) <= dout_rr(60 downto 47); -- 2 bit multiplicity
248  data_in_daq(18)(63) <= '0';
249  data_in_daq(18)(64) <= dout_ro_rr; -- global overflow
250  data_in_daq(18)(95 downto 65) <= (others=>'0');
251 
252 --
253 -- Additional data
254 --
255 
256  data_in_daq(19)(28 downto 0) <= (others=>'0');
257  data_in_daq(19)(44 downto 29) <= jem_occupied_map;
258  data_in_daq(19)(92 downto 45) <= jem_mult;
259  data_in_daq(19)(95 downto 93) <= (others=>'0'); -- zero
260 
261  gen_jem_occupied_map: for i_jem in 0 to max_jems-1 generate
262  process(clk)
263  begin
264  if rising_edge(clk) then
265  if datai_r(i_jem)(7 downto 0) > 0 then
266  jem_occupied_map(i_jem) <= '1';
267  else
268  jem_occupied_map(i_jem) <= '0';
269  end if;
270  end if;
271  end process;
272  end generate;
273 
274 
275  gen_jem_ntobs: for i_jem in 0 to max_jems-1 generate
276 
277  process(clk)
278  begin
279  if rising_edge(clk) then
280  jem_mult((3*i_jem)+2 downto 3*i_jem) <= ofwntobs(conv_integer(datai_r(i_jem)(7 downto 0)))(2 downto 0);
281  end if;
282  end process;
283 
284  end generate;
285 
286 
287 end Behavioral;
288 
in doutT_SLV62
parity_gen calc_par_cbl_2calc_par_cbl_2
out data_in_daqarr_96 (19 downto 0)
_library_ IEEEIEEE
Definition: compExch.vhd:12
out BCID_delayedstd_logic_vector (11 downto 0)
parity_gen calc_par_cbl_1calc_par_cbl_1
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
parity_gen calc_par_cbl_3calc_par_cbl_3
std_logic_vector (15 downto 0) jem_occupied_map
std_logic_vector (47 downto 0) jem_mult
widthinteger :=60
Definition: parity_gen.vhd:20
in din_cbl_roT_SL
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)
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