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

Back to eFEX documentation
AlgoCore_tau_bdt.vhd
Go to the documentation of this file.
1 
48 
49 library IEEE;
50 use IEEE.STD_LOGIC_1164.all;
51 use IEEE.NUMERIC_STD.all;
52 use work.DataTypes.all;
53 
54 library infrastructure_lib;
55 
58 generic(
59  TAU_ALGO_VERSION : std_logic_vector(1 downto 0)
60  );
61  port (CLK200 : in std_logic;
62 
63  IN_ParBDT : in AlgoParameters(2 downto 0);
64  IN_ParFrac : in AlgoParameters(2 downto 0);
65 
66  IN_Min_E_threshold : in DataWord;
67  IN_Min_BDT_E_threshold : in DataWord;
68  IN_Max_cond_E_threshold : in DataWord;
69 
70  IN_Data : in TriggerTowers(8 downto 0);
71 
72  OUT_TOB : out TriggerObject_tau);
74 
76 architecture Behavioral of AlgoCore_tau_bdt is
77 
78  component Mult --@suppress
79  port (
80  CLK : in std_logic;
81  A : in std_logic_vector(15 downto 0);
82  B : in std_logic_vector(7 downto 0);
83  P : out std_logic_vector(23 downto 0)
84  );
85  end component;
86 
87  signal TOBEnergy : DataWord;
88  signal C_IN_TOBEnergy : DataWord;
89  signal C_IN_FracTOBEnergy : DataWord;
90  signal TOBEnergyOverflow : std_logic;
91  signal C_IN_TOBEnergyOverflow : std_logic;
92  signal C_IN_FracTOBEnergyOverflow : std_logic;
93  signal C_IN_EnergyThr : DataWord;
94  signal C_IN_BDTMaxEnergyThr : DataWord;
95  signal C_IN_BDTMinEnergyThr : DataWord;
96  signal C_IN_BDTTOBEnergy : DataWord;
97  signal C_IN_BDTTOBEnergyOverflow : std_logic;
98  signal SF_IsMax : std_logic;
99  signal C_IN_IsMax : std_logic;
100  signal C_OUT_IsMax : std_logic;
101  signal Final_IsMax : std_logic := '0';
102  signal Final_TOBEnergy : DataWord := (others => '0');
103  signal Final_TOBEnergyOverflow : std_logic := '0';
104  signal C_OUT_TOBEnergy : DataWord;
105  signal C_OUT_TOBEnergyOverflow : std_logic;
106  signal BDTScore : std_logic_vector(BDT_SCORE_WIDTH - 1 downto 0);
107  signal C_IN_BDTScore : std_logic_vector(BDT_SCORE_WIDTH - 1 downto 0);
108  signal BDTThresholds : AlgoParameters(2 downto 0);
109  signal C_IN_BDTThr : AlgoParameters(2 downto 0);
110  signal Final_BDTCondition : std_logic_vector(1 downto 0) := (others => '0');
111  signal C_OUT_BDTCondition : std_logic_vector(1 downto 0);
112  signal Final_BDTScore : std_logic_vector(BDT_SCORE_WIDTH - 1 downto 0) := (others => '0');
113  signal C_OUT_BDTScore : std_logic_vector(BDT_SCORE_WIDTH - 1 downto 0);
114  signal FracEnvSumOverflow : std_logic;
115  signal C_IN_FracEnvSumOverflow : std_logic;
116  signal FracCoreSumOverflow : std_logic;
117  signal C_IN_FracCoreSumOverflow : std_logic;
118  signal FracCoreSum : DataWord;
119  signal C_IN_FracCoreSum : DataWord;
120  signal FracEnvMultOverflows : std_logic_vector(2 downto 0);
121  signal C_IN_FracEnvMultOverflows : std_logic_vector(2 downto 0);
122  signal FracEnvMult : DataWords(2 downto 0);
123  signal C_IN_FracEnvMult : DataWords(2 downto 0);
124  signal C_IN_Frac_ET_Thr : DataWord;
125  signal Final_FracCondition : std_logic_vector (1 downto 0) := (others => '0');
126  signal C_OUT_FracCondition : std_logic_vector (1 downto 0);
127  signal ParFrac : AlgoParameters(2 downto 0);
128  signal M_IN_ParFrac : AlgoParameters(2 downto 0);
129  signal output_data : DataWords(BDT_N_VARIABLES + 10 downto 0);
130  signal output_of_data : std_logic_vector(BDT_N_VARIABLES + 10 downto 0);
131  signal BDTScore_vld : std_logic;
132  signal SF_sum : DataWords(8 downto 0);
133  signal SF_of : std_logic_vector(8 downto 0);
134  signal BDTVars_val : DataWords(BDT_N_VARIABLES - 1 downto 0);
135  signal FracEnvSum : DataWord;
136  signal M_IN_FracEnvSum : DataWord;
137  signal DelayTree_out : DataWords(33 downto 0);
138  signal DelayTree_in : DataWords(28 downto 0);
139 
140 begin
141  ParFrac <= IN_ParFrac;
142  BDTThresholds <= IN_ParBDT;
143 
144  M_IN_ParFrac(0) <= DelayTree_out(0)(7 downto 0);
145  M_IN_ParFrac(1) <= DelayTree_out(1)(7 downto 0);
146  M_IN_ParFrac(2) <= DelayTree_out(2)(7 downto 0);
147  M_IN_FracEnvSum <= DelayTree_out(3);
148  C_IN_TOBEnergy <= DelayTree_out(4);
149  C_IN_TOBEnergyOverflow <= DelayTree_out(5)(0);
150  C_IN_IsMax <= DelayTree_out(6)(0);
151  C_IN_EnergyThr <= DelayTree_out(7);
152  C_IN_BDTScore <= DelayTree_out(8)(BDT_SCORE_WIDTH-1 downto 0);
153  C_IN_BDTThr(0) <= DelayTree_out(9)(7 downto 0);
154  C_IN_BDTThr(1) <= DelayTree_out(10)(7 downto 0);
155  C_IN_BDTThr(2) <= DelayTree_out(11)(7 downto 0);
156  C_IN_BDTMaxEnergyThr <= DelayTree_out(12);
157  C_IN_BDTMinEnergyThr <= DelayTree_out(13);
158  C_IN_BDTTOBEnergy <= DelayTree_out(14);
159  C_IN_BDTTOBEnergyOverflow <= DelayTree_out(15)(0);
160  C_IN_FracTOBEnergy <= DelayTree_out(16);
161  C_IN_FracTOBEnergyOverflow <= DelayTree_out(17)(0);
162  C_IN_FracEnvSumOverflow <= DelayTree_out(18)(0);
163  C_IN_FracCoreSumOverflow <= DelayTree_out(19)(0);
164  C_IN_FracCoreSum <= DelayTree_out(20);
165  C_IN_FracEnvMult(0) <= DelayTree_out(21);
166  C_IN_FracEnvMult(1) <= DelayTree_out(22);
167  C_IN_FracEnvMult(2) <= DelayTree_out(23);
168  C_IN_FracEnvMultOverflows(0) <= DelayTree_out(24)(0);
169  C_IN_FracEnvMultOverflows(1) <= DelayTree_out(25)(0);
170  C_IN_FracEnvMultOverflows(2) <= DelayTree_out(26)(0);
171  C_IN_Frac_ET_Thr <= DelayTree_out(27);
172  Final_TOBEnergy <= DelayTree_out(28);
173  Final_TOBEnergyOverflow <= DelayTree_out(29)(0);
174  Final_IsMax <= DelayTree_out(30)(0);
175  Final_BDTScore <= DelayTree_out(31)(BDT_SCORE_WIDTH-1 downto 0);
176  Final_BDTCondition <= DelayTree_out(32)(1 downto 0);
177  Final_FracCondition <= DelayTree_out(33)(1 downto 0);
178 
179  DelayTree_in(0)(7 downto 0) <= ParFrac(0);
180  DelayTree_in(1)(7 downto 0) <= ParFrac(1);
181  DelayTree_in(2)(7 downto 0) <= ParFrac(2);
182  DelayTree_in(3) <= FracEnvSum;
183  DelayTree_in(4) <= TOBEnergy;
184  DelayTree_in(5)(0) <= TOBEnergyOverflow;
185  DelayTree_in(6)(0) <= SF_IsMax;
186  DelayTree_in(7) <= IN_Min_E_threshold;
187  DelayTree_in(8)(BDT_SCORE_WIDTH-1 downto 0) <= BDTScore;
188  DelayTree_in(9)(7 downto 0) <= BDTThresholds(0);
189  DelayTree_in(10)(7 downto 0) <= BDTThresholds(1);
190  DelayTree_in(11)(7 downto 0) <= BDTThresholds(2);
191  DelayTree_in(12) <= IN_Max_cond_E_threshold;
192  DelayTree_in(13) <= IN_Min_BDT_E_threshold;
193  DelayTree_in(14)(0) <= FracEnvSumOverflow;
194  DelayTree_in(15)(0) <= FracCoreSumOverflow;
195  DelayTree_in(16) <= FracCoreSum;
196  DelayTree_in(17) <= FracEnvMult(0);
197  DelayTree_in(18) <= FracEnvMult(1);
198  DelayTree_in(19) <= FracEnvMult(2);
199  DelayTree_in(20)(0) <= FracEnvMultOverflows(0);
200  DelayTree_in(21)(0) <= FracEnvMultOverflows(1);
201  DelayTree_in(22)(0) <= FracEnvMultOverflows(2);
202  DelayTree_in(23) <= C_OUT_TOBEnergy;
203  DelayTree_in(24)(0) <= C_OUT_TOBEnergyOverflow;
204  DelayTree_in(25)(0) <= C_OUT_IsMax;
205  DelayTree_in(26)(BDT_SCORE_WIDTH-1 downto 0) <= C_OUT_BDTScore;
206  DelayTree_in(27)(1 downto 0) <= C_OUT_BDTCondition;
207  DelayTree_in(28)(1 downto 0) <= C_OUT_FracCondition;
208 
209  ADDER_TREE: entity work.AdderTree
210  port map(CLK200, to_SuperCellArray(IN_Data), output_data, output_of_data);
211 
212  BDTVars_val(0) <= (others => '1') when output_of_data(BDT_N_VARIABLES + 3) = '1' else output_data(BDT_N_VARIABLES + 3); -- CORE tower
213 
214  BDT_VARS: for i in 0 to BDT_N_VARIABLES - 2 generate -- BDT_N_VARIABLES-1 symmetric variables
215  BDTVars_val(i+1) <= (others => '1') when output_of_data(i) = '1' else output_data(i);
216  end generate;
217 
218  TOWERS: for i in 0 to 8 generate
219  SF_of(i) <= output_of_data(i+BDT_N_VARIABLES - 1);
220  SF_sum(i) <= output_data(i+BDT_N_VARIABLES - 1);
221  end generate;
222 
223  TOBEnergy <= output_data(BDT_N_VARIABLES + 8);
224  TOBEnergyOverflow <= output_of_data(BDT_N_VARIABLES + 8);
225  FracEnvSum <= output_data(BDT_N_VARIABLES + 9);
226  FracEnvSumOverflow <= output_of_data(BDT_N_VARIABLES + 9);
227  FracCoreSum <= output_data(BDT_N_VARIABLES + 10);
228  FracCoreSumOverflow <= output_of_data(BDT_N_VARIABLES + 10);
229 
230 
231  TAU_SEED_FINDER : entity work.TauSeedFinder --latency 2
232  port map (
233  CLK => CLK200,
234  IN_Central => SF_sum(4),
235  IN_Central_of => SF_of(4),
236  IN_Surrounding(0) => SF_sum(0),
237  IN_Surrounding(1) => SF_sum(1),
238  IN_Surrounding(2) => SF_sum(2),
239  IN_Surrounding(7) => SF_sum(3),
240  IN_Surrounding(3) => SF_sum(5),
241  IN_Surrounding(6) => SF_sum(6),
242  IN_Surrounding(5) => SF_sum(7),
243  IN_Surrounding(4) => SF_sum(8),
244  IN_surrounding_of(0) => SF_of(0),
245  IN_surrounding_of(1) => SF_of(1),
246  IN_surrounding_of(2) => SF_of(2),
247  IN_surrounding_of(7) => SF_of(3),
248  IN_surrounding_of(3) => SF_of(5),
249  IN_surrounding_of(6) => SF_of(6),
250  IN_surrounding_of(5) => SF_of(7),
251  IN_surrounding_of(4) => SF_of(8),
252  OUT_IsMax => SF_IsMax
253  );
254 
255  BDT: entity work.BDTModel
256  port map(CLK200,
257  BDTVars_val(0),
258  BDTVars_val(1),
259  BDTVars_val(2),
260  BDTVars_val(3),
261  BDTVars_val(4),
262  BDTVars_val(5),
263  BDTVars_val(6),
264  BDTVars_val(7),
265  BDTVars_val(8),
266  BDTVars_val(9),
267  BDTVars_val(10),
268  BDTScore, BDTScore_vld);
269 
270  DELAY_TREE: entity work.DelayTree
271  -- See DelayTree.vhd for a table of latencies for each input/output signal
272  port map(
273  CLK => CLK200,
274  IN_Words => DelayTree_in,
275  OUT_Words => DelayTree_out
276  );
277 
278  Frac_MULTIPLIER : entity work.MultiMultiplier --delay 3
279  generic map (parameters => 3)
280  port map (
281  CLK => CLK200,
282  IN_Word => M_IN_FracEnvSum,
283  IN_parameters => M_IN_ParFrac,
284  OUT_Overflow => FracEnvMultOverflows,
285  OUT_Words => FracEnvMult
286  );
287 
288  CONDITIONS_ENERGY_AND_SEED: entity work.TauConditionsEnergyAndSeed
289  port map (
290  CLK => CLK200,
291  IN_TOBEnergy => C_IN_TOBEnergy,
292  IN_TOBEnergyOverflow => C_IN_TOBEnergyOverflow,
293  IN_ET_Thr => C_IN_EnergyThr,
294  IN_IsSeeded => C_IN_IsMax,
295  OUT_IsMax => C_OUT_IsMax,
296  OUT_TOBEnergy => C_OUT_TOBEnergy,
297  OUT_TOBEnergyOverflow => C_OUT_TOBEnergyOverflow
298  );
299 
300  CONDITIONS_BDT: entity work.TauConditionsBDT
301  port map (
302  CLK => CLK200,
303  IN_BDTScore => C_IN_BDTScore,
304  IN_BDT_Thr => C_IN_BDTThr,
305  IN_Max_BDT_E_threshold => C_IN_BDTMaxEnergyThr,
306  IN_Min_BDT_E_threshold => C_IN_BDTMinEnergyThr,
307  IN_Total_Energy => C_IN_BDTTOBEnergy,
308  IN_Total_Energy_of => C_IN_BDTTOBEnergyOverflow,
309  OUT_BDTCondition => C_OUT_BDTCondition,
310  OUT_BDTScore => C_OUT_BDTScore
311  );
312 
313  CONDITIONS_FRAC: entity work.TauConditionsFrac
314  port map (
315  CLK => CLK200,
316  IN_TOBEnergy => C_IN_FracTOBEnergy,
317  IN_TOBEnergyOverflow => C_IN_FracTOBEnergyOverflow,
318  IN_FracEnvSumOverflow => C_IN_FracEnvSumOverflow,
319  IN_FracCoreSumOverflow => C_IN_FracCoreSumOverflow,
320  IN_FracCoreSum => C_IN_FracCoreSum,
321  IN_FracEnvMult => C_IN_FracEnvMult,
322  IN_FracEnvMultOverflows => C_IN_FracEnvMultOverflows,
323  IN_Frac_ET_Thr => "0000111111110000",
324  OUT_FracCondition => C_OUT_FracCondition
325  );
326 
327  -- Build output TOB
328  OUT_TOB.Core.Version <= TAU_ALGO_VERSION;
329  OUT_TOB.Core.Energy <= Final_TOBEnergy;
330  OUT_TOB.Core.EnergyOF <= Final_TOBEnergyOverflow;
331  OUT_TOB.Core.UpNotDown <= '0';
332  OUT_TOB.Core.Seed <= "01";
333  OUT_TOB.Core.IsMax <= Final_IsMax;
334  OUT_TOB.Core.JetOrBDT <= Final_BDTCondition;
335  OUT_TOB.Core.Frac <= Final_FracCondition;
336  OUT_TOB.Core.BDT <= Final_BDTScore;
337  OUT_TOB.Position.Eta <= (others => '0');
338  OUT_TOB.Position.Phi <= (others => '0');
339 
340 end Behavioral;
Core of the electromagnetic algorithm.
Core of the electromagnetic algorithm.
in CLK std_logic
200 MHz clock
in CLK std_logic
200 MHz clock
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.