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

Back to eFEX documentation
AlgoCore_tau.vhd
Go to the documentation of this file.
1 
7 
8 library IEEE;
9 use IEEE.STD_LOGIC_1164.all;
10 use IEEE.NUMERIC_STD.all;
11 use work.DataTypes.all;
12 
13 library infrastructure_lib;
14 
16 entity AlgoCore_tau is
17  port (CLK200 : in std_logic;
18 
19  IN_ParJet : in AlgoParameters(2 downto 0);
20  IN_ParFrac : in AlgoParameters(2 downto 0);
21 
22  IN_Energy_threshold : in DataWord;
23  IN_cond_threshold : in DataWord;
24 
25 
26 
27  IN_Data : in TriggerTowers(8 downto 0);
28 
29  OUT_TOB : out TriggerObject_tau);
30 end AlgoCore_tau;
31 
33 architecture Behavioral of AlgoCore_tau is
34 
35  component Mult --@suppress
36  port (
37  CLK : in std_logic;
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)
41  );
42  end component;
43 
44  signal ParJet : AlgoParameters(2 downto 0);
45  signal ParFrac : AlgoParameters(2 downto 0);
46 
47  -- Little Seed Finder
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;
51 
52  -- Tau Seed Finder
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;
59 
60  signal SF_IsMax : std_logic;
61 
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);
69 
70 
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;
77 
78  signal MA_FracEnvSum : DataWord;
79  signal MA_FracEnvOverflow : std_logic;
80  signal MA_FracCoreOverflow : std_logic;
81  signal MA_FracCoreSum : DataWord;
82 
83  signal MU_JetEnvOverflows : std_logic_vector(IN_ParJet'high downto 0);
84  signal MU_JetEnvMult : DataWords(IN_ParJet'high downto 0);
85 
86  signal MU_FracEnvOverflows : std_logic_vector(IN_ParFrac'high downto 0);
87  signal MU_FracEnvMult : DataWords(IN_ParFrac'high downto 0);
88 
89 
90 
91 --delayed
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;
99 
100 
101  --final
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);
106 
107  signal max_enable : std_logic;
108 
109 begin
110 -- INPUT DATA mapping
111 --
112 -- +-------+-------+-------+
113 -- | 6 | 7 | 8 |
114 -- | |0 1 2 3| |
115 -- | | | |
116 -- +-------+-------+-------+
117 -- | 3 | 4 | 5 |
118 -- | | |0 1 2 3|
119 -- | | | |
120 -- +-------+-------+-------+
121 -- | |0 1 2 3| |
122 -- | | | |
123 -- | 0 | 1 | 2 |
124 -- +-------+-------+-------+
125 --
126 
127  LSF_Data <= IN_Data(4).Layer1;
128  LSF_DataUp <= IN_Data(7).Layer1;
129  LSF_DataDown <= IN_Data(1).Layer1;
130 
131 
132 -- Parameters are connected to external IPBus registers
133  ParJet <= IN_ParJet;
134  ParFrac <= IN_ParFrac;
135  ConditionThr <= IN_Cond_threshold;
136  EnergyThr <= IN_Energy_threshold;
137 
138  LITTLE_SEED_FINDER : entity work.LittleSeedFinder --latency 2
139  port map (
140  CLK => CLK200,
141  IN_Data => LSF_Data,
142  IN_DataUp => LSF_DataUp,
143  IN_DataDown => LSF_DataDown,
144  OUT_UpNotDown => LSF_UpNotDown,
145  OUT_Seed => LSF_Seed
146  );
147 
148  INPUT_MULTIPLEXER : entity work.tauInputMultiplexer --latency 2
149  port map (
150  CLK => CLK200,
151  IN_Seed => LSF_Seed,
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);
161 
162 -------------------------------------------------------------------------------
163 -- ADDERS
164 -------------------------------------------------------------------------------
165 
166 -- Energy
167  ENERGY_ADDER : entity work.MultiAdder
168  generic map (
169  stage => 6,
170  delay => 1)
171  port map (
172  CLK => CLK200,
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), --38 + 28
175  OUT_Overflow => MA_EnergyOverflow,
176  OUT_Word => MA_EnergySum);
177 
178  SF_ADDER_FOR : for i in 0 to 8 generate
179  SEED_FINDER_ADDER : entity work.MultiAdder
180  generic map (
181  stage => 4,
182  delay => 0)
183  port map (
184  CLK => CLK200,
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), --36 + 28
186  OUT_Overflow => SF_of(i),
187  OUT_Word => SF_sum(i));
188  end generate;
189 
190 
191  TAU_SEED_FINDER : entity work.TauSeedFinder --latency 2
192  port map (
193  CLK => CLK200,
194  IN_Central => SF_sum(4),
195  IN_Central_of => SF_of(4),
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 --total latency 6
201  );
202 
203 
204 -- Jet
205  MULTI_ADDER_Jet_ENV : entity work.MultiAdder
206  generic map (
207  stage => 4,
208  delay => 0)
209  port map (
210  CLK => CLK200,
211  IN_Words => (IM_JetEnvData'range => IM_JetEnvData, others => ZERO_DATA_WORD), -- 12+4=2^4
212  OUT_Overflow => MA_JetEnvOverflow,
213  OUT_Word => MA_JetEnvSum);
214 
215  MULTI_ADDER_Jet_CORE : entity work.MultiAdder
216  generic map (
217  stage => 3,
218  delay => 4)
219  port map (
220  CLK => CLK200,
221  IN_Words => IM_JetCoreData & ZERO_DATA_WORD&ZERO_DATA_WORD , -- 6+2=2^3
222  OUT_Overflow => MA_JetCoreOverflow,
223  OUT_Word => MA_JetCoreSum);
224 
225  -- Frac
226  MULTI_ADDER_Frac_ENV : entity work.MultiAdder
227  generic map (
228  stage => 4,
229  delay => 0)
230  port map (
231  CLK => CLK200,
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)), --16=2^4
233  OUT_Overflow => MA_FracEnvOverflow,
234  OUT_Word => MA_FracEnvSum);
235 
236  MULTI_ADDER_Frac_CORE : entity work.MultiAdder
237  generic map (
238  stage => 3,
239  delay => 4)
240  port map (
241  CLK => CLK200,
242  IN_Words => (IM_Energy_HAD'range => IM_Energy_HAD, others => ZERO_DATA_WORD), --6 + 2 =2^3
243  OUT_Overflow => MA_FracCoreOverflow,
244  OUT_Word => MA_FracCoreSum);
245 
246 
247 -------------------------------------------------------------------------------
248 -- MULTIPLIERS
249 -------------------------------------------------------------------------------
250 
251 -- Jet
252  Jet_MULTIPLIER : entity work.MultiMultiplier --delay 3
253  generic map (parameters => 3)
254  port map (
255  CLK => CLK200,
256  IN_Word => MA_JetEnvSum,
257  IN_parameters => ParJet,
258  OUT_Overflow => MU_JetEnvOverflows,
259  OUT_Words => MU_JetEnvMult
260  );
261 
262  Condition_threshold_delay : entity work.Delay
263  generic map (
264  delay => 4)
265  port map (
266  CLK => CLK200,
267  IN_Word => ConditionThr,
268  OUT_Word => ConditionThr_d);
269 
270  -- Frac
271  Frac_MULTIPLIER : entity work.MultiMultiplier --delay 3
272  generic map (parameters => 3)
273  port map (
274  CLK => CLK200,
275  IN_Word => MA_FracEnvSum,
276  IN_parameters => ParFrac,
277  OUT_Overflow => MU_FracEnvOverflows,
278  OUT_Words => MU_FracEnvMult
279  );
280 
281 
282  Energy_threshold_delay : entity work.Delay
283  generic map (
284  delay => 3)
285  port map (
286  CLK => CLK200,
287  IN_Word => EnergyThr,
288  OUT_Word => EnergyThr_d);
289 
290 -------------------------------------------------------------------------------
291 -- SEED AND OVERFLOWS DELAY
292 -------------------------------------------------------------------------------
293  TAU_SEED_DELAY : entity infrastructure_lib.GeneralDelay
294  generic map (
295  delay => 4,
296  size => 1)
297  port map (
298  clk => CLK200,
299  data_in => (0 => SF_IsMax),
300  data_out => Delayed(0 downto 0)
301  );
302 
303  LITTLE_SEED_DELAY : entity infrastructure_lib.GeneralDelay
304  generic map (
305  delay => 9,
306  size => 3)
307  port map (
308  clk => CLK200,
309  data_in => (0 => LSF_UpNotDown, 2 downto 1 => LSF_Seed),
310  data_out => Delayed(3 downto 1)
311  );
312 
313  DL_IsMax <= Delayed(0);
314  DL_UpNotDown <= Delayed(1);
315  DL_Seed <= Delayed(3 downto 2);
316 
317 
318  OVERFLOW_DELAY : entity infrastructure_lib.GeneralDelay --compensate for the Mult delay
319  generic map (
320  delay => 2,
321  size => 2)
322  port map (
323  CLK => CLK200,
324  data_in => (0 => MA_JetEnvOverflow, 1 => MA_FracEnvOverflow),
325  data_out => DL_Overflows);
326 
327  DL_JetEnvOverflow <= DL_Overflows(0);
328  DL_FracEnvOverflow <= DL_Overflows(1);
329 
330 
331 -----------------------------------------------------------------------------
332 -- TRIGGER-OBJECT CONDITIONS
333 -----------------------------------------------------------------------------
334  CONDITIONS : process (CLK200)
335  variable JetShifted : DataWord;
336  variable FracShifted : DataWord;
337  begin
338  if rising_edge(CLK200) then
339  if MA_EnergyOverflow = '1' then
340  TOBEnergy <= (others => '1');
341  TOBEnergyOverflow <= MA_EnergyOverflow;
342  max_enable <= '1';
343  elsif MA_EnergySum < EnergyThr_d then
344  TOBEnergy <= (others => '0');
345  TOBEnergyOverflow <= '0';
346  max_enable <= '0';
347  else
348  TOBEnergy <= MA_EnergySum;
349  TOBEnergyOverflow <= MA_EnergyOverflow;
350  max_enable <= '1';
351  end if;
352 
353  -- Jet veto condition
354  JetShifted := BitLeftShift(MA_JetCoreSum, 3);
355 
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);
365 
366  -- Hadronic Fraction condition
367  FracShifted := BitLeftShift(MA_FracCoreSum, 3);
368 
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);
378  end if;
379  end process;
380 
381 
382 -- TOB building
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');
394 
395 end Behavioral;
Core of the electromagnetic algorithm.
Core of the electromagnetic algorithm.
Daly for data word format.
Definition: Delay.vhd:16
Shift register for data delay.
Little Seed Finder for the tau algorithm.
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 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.
Input Data Multiplexer for Tau: addresses SuperCells to the correct sum area.
in CLK std_logic
200 MHz clock