eFEX firmware  1.7.3
ATLAS l1-calo - electron and tau feature extraction firmware for eFEX boards

Back to eFEX documentation
AlgoCore_eg.vhd
Go to the documentation of this file.
1 
39 
40 library IEEE;
41 use IEEE.STD_LOGIC_1164.all;
42 use IEEE.NUMERIC_STD.all;
43 
44 use work.DataTypes.all;
45 
46 library infrastructure_lib;
47 
49 entity AlgoCore_eg is
50  generic(
51  EG_ALGO_VERSION : std_logic_vector(1 downto 0)
52  );
53  port (CLK200 : in std_logic;
54 
55  IN_ParWs : in AlgoParameters(2 downto 0);
56  IN_ParREta : in AlgoParameters(2 downto 0);
57  IN_ParHadron : in AlgoParameters(2 downto 0);
58  IN_glob_Position : in AlgoRegister := (others => '0');
59 
61  IN_ParDeadMat_b0 : in AlgoParameter;
62  IN_ParDeadMat_b1 : in AlgoParameter;
63  IN_ParDeadMat_b2 : in AlgoParameter;
64  IN_ParDeadMat_b3 : in AlgoParameter;
65 
66  IN_Energy_threshold : in DataWord;
67  IN_Cond_threshold : in DataWord;
68 
69  IN_Data : in TriggerTowers(8 downto 0);
70 
71  OUT_TOB : out TriggerObject_eg);
72 end AlgoCore_eg;
73 
75 architecture Behavioral of AlgoCore_eg is
76 
77  signal ParREta : AlgoParameters(2 downto 0);
78  signal ParWs : AlgoParameters(2 downto 0);
79  signal ParRh : AlgoParameters(2 downto 0);
80 
81 -- Seed Finder
82  signal SF_Data : DataWords(5 downto 0);
83  signal SF_DataUp : DataWords(5 downto 0);
84  signal SF_DataDown : DataWords(5 downto 0);
85  signal SF_UpNotDown : std_logic;
86  signal SF_Seed : std_logic_vector(1 downto 0);
87  signal SF_IsLocalMax : std_logic;
88  signal SF_IsMax : std_logic;
89 
90 -- Input Multiplexer
91  signal IM_Towers : TriggerTowers(8 downto 0);
92  signal IM_EnergyL0 : DataWords(1 downto 0);
93  signal Corrected_EnergyL0 : DataWords(13 downto 0);
94  signal Corrected_EnergyL3 : DataWords(13 downto 0);
95  signal Corrected_EnergyL1 : DataWords(41 downto 0);
96  signal Corrected_EnergyL2 : DataWords(41 downto 0);
97 
98  signal IM_EnergyL1 : DataWords(5 downto 0);
99  signal IM_EnergyL2 : DataWords(5 downto 0);
100  signal IM_EnergyL3 : DataWords(1 downto 0);
101  signal IM_REtaCoreData : DataWords(5 downto 0);
102  signal IM_REtaEnvData : DataWords(14 downto 0);
103  signal IM_WsCoreData : DataWords(11 downto 0);
104  signal IM_WsEnvData : DataWords(14 downto 0);
105  signal IM_HadEnvDataL1 : DataWords(5 downto 0);
106  signal IM_HadEnvDataL2 : DataWords(5 downto 0);
107  signal IM_HadEnvDataL03 : DataWords(1 downto 0);
108  signal IM_HadCoreData : DataWords(17 downto 0);
109 
110 -- Multi Adders
111  signal MA_EnergyOverflow : std_logic;
112  signal MA_EnergySum : DataWord;
113 
114  signal MA_REtaEnvOverflow : std_logic;
115  signal MA_REtaEnvSum : DataWord;
116  signal MA_REtaCoreOverflow : std_logic;
117  signal MA_REtaCoreSum : DataWord;
118 
119  signal MA_WsEnvOverflow : std_logic;
120  signal MA_WsEnvSum : DataWord;
121  signal MA_WsCoreOverflow : std_logic;
122  signal MA_WsCoreSum : DataWord;
123 
124  signal MA_HadCoreOverflow : std_logic;
125  signal MA_HadCoreSum : DataWord;
126  signal MA_HadEnvOverflow : std_logic;
127  signal MA_HadEnvSum : DataWord;
128 
129 -- Multipliers
130  signal MU_REtaEnvOverflows : std_logic_vector(2 downto 0);
131  signal MU_WsCoreOverflows : std_logic_vector(2 downto 0);
132  signal MU_HadCoreOverflows : std_logic_vector(2 downto 0);
133 
134  signal MU_REtaEnvMult : DataWords(2 downto 0);
135  signal MU_WsCoreMult : DataWords(2 downto 0);
136  signal MU_HadCoreMult : DataWords(2 downto 0);
137 
138 -- Delays
139  signal DL_SeedFinder : std_logic_vector(4 downto 0);
140  signal DL_UpNotDown : std_logic;
141  signal DL_Seed : std_logic_vector(1 downto 0);
142  signal DL_IsLocalMax : std_logic;
143  signal DL_IsMax : std_logic;
144 
145  signal DL_Overflows : std_logic_vector(2 downto 0);
146  signal DL_REtaEnvOverflow : std_logic;
147  signal DL_WsCoreOverflow : std_logic;
148  signal DL_HadCoreOverflow : std_logic;
149 
150 -- Conditions
151  signal REtaCondition : std_logic_vector(1 downto 0) := (others => '0');
152  signal WsCondition : std_logic_vector(1 downto 0) := (others => '0');
153  signal HadCondition : std_logic_vector(1 downto 0) := (others => '0');
154  signal TOBEnergy : DataWord := (others => '0');
155  signal TOBEnergyOverflow : std_logic := '0';
156 
157  signal ConditionThr : DataWord;
158  signal ConditionThr_d : DataWord;
159  signal EnergyThr, EnergyThr_d : DataWord;
160 
161 
162  --signal DMC_a : DataWord;
163  signal DMC_b0_mask : std_logic_vector(6 downto 0);
164  signal DMC_b1_mask : std_logic_vector(6 downto 0);
165  signal DMC_b2_mask : std_logic_vector(6 downto 0);
166  signal DMC_b3_mask : std_logic_vector(6 downto 0);
167 
168  signal max_enable : std_logic;
169 
170 begin
171 -- INPUT DATA mapping
172 --
173 -- +-------+-------+-------+
174 -- | 6 | 7 | 8 |
175 -- | |0 1 2 3| |
176 -- | |* * * *| |
177 -- +-------+-------+-------+
178 -- | 3 | 4 | 5 |
179 -- |0 1 2 3|0 1 2 3|0 1 2 3|
180 -- | %|^ ^ ^ ^|% |
181 -- +-------+-------+-------+
182 -- | |0 1 2 3| |
183 -- | |* * * *| |
184 -- | 0 | 1 | 2 |
185 -- +-------+-------+-------+
186 --
187 -- ^ Used in seed finder as CORE => data(4:1)
188 -- % Used in seed finder as ENVIRONMENT => data(0) and data (5)
189 -- * Used in up or down selection
190 
191  SF_Data(4 downto 1) <= IN_Data(4).Layer2;
192  SF_Data(0) <= IN_Data(3).Layer2(3);
193  SF_Data(5) <= IN_Data(5).Layer2(0);
194 
195  SF_DataUp(0) <= IN_Data(6).Layer2(3);
196  SF_DataUp(4 downto 1) <= IN_Data(7).Layer2;
197  SF_DataUp(5) <= IN_Data(8).Layer2(0);
198 
199  SF_DataDown(0) <= IN_Data(0).Layer2(3);
200  SF_DataDown(4 downto 1) <= IN_Data(1).Layer2;
201  SF_DataDown(5) <= IN_Data(2).Layer2(0);
202 
203  IM_Towers <= IN_Data;
204 
205 -- Parameters are connected to external IPBus registers
206  ParWs <= IN_ParWs;
207  ParREta <= IN_ParREta;
208  ParRh <= IN_ParHadron;
209 
210  EnergyThr <= IN_Energy_threshold;
211  ConditionThr <= IN_Cond_threshold;
212 
213  SEED_FINDER : entity work.SeedFinder --latency 2
214  port map (
215  CLK => CLK200,
216  IN_Data => SF_Data,
217  IN_DataUp => SF_DataUp,
218  IN_DataDown => SF_DataDown,
219  OUT_UpNotDown => SF_UpNotDown,
220  OUT_Seed => SF_Seed,
221  OUT_IsLocalMax => SF_IsLocalMax,
222  OUT_IsMax => SF_IsMax
223  );
224 
225  INPUT_MULTIPLEXER : entity work.egInputMultiplexer --latency 2
226  port map (
227  CLK => CLK200,
228  IN_glob_Position => IN_glob_Position,
229  IN_Seed => SF_Seed,
230  IN_UpNotDown => SF_UpNotDown,
231  IN_Towers => IM_Towers,
232  OUT_EnergyL0 => IM_EnergyL0,
233  OUT_EnergyL1 => IM_EnergyL1,
234  OUT_EnergyL2 => IM_EnergyL2,
235  OUT_EnergyL3 => IM_EnergyL3,
236  OUT_REtaCoreData => IM_REtaCoreData,
237  OUT_REtaEnvData => IM_REtaEnvData,
238  OUT_WsCoreData => IM_WsCoreData,
239  OUT_WsEnvData => IM_WsEnvData,
240  OUT_HadCoreData => IM_HadCoreData,
241  OUT_HadEnvDataL1 => IM_HadEnvDataL1,
242  OUT_HadEnvDataL2 => IM_HadEnvDataL2,
243  OUT_HadEnvDataL03 => IM_HadEnvDataL03);
244 
245 
246 
247 ----------------------------------------------------------------------------------------------------------------------------------------------------------------
248 -- Dead Material Correction
249 ----------------------------------------------------------------------------------------------------------------------------------------------------------------
250  DEAD_MATERIAL_DELAY : entity infrastructure_lib.GeneralDelay
251  generic map (
252  delay => 4,
253  size => 28)
254  port map (
255  clk => CLK200,
256  data_in => (6 downto 0 => IN_ParDeadMat_b0(6 downto 0),
257  13 downto 7 => IN_ParDeadMat_b1(6 downto 0),
258  20 downto 14 => IN_ParDeadMat_b2(6 downto 0),
259  27 downto 21 => IN_ParDeadMat_b3(6 downto 0)),
260  data_out(6 downto 0) => DMC_b0_mask,
261  data_out(13 downto 7) => DMC_b1_mask,
262  data_out(20 downto 14) => DMC_b2_mask,
263  data_out(27 downto 21) => DMC_b3_mask
264  );
265 
266 
267  DEAD_MAT_FOR : for i in 0 to 6 generate
268  Corrected_EnergyL0(i) <= (14-i downto 0 => IM_EnergyL0(0)(15 downto i+1), others => '0') when DMC_b0_mask(i) = '1' else (others => '0');
269  Corrected_EnergyL0(i+7) <= (14-i downto 0 => IM_EnergyL0(1)(15 downto i+1), others => '0') when DMC_b0_mask(i) = '1' else (others => '0');
270 
271  Corrected_EnergyL1(i) <= (14-i downto 0 => IM_EnergyL1(0)(15 downto i+1), others => '0') when DMC_b1_mask(i) = '1' else (others => '0');
272  Corrected_EnergyL1(i+7) <= (14-i downto 0 => IM_EnergyL1(1)(15 downto i+1), others => '0') when DMC_b1_mask(i) = '1' else (others => '0');
273  Corrected_EnergyL1(i+14) <= (14-i downto 0 => IM_EnergyL1(2)(15 downto i+1), others => '0') when DMC_b1_mask(i) = '1' else (others => '0');
274  Corrected_EnergyL1(i+21) <= (14-i downto 0 => IM_EnergyL1(3)(15 downto i+1), others => '0') when DMC_b1_mask(i) = '1' else (others => '0');
275  Corrected_EnergyL1(i+28) <= (14-i downto 0 => IM_EnergyL1(4)(15 downto i+1), others => '0') when DMC_b1_mask(i) = '1' else (others => '0');
276  Corrected_EnergyL1(i+35) <= (14-i downto 0 => IM_EnergyL1(5)(15 downto i+1), others => '0') when DMC_b1_mask(i) = '1' else (others => '0');
277 
278  Corrected_EnergyL2(i) <= (14-i downto 0 => IM_EnergyL2(0)(15 downto i+1), others => '0') when DMC_b2_mask(i) = '1' else (others => '0');
279  Corrected_EnergyL2(i+7) <= (14-i downto 0 => IM_EnergyL2(1)(15 downto i+1), others => '0') when DMC_b2_mask(i) = '1' else (others => '0');
280  Corrected_EnergyL2(i+14) <= (14-i downto 0 => IM_EnergyL2(2)(15 downto i+1), others => '0') when DMC_b2_mask(i) = '1' else (others => '0');
281  Corrected_EnergyL2(i+21) <= (14-i downto 0 => IM_EnergyL2(3)(15 downto i+1), others => '0') when DMC_b2_mask(i) = '1' else (others => '0');
282  Corrected_EnergyL2(i+28) <= (14-i downto 0 => IM_EnergyL2(4)(15 downto i+1), others => '0') when DMC_b2_mask(i) = '1' else (others => '0');
283  Corrected_EnergyL2(i+35) <= (14-i downto 0 => IM_EnergyL2(5)(15 downto i+1), others => '0') when DMC_b2_mask(i) = '1' else (others => '0');
284 
285  Corrected_EnergyL3(i) <= (14-i downto 0 => IM_EnergyL3(0)(15 downto i+1), others => '0') when DMC_b3_mask(i) = '1' else (others => '0');
286  Corrected_EnergyL3(i+7) <= (14-i downto 0 => IM_EnergyL3(1)(15 downto i+1), others => '0') when DMC_b3_mask(i) = '1' else (others => '0');
287 
288  end generate DEAD_MAT_FOR;
289 
290 
291 -------------------------------------------------------------------------------
292 -- ADDERS
293 -------------------------------------------------------------------------------
294 
295 -- Energy
296  MULTI_ADDER_ENERGY : entity work.MultiAdder
297  generic map (
298  stage => 7,
299  delay => 0)
300  port map (
301  CLK => CLK200,
302  IN_Words => IM_EnergyL0 & IM_EnergyL1&IM_EnergyL2&IM_EnergyL3 & Corrected_EnergyL0 &
303  Corrected_EnergyL1 & Corrected_EnergyL2 & Corrected_EnergyL3, --128
304  OUT_Overflow => MA_EnergyOverflow,
305  OUT_Word => MA_EnergySum);
306 
307 -- REta
308  MULTI_ADDER_RETA_ENV : entity work.MultiAdder
309  generic map (
310  stage => 4,
311  delay => 0)
312  port map (
313  CLK => CLK200,
314  IN_Words => IM_REtaEnvData & ZERO_DATA_WORD , -- 15+1
315  OUT_Overflow => MA_REtaEnvOverflow,
316  OUT_Word => MA_REtaEnvSum);
317 
318  MULTI_ADDER_RETA_CORE : entity work.MultiAdder
319  generic map (
320  stage => 3,
321  delay => 4)
322  port map (
323  CLK => CLK200,
324  IN_Words => IM_REtaCoreData & ZERO_DATA_WORD&ZERO_DATA_WORD , -- 6+2
325  OUT_Overflow => MA_REtaCoreOverflow,
326  OUT_Word => MA_REtaCoreSum);
327 
328 --Ws
329  MULTI_ADDER_WS_CORE : entity work.MultiAdder
330  generic map (
331  stage => 4,
332  delay => 0)
333  port map (
334  CLK => CLK200,
335  IN_Words => IM_WsCoreData&ZERO_DATA_WORD&ZERO_DATA_WORD&ZERO_DATA_WORD&ZERO_DATA_WORD, --12+4
336  OUT_Overflow => MA_WsCoreOverflow,
337  OUT_Word => MA_WsCoreSum);
338 
339  MULTI_ADDER_WS_ENV : entity work.MultiAdder
340  generic map (
341  stage => 4,
342  delay => 3)
343  port map (
344  CLK => CLK200,
345  IN_Words => IM_WsEnvData &ZERO_DATA_WORD , --15+1
346  OUT_Overflow => MA_WsEnvOverflow,
347  OUT_Word => MA_WsEnvSum);
348 
349 --Hadron
350  MULTI_ADDER_HAD_CORE : entity work.MultiAdder
351  generic map (
352  stage => 4,
353  delay => 0)
354  port map (
355  CLK => CLK200,
356  IN_Words => IM_HadCoreData(13 downto 0)&ZERO_DATA_WORD&ZERO_DATA_WORD,
357  OUT_Overflow => MA_HadCoreOverflow,
358  OUT_Word => MA_HadCoreSum);
359 
360  MULTI_ADDER_HAD_ENV : entity work.MultiAdder
361  generic map (
362  stage => 4,
363  delay => 3)
364  port map (
365  CLK => CLK200,
366  IN_Words => IM_HadEnvDataL1&IM_HadEnvDataL2&IM_HadEnvDataL03&ZERO_DATA_WORD&ZERO_DATA_WORD, --14+2
367  OUT_Overflow => MA_HadEnvOverflow,
368  OUT_Word => MA_HadEnvSum);
369 
370 
371 -------------------------------------------------------------------------------
372 -- MULTIPLIERS
373 -------------------------------------------------------------------------------
374 
375 -- REta
376  RETA_MULTIPLIER : entity work.MultiMultiplier --delay 3
377  generic map (parameters => 3)
378  port map (
379  CLK => CLK200,
380  IN_Word => MA_REtaEnvSum,
381  IN_parameters => ParREta,
382  OUT_Overflow => MU_REtaEnvOverflows,
383  OUT_Words => MU_REtaEnvMult
384  );
385 
386 -- Ws
387  WS_MULTIPLIER : entity work.MultiMultiplier --delay 3
388  generic map (parameters => 3)
389  port map (
390  CLK => CLK200,
391  IN_Word => MA_WsCoreSum,
392  IN_parameters => ParWs,
393  OUT_Overflow => MU_WsCoreOverflows,
394  OUT_Words => MU_WsCoreMult
395  );
396 
397 --hadronic
398  HADRON_MULTIPLIER : entity work.MultiMultiplier --delay 3
399  port map (
400  CLK => CLK200,
401  IN_Word => MA_HadCoreSum,
402  IN_parameters => ParRh,
403  OUT_Overflow => MU_HadCoreOverflows,
404  OUT_Words => MU_HadCoreMult
405  );
406 
407  Condition_threshold_delay : entity work.Delay
408  generic map (
409  delay => 4)
410  port map (
411  CLK => CLK200,
412  IN_Word => ConditionThr,
413  OUT_Word => ConditionThr_d);
414 
415  Energy_threshold_delay : entity work.Delay
416  generic map (
417  delay => 3)
418  port map (
419  CLK => CLK200,
420  IN_Word => EnergyThr,
421  OUT_Word => EnergyThr_d);
422 
423 -------------------------------------------------------------------------------
424 -- SEED AND OVERFLOWS DELAY
425 -------------------------------------------------------------------------------
426 
427  SEED_DELAY : entity infrastructure_lib.GeneralDelay
428  generic map (
429  delay => 9,
430  size => 5)
431  port map (
432  clk => CLK200,
433  data_in => (0 => SF_IsMax, 1 => SF_IsLocalMax, 2 => SF_UpNotDown, 4 downto 3 => SF_Seed),
434  data_out => DL_SeedFinder
435  );
436 
437 
438  DL_IsMax <= DL_SeedFinder(0);
439  DL_IsLocalMax <= DL_SeedFinder(1);
440  DL_UpNotDown <= DL_SeedFinder(2);
441  DL_Seed <= DL_SeedFinder(4 downto 3);
442 
443  OVERFLOW_DELAY : entity infrastructure_lib.GeneralDelay
444  generic map (
445  delay => 2,
446  size => 3)
447  port map (
448  clk => CLK200,
449  data_in => (0 => MA_REtaEnvOverflow, 1 => MA_WsCoreOverflow, 2 => MA_HadCoreOverflow),
450  data_out => DL_Overflows
451  );
452 
453  DL_REtaEnvOverflow <= DL_Overflows(0);
454  DL_WsCoreOverflow <= DL_Overflows(1);
455  DL_HadCoreOverflow <= DL_Overflows(2);
456 
457 -----------------------------------------------------------------------------
458 -- TRIGGER-OBJECT CONDITIONS
459 -----------------------------------------------------------------------------
460  CONDITIONS : process (CLK200)
461  variable RetaShifted, WsShifted, HadShifted : DataWord;
462  begin
463  if rising_edge(CLK200) then
464  -- add energhy threshold here
465  if MA_EnergyOverflow = '1' then
466  TOBEnergy <= (others => '1');
467  TOBEnergyOverflow <= MA_EnergyOverflow;
468  max_enable <= '1';
469  elsif MA_EnergySum < EnergyThr_d then
470  TOBEnergy <= (others => '0');
471  TOBEnergyOverflow <= '0';
472  max_enable <= '0';
473  else
474  TOBEnergy <= MA_EnergySum;
475  TOBEnergyOverflow <= MA_EnergyOverflow;
476  max_enable <= '1';
477  end if;
478 
479 
480  -- REta condition
481  RetaShifted := BitLeftShift(MA_REtaCoreSum, 3);
482 
483  REtaCondition <= EvaluateCondition (
484  Pass_overflow => MA_REtaCoreOverflow,
485  Fail_overflow => DL_REtaEnvOverflow,
486  E_threshold => ConditionThr_d,
487  Total_Energy => MA_EnergySum,
488  Total_Energy_of => MA_EnergyOverflow,
489  Condition_Energy => RetaShifted,
490  Thresholds => MU_REtaEnvMult,
491  Thresholds_overflows => MU_REtaEnvOverflows);
492 
493  -- Ws condition
494  WsShifted := BitLeftShift(MA_WsEnvSum, 5);
495  WsCondition <= EvaluateCondition (
496  Pass_overflow => MA_WsEnvOverflow,
497  Fail_overflow => DL_WsCoreOverflow,
498  E_threshold => ConditionThr_d,
499  Total_Energy_of => MA_EnergyOverflow,
500  Total_Energy => MA_EnergySum,
501  Condition_Energy => WsShifted,
502  Thresholds => MU_WsCoreMult,
503  Thresholds_overflows => MU_WsCoreOverflows);
504 
505  -- hadronic conditions
506  HadShifted := BitLeftShift(MA_HadEnvSum, 3);
507  HadCondition <= EvaluateCondition (
508  Pass_overflow => MA_HadEnvOverflow,
509  Fail_overflow => DL_HadCoreOverflow,
510  E_threshold => ConditionThr_d,
511  Total_Energy_of => MA_EnergyOverflow,
512  Total_Energy => MA_EnergySum,
513  Condition_Energy => HadShifted,
514  Thresholds => MU_HadCoreMult,
515  Thresholds_overflows => MU_HadCoreOverflows);
516 
517  end if;
518  end process;
519 
520 -- TOB building
521  OUT_TOB.Core.Version <= EG_ALGO_VERSION;
522  OUT_TOB.Core.Energy <= to_TOBEnergy(TOBEnergy);
523  OUT_TOB.Core.EnergyOF <= TOBEnergyOverflow;
524  OUT_TOB.Core.REta <= REtaCondition;
525  OUT_TOB.Core.ws <= WsCondition;
526  OUT_TOB.Core.Had <= HadCondition;
527  OUT_TOB.Core.UpNotDown <= DL_UpNotDown;
528  OUT_TOB.Core.Seed <= DL_Seed;
529  OUT_TOB.Core.Max <= DL_IsMax;
530  OUT_TOB.Core.LocalMax <= DL_IsLocalMax and max_enable;
531  OUT_TOB.Position.Eta <= (others => '0');
532  OUT_TOB.Position.Phi <= (others => '0');
533 
534 end Behavioral;
Core of the electromagnetic algorithm.
Definition: AlgoCore_eg.vhd:75
Core of the electromagnetic algorithm.
Definition: AlgoCore_eg.vhd:49
in IN_ParDeadMat_b0 AlgoParameter
enable bit mask for material correction
Definition: AlgoCore_eg.vhd:61
Daly for data word format.
Definition: Delay.vhd:16
Shift register for data delay.
Multiple Adder: adds many input words in cascade.
Definition: MultiAdder.vhd:20
in CLK std_logic
200 MHz clock
Definition: MultiAdder.vhd:26
Seed Finder for the electromagnetic algorithm.
Definition: SeedFinder.vhd:22
Input Data Multiplexer for eg: addresses SuperCells to the correct sum area.
in CLK std_logic
200 MHz clock