9 use IEEE.STD_LOGIC_1164.
all;
10 use IEEE.NUMERIC_STD.
all;
13 library infrastructure_lib;
17 port (CLK200 : in std_logic;
19 IN_ParJet : in AlgoParameters(2 downto 0);
20 IN_ParFrac : in AlgoParameters(2 downto 0);
22 IN_Energy_threshold : in DataWord;
23 IN_cond_threshold : in DataWord;
27 IN_Data : in TriggerTowers(8 downto 0);
29 OUT_TOB : out TriggerObject_tau);
38 A :
in std_logic_vector(
15 downto 0);
39 B :
in std_logic_vector(
7 downto 0);
40 P :
out std_logic_vector(
23 downto 0)
44 signal ParJet : AlgoParameters(2 downto 0);
45 signal ParFrac : AlgoParameters(2 downto 0);
48 signal LSF_Data, LSF_DataUp, LSF_DataDown : DataWords(3 downto 0);
49 signal LSF_Seed : std_logic_vector (1 downto 0);
50 signal LSF_UpNotDown : std_logic;
53 signal SF_sum : DataWords(8 downto 0);
54 signal SF_of : std_logic_vector(8 downto 0);
55 signal ConditionThr : DataWord;
56 signal EnergyThr : DataWord;
57 signal ConditionThr_d : DataWord;
58 signal EnergyThr_d : DataWord;
60 signal SF_IsMax : std_logic;
62 signal IM_Energy_L1 : DataWords(9 downto 0);
63 signal IM_Energy_L2 : DataWords(9 downto 0);
64 signal IM_Energy_L0 : DataWords(5 downto 0);
65 signal IM_Energy_L3 : DataWords(5 downto 0);
66 signal IM_Energy_HAD : DataWords(5 downto 0);
67 signal IM_JetCoreData : DataWords(5 downto 0);
68 signal IM_JetEnvData : DataWords(11 downto 0);
71 signal MA_EnergySum : DataWord;
72 signal MA_EnergyOverflow : std_logic;
73 signal MA_JetEnvSum : DataWord;
74 signal MA_JetEnvOverflow : std_logic;
75 signal MA_JetCoreOverflow : std_logic;
76 signal MA_JetCoreSum : DataWord;
78 signal MA_FracEnvSum : DataWord;
79 signal MA_FracEnvOverflow : std_logic;
80 signal MA_FracCoreOverflow : std_logic;
81 signal MA_FracCoreSum : DataWord;
83 signal MU_JetEnvOverflows : std_logic_vector(IN_ParJet'high downto 0);
84 signal MU_JetEnvMult : DataWords(IN_ParJet'high downto 0);
86 signal MU_FracEnvOverflows : std_logic_vector(IN_ParFrac'high downto 0);
87 signal MU_FracEnvMult : DataWords(IN_ParFrac'high downto 0);
92 signal Delayed : std_logic_vector (3 downto 0);
93 signal DL_Seed : std_logic_vector (1 downto 0);
94 signal DL_UpNotDown : std_logic;
95 signal DL_IsMax : std_logic;
96 signal DL_Overflows : std_logic_vector(1 downto 0);
97 signal DL_JetEnvOverflow : std_logic;
98 signal DL_FracEnvOverflow : std_logic;
102 signal TOBEnergy : DataWord;
103 signal TOBEnergyOverflow : std_logic;
104 signal JetCondition : std_logic_vector (1 downto 0);
105 signal FracCondition : std_logic_vector (1 downto 0);
107 signal max_enable : std_logic;
127 LSF_Data <= IN_Data(4).Layer1;
128 LSF_DataUp <= IN_Data(7).Layer1;
129 LSF_DataDown <= IN_Data(1).Layer1;
134 ParFrac <= IN_ParFrac;
135 ConditionThr <= IN_Cond_threshold;
136 EnergyThr <= IN_Energy_threshold;
142 IN_DataUp => LSF_DataUp,
143 IN_DataDown => LSF_DataDown,
144 OUT_UpNotDown => LSF_UpNotDown,
152 IN_UpNotDown => LSF_UpNotDown,
153 IN_Towers => IN_Data,
154 OUT_Energy_L1 => IM_Energy_L1,
155 OUT_Energy_L2 => IM_Energy_L2,
156 OUT_Energy_L0 => IM_Energy_L0,
157 OUT_Energy_L3 => IM_Energy_L3,
158 OUT_Energy_HAD => IM_Energy_HAD,
159 OUT_JetCoreData => IM_JetCoreData,
160 OUT_JetEnvData => IM_JetEnvData
);
173 IN_Words =>
(5 downto 0 => IM_Energy_L0,
11 downto 6 => IM_Energy_L3,
17 downto 12 => IM_Energy_HAD,
174 30 downto 21 => IM_Energy_L1,
40 downto 31 => IM_Energy_L2,
others => ZERO_DATA_WORD
),
175 OUT_Overflow => MA_EnergyOverflow,
176 OUT_Word => MA_EnergySum
);
178 SF_ADDER_FOR : for i in 0 to 8 generate
185 IN_Words =>
(0 => IN_Data
(i
).Layer0
(0),
4 downto 1 => IN_Data
(i
).Layer1,
8 downto 5 => IN_Data
(i
).Layer2,
9 => IN_Data
(i
).Layer3
(0),
10 => IN_Data
(i
).Hadron
(0),
others => ZERO_DATA_WORD
),
186 OUT_Overflow => SF_of
(i
),
187 OUT_Word => SF_sum
(i
));
196 IN_Surrounding =>
(0 => SF_sum
(0),
1 => SF_sum
(1),
2 => SF_sum
(2),
7 => SF_sum
(3),
197 3 => SF_sum
(5),
6 => SF_sum
(6),
5 => SF_sum
(7),
4 => SF_sum
(8)),
198 IN_surrounding_of =>
(0 => SF_of
(0),
1 => SF_of
(1),
2 => SF_of
(2),
7 => SF_of
(3),
199 3 => SF_of
(5),
6 => SF_of
(6),
5 => SF_of
(7),
4 => SF_of
(8)),
200 OUT_IsMax => SF_IsMax
211 IN_Words =>
(IM_JetEnvData'range => IM_JetEnvData,
others => ZERO_DATA_WORD
),
212 OUT_Overflow => MA_JetEnvOverflow,
213 OUT_Word => MA_JetEnvSum
);
221 IN_Words => IM_JetCoreData & ZERO_DATA_WORD&ZERO_DATA_WORD ,
222 OUT_Overflow => MA_JetCoreOverflow,
223 OUT_Word => MA_JetCoreSum
);
232 IN_Words =>
(9 downto 0 => IM_Energy_L2,
12 downto 10 => IM_Energy_L1
(3 downto 1),
15 downto 13 => IM_Energy_L1
(8 downto 6)),
233 OUT_Overflow => MA_FracEnvOverflow,
234 OUT_Word => MA_FracEnvSum
);
236 MULTI_ADDER_Frac_CORE :
entity work.
MultiAdder
242 IN_Words =>
(IM_Energy_HAD'range => IM_Energy_HAD,
others => ZERO_DATA_WORD
),
243 OUT_Overflow => MA_FracCoreOverflow,
244 OUT_Word => MA_FracCoreSum
);
253 generic map (parameters =>
3)
256 IN_Word => MA_JetEnvSum,
257 IN_parameters => ParJet,
258 OUT_Overflow => MU_JetEnvOverflows,
259 OUT_Words => MU_JetEnvMult
262 Condition_threshold_delay :
entity work.
Delay
267 IN_Word => ConditionThr,
268 OUT_Word => ConditionThr_d
);
272 generic map (parameters =>
3)
275 IN_Word => MA_FracEnvSum,
276 IN_parameters => ParFrac,
277 OUT_Overflow => MU_FracEnvOverflows,
278 OUT_Words => MU_FracEnvMult
282 Energy_threshold_delay :
entity work.
Delay
287 IN_Word => EnergyThr,
288 OUT_Word => EnergyThr_d
);
299 data_in =>
(0 => SF_IsMax
),
300 data_out =>
Delayed(0 downto 0)
303 LITTLE_SEED_DELAY :
entity infrastructure_lib.
GeneralDelay
309 data_in =>
(0 => LSF_UpNotDown,
2 downto 1 => LSF_Seed
),
310 data_out =>
Delayed(3 downto 1)
313 DL_IsMax <= Delayed(0);
314 DL_UpNotDown <= Delayed(1);
315 DL_Seed <= Delayed(3 downto 2);
318 OVERFLOW_DELAY :
entity infrastructure_lib.
GeneralDelay --compensate
for the Mult delay
324 data_in =>
(0 => MA_JetEnvOverflow,
1 => MA_FracEnvOverflow
),
325 data_out => DL_Overflows
);
327 DL_JetEnvOverflow <= DL_Overflows(0);
328 DL_FracEnvOverflow <= DL_Overflows(1);
334 CONDITIONS :
process (CLK200)
335 variable JetShifted : DataWord;
336 variable FracShifted : DataWord;
338 if rising_edge(CLK200) then
339 if MA_EnergyOverflow = '1' then
340 TOBEnergy <= (others => '1');
341 TOBEnergyOverflow <= MA_EnergyOverflow;
343 elsif MA_EnergySum < EnergyThr_d then
344 TOBEnergy <= (others => '0');
345 TOBEnergyOverflow <= '0';
348 TOBEnergy <= MA_EnergySum;
349 TOBEnergyOverflow <= MA_EnergyOverflow;
354 JetShifted := BitLeftShift(MA_JetCoreSum, 3);
356 JetCondition <= EvaluateCondition (
357 Pass_overflow => MA_JetCoreOverflow,
358 Fail_overflow => DL_JetEnvOverflow,
359 E_threshold => ConditionThr_d,
360 Total_Energy => MA_EnergySum,
361 Total_Energy_of => MA_EnergyOverflow,
362 Condition_Energy => JetShifted,
363 Thresholds => MU_JetEnvMult,
364 Thresholds_overflows => MU_JetEnvOverflows);
367 FracShifted := BitLeftShift(MA_FracCoreSum, 3);
369 FracCondition <= EvaluateCondition (
370 Pass_overflow => MA_FracCoreOverflow,
371 Fail_overflow => DL_FracEnvOverflow,
372 E_threshold => ConditionThr_d,
373 Total_Energy => MA_EnergySum,
374 Total_Energy_of => MA_EnergyOverflow,
375 Condition_Energy => FracShifted,
376 Thresholds => MU_FracEnvMult,
377 Thresholds_overflows => MU_FracEnvOverflows);
383 OUT_TOB.Core.Version <= "00";
384 OUT_TOB.Core.Energy <= to_TOBEnergy(TOBEnergy);
385 OUT_TOB.Core.EnergyOF <= TOBEnergyOverflow;
386 OUT_TOB.Core.UpNotDown <= DL_UpNotDown;
387 OUT_TOB.Core.Seed <= DL_Seed;
388 OUT_TOB.Core.IsMax <= DL_IsMax and max_enable;
389 OUT_TOB.Core.JetOrBDT <= JetCondition;
390 OUT_TOB.Core.Frac <= FracCondition;
391 OUT_TOB.Core.BDT <= (others => '0');
392 OUT_TOB.Position.Eta <= (others => '0');
393 OUT_TOB.Position.Phi <= (others => '0');
Core of the electromagnetic algorithm.
Core of the electromagnetic algorithm.
Daly for data word format.
Shift register for data delay.
Little Seed Finder for the tau algorithm.
Multiple Adder: adds many input words in cascade.
in CLK std_logic
200 MHz clock
Seed Finder for the tau algorithm.
in IN_Central_of std_logic
Sum of TTs in CCW starting from bottom left corner.
in IN_Central DataWord
Sum of TTs in CCW starting from bottom left corner.