41 use IEEE.STD_LOGIC_1164.
all;
42 use IEEE.NUMERIC_STD.
all;
46 library infrastructure_lib;
51 EG_ALGO_VERSION : std_logic_vector(1 downto 0)
53 port (CLK200 : in std_logic;
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');
62 IN_ParDeadMat_b1 : in AlgoParameter;
63 IN_ParDeadMat_b2 : in AlgoParameter;
64 IN_ParDeadMat_b3 : in AlgoParameter;
66 IN_Energy_threshold : in DataWord;
67 IN_Cond_threshold : in DataWord;
69 IN_Data : in TriggerTowers(8 downto 0);
71 OUT_TOB : out TriggerObject_eg);
77 signal ParREta : AlgoParameters(2 downto 0);
78 signal ParWs : AlgoParameters(2 downto 0);
79 signal ParRh : AlgoParameters(2 downto 0);
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;
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);
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);
111 signal MA_EnergyOverflow : std_logic;
112 signal MA_EnergySum : DataWord;
114 signal MA_REtaEnvOverflow : std_logic;
115 signal MA_REtaEnvSum : DataWord;
116 signal MA_REtaCoreOverflow : std_logic;
117 signal MA_REtaCoreSum : DataWord;
119 signal MA_WsEnvOverflow : std_logic;
120 signal MA_WsEnvSum : DataWord;
121 signal MA_WsCoreOverflow : std_logic;
122 signal MA_WsCoreSum : DataWord;
124 signal MA_HadCoreOverflow : std_logic;
125 signal MA_HadCoreSum : DataWord;
126 signal MA_HadEnvOverflow : std_logic;
127 signal MA_HadEnvSum : DataWord;
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);
134 signal MU_REtaEnvMult : DataWords(2 downto 0);
135 signal MU_WsCoreMult : DataWords(2 downto 0);
136 signal MU_HadCoreMult : DataWords(2 downto 0);
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;
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;
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';
157 signal ConditionThr : DataWord;
158 signal ConditionThr_d : DataWord;
159 signal EnergyThr, EnergyThr_d : 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);
168 signal max_enable : std_logic;
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);
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);
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);
203 IM_Towers <= IN_Data;
207 ParREta <= IN_ParREta;
208 ParRh <= IN_ParHadron;
210 EnergyThr <= IN_Energy_threshold;
211 ConditionThr <= IN_Cond_threshold;
213 SEED_FINDER :
entity work.
SeedFinder --latency
2
217 IN_DataUp => SF_DataUp,
218 IN_DataDown => SF_DataDown,
219 OUT_UpNotDown => SF_UpNotDown,
221 OUT_IsLocalMax => SF_IsLocalMax,
222 OUT_IsMax => SF_IsMax
228 IN_glob_Position => IN_glob_Position,
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
);
250 DEAD_MATERIAL_DELAY :
entity infrastructure_lib.
GeneralDelay
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
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');
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');
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');
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');
288 end generate DEAD_MAT_FOR;
302 IN_Words => IM_EnergyL0 & IM_EnergyL1&IM_EnergyL2&IM_EnergyL3 & Corrected_EnergyL0 &
303 Corrected_EnergyL1 & Corrected_EnergyL2 & Corrected_EnergyL3,
304 OUT_Overflow => MA_EnergyOverflow,
305 OUT_Word => MA_EnergySum
);
314 IN_Words => IM_REtaEnvData & ZERO_DATA_WORD ,
315 OUT_Overflow => MA_REtaEnvOverflow,
316 OUT_Word => MA_REtaEnvSum
);
318 MULTI_ADDER_RETA_CORE :
entity work.
MultiAdder
324 IN_Words => IM_REtaCoreData & ZERO_DATA_WORD&ZERO_DATA_WORD ,
325 OUT_Overflow => MA_REtaCoreOverflow,
326 OUT_Word => MA_REtaCoreSum
);
335 IN_Words => IM_WsCoreData&ZERO_DATA_WORD&ZERO_DATA_WORD&ZERO_DATA_WORD&ZERO_DATA_WORD,
336 OUT_Overflow => MA_WsCoreOverflow,
337 OUT_Word => MA_WsCoreSum
);
345 IN_Words => IM_WsEnvData &ZERO_DATA_WORD ,
346 OUT_Overflow => MA_WsEnvOverflow,
347 OUT_Word => MA_WsEnvSum
);
356 IN_Words => IM_HadCoreData
(13 downto 0)&ZERO_DATA_WORD&ZERO_DATA_WORD,
357 OUT_Overflow => MA_HadCoreOverflow,
358 OUT_Word => MA_HadCoreSum
);
366 IN_Words => IM_HadEnvDataL1&IM_HadEnvDataL2&IM_HadEnvDataL03&ZERO_DATA_WORD&ZERO_DATA_WORD,
367 OUT_Overflow => MA_HadEnvOverflow,
368 OUT_Word => MA_HadEnvSum
);
377 generic map (parameters =>
3)
380 IN_Word => MA_REtaEnvSum,
381 IN_parameters => ParREta,
382 OUT_Overflow => MU_REtaEnvOverflows,
383 OUT_Words => MU_REtaEnvMult
388 generic map (parameters =>
3)
391 IN_Word => MA_WsCoreSum,
392 IN_parameters => ParWs,
393 OUT_Overflow => MU_WsCoreOverflows,
394 OUT_Words => MU_WsCoreMult
401 IN_Word => MA_HadCoreSum,
402 IN_parameters => ParRh,
403 OUT_Overflow => MU_HadCoreOverflows,
404 OUT_Words => MU_HadCoreMult
407 Condition_threshold_delay :
entity work.
Delay
412 IN_Word => ConditionThr,
413 OUT_Word => ConditionThr_d
);
415 Energy_threshold_delay :
entity work.
Delay
420 IN_Word => EnergyThr,
421 OUT_Word => EnergyThr_d
);
433 data_in =>
(0 => SF_IsMax,
1 => SF_IsLocalMax,
2 => SF_UpNotDown,
4 downto 3 => SF_Seed
),
434 data_out => DL_SeedFinder
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);
449 data_in =>
(0 => MA_REtaEnvOverflow,
1 => MA_WsCoreOverflow,
2 => MA_HadCoreOverflow
),
450 data_out => DL_Overflows
453 DL_REtaEnvOverflow <= DL_Overflows(0);
454 DL_WsCoreOverflow <= DL_Overflows(1);
455 DL_HadCoreOverflow <= DL_Overflows(2);
460 CONDITIONS :
process (CLK200)
461 variable RetaShifted, WsShifted, HadShifted : DataWord;
463 if rising_edge(CLK200) then
465 if MA_EnergyOverflow = '1' then
466 TOBEnergy <= (others => '1');
467 TOBEnergyOverflow <= MA_EnergyOverflow;
469 elsif MA_EnergySum < EnergyThr_d then
470 TOBEnergy <= (others => '0');
471 TOBEnergyOverflow <= '0';
474 TOBEnergy <= MA_EnergySum;
475 TOBEnergyOverflow <= MA_EnergyOverflow;
481 RetaShifted := BitLeftShift(MA_REtaCoreSum, 3);
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);
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);
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);
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');
Core of the electromagnetic algorithm.
Core of the electromagnetic algorithm.
in IN_ParDeadMat_b0 AlgoParameter
enable bit mask for material correction
Daly for data word format.
Shift register for data delay.
Multiple Adder: adds many input words in cascade.
in CLK std_logic
200 MHz clock
Seed Finder for the electromagnetic algorithm.