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

Back to eFEX documentation
tauInputMultiplexer.vhd
Go to the documentation of this file.
1 
11 
12 library IEEE;
13 use IEEE.STD_LOGIC_1164.all;
14 use IEEE.NUMERIC_STD.all;
15 library work;
16 use work.DataTypes.all;
17 
20  port (
21  CLK : in std_logic;
22 
23  IN_Seed : in std_logic_vector(1 downto 0);
24  IN_UpNotDown : in std_logic;
25  IN_Towers : in TriggerTowers(8 downto 0);
26 
27  OUT_Energy_L1 : out DataWords(9 downto 0);
28  OUT_Energy_L2 : out DataWords(9 downto 0);
29  OUT_Energy_L0 : out DataWords(5 downto 0);
30  OUT_Energy_L3 : out DataWords(5 downto 0);
31  OUT_Energy_HAD : out DataWords(5 downto 0);
32 
33  OUT_JetCoreData : out DataWords(5 downto 0);
34  OUT_JetEnvData : out DataWords(11 downto 0)
35  );
37 
39 architecture Behavioral of tauInputMultiplexer is
40  signal Selector : std_logic_vector(2 downto 0);
41  signal ShiftTowers : TriggerTowers(8 downto 0) := (others => ZERO_TRIGGER_TOWER);
42  signal ShiftTowers2 : TriggerTowers(8 downto 0) := (others => ZERO_TRIGGER_TOWER);
43 
44 
45  signal OutEnergy_L0 : DataWords(OUT_Energy_L0'range) := (others => (others => '0'));
46  signal OutEnergy_L1 : DataWords(OUT_Energy_L1'range) := (others => (others => '0'));
47  signal OutEnergy_L2 : DataWords(OUT_Energy_L2'range) := (others => (others => '0'));
48  signal OutEnergy_L3 : DataWords(OUT_Energy_L3'range) := (others => (others => '0'));
49  signal OutEnergy_HAD : DataWords(OUT_Energy_HAD'range) := (others => (others => '0'));
50 
51  signal OutJetCoreData : DataWords(OUT_JetCoreData'range) := (others => (others => '0'));
52  signal OutJetEnvData : DataWords(OUT_JetEnvData'range) := (others => (others => '0'));
53 
54 begin
55 
56  Selector <= IN_UpNotDown & IN_Seed;
57 
58  process (CLK)
59  begin
60  if rising_edge(CLK) then
61  -- Pipeline (a delay of 2 is needed to mach the SeedFinder)
62  ShiftTowers2 <= IN_Towers;
63  ShiftTowers <= ShiftTowers2;
64 
65  -- Multiplexer
66 
67  -------------------------------------------------------------------------------
68  -- Energy L0, L3, HAD
69  -------------------------------------------------------------------------------
70 
71  case IN_UpNotDown is
72  when '1' => --up
73  OutEnergy_L0 <= (1 => ShiftTowers(4).Layer0(0), others => x"0000");
74 
75  OutEnergy_L3 <= (2 => ShiftTowers(5).Layer3(0), 1 => ShiftTowers(4).Layer3(0), 0 => ShiftTowers(3).Layer3(0),
76  5 => ShiftTowers(8).Layer3(0), 4 => ShiftTowers(7).Layer3(0), 3 => ShiftTowers(6).Layer3(0));
77 
78  OutEnergy_HAD <= (2 => ShiftTowers(5).Hadron(0), 1 => ShiftTowers(4).Hadron(0), 0 => ShiftTowers(3).Hadron(0),
79  5 => ShiftTowers(8).Hadron(0), 4 => ShiftTowers(7).Hadron(0), 3 => ShiftTowers(6).Hadron(0));
80 
81  when others =>
82  OutEnergy_L0 <= (1 => ShiftTowers(4).Layer0(0), others => x"0000");
83 
84  OutEnergy_L3 <= (2 => ShiftTowers(5).Layer3(0), 1 => ShiftTowers(4).Layer3(0), 0 => ShiftTowers(3).Layer3(0),
85  5 => ShiftTowers(2).Layer3(0), 4 => ShiftTowers(1).Layer3(0), 3 => ShiftTowers(0).Layer3(0));
86 
87  OutEnergy_HAD <= (2 => ShiftTowers(5).Hadron(0), 1 => ShiftTowers(4).Hadron(0), 0 => ShiftTowers(3).Hadron(0),
88  5 => ShiftTowers(2).Hadron(0), 4 => ShiftTowers(1).Hadron(0), 3 => ShiftTowers(0).Hadron(0));
89 
90  end case;
91 
92 ----------------------------------------------------------------------------------------------------------------------------------------------------------------
93 -- Energy L1
94 ----------------------------------------------------------------------------------------------------------------------------------------------------------------
95  case Selector is
96  when "100" => --up
97  OutEnergy_L1 <= (4 downto 2 => ShiftTowers(4).Layer1(2 downto 0), 1 downto 0 => ShiftTowers(3).Layer1(3 downto 2),
98  9 downto 7 => ShiftTowers(7).Layer1(2 downto 0), 6 downto 5 => ShiftTowers(6).Layer1(3 downto 2));
99  when "101" =>
100  OutEnergy_L1 <= (4 downto 1 => ShiftTowers(4).Layer1, 0 => ShiftTowers(3).Layer1(3),
101  9 downto 6 => ShiftTowers(7).Layer1, 5 => ShiftTowers(6).Layer1(3));
102  when "110" =>
103  OutEnergy_L1 <= (3 downto 0 => ShiftTowers(4).Layer1, 4 => ShiftTowers(5).Layer1(0),
104  8 downto 5 => ShiftTowers(7).Layer1, 9 => ShiftTowers(8).Layer1(0));
105  when "111" =>
106  OutEnergy_L1 <= (2 downto 0 => ShiftTowers(4).Layer1(3 downto 1), 4 downto 3 => ShiftTowers(5).Layer1(1 downto 0),
107  7 downto 5 => ShiftTowers(7).Layer1(3 downto 1), 9 downto 8 => ShiftTowers(8).Layer1(1 downto 0));
108  when "000" => --down
109  OutEnergy_L1 <= (4 downto 2 => ShiftTowers(4).Layer1(2 downto 0), 1 downto 0 => ShiftTowers(3).Layer1(3 downto 2),
110  9 downto 7 => ShiftTowers(1).Layer1(2 downto 0), 6 downto 5 => ShiftTowers(0).Layer1(3 downto 2));
111  when "001" =>
112  OutEnergy_L1 <= (4 downto 1 => ShiftTowers(4).Layer1, 0 => ShiftTowers(3).Layer1(3),
113  9 downto 6 => ShiftTowers(1).Layer1, 5 => ShiftTowers(0).Layer1(3));
114  when "010" =>
115  OutEnergy_L1 <= (3 downto 0 => ShiftTowers(4).Layer1, 4 => ShiftTowers(5).Layer1(0),
116  8 downto 5 => ShiftTowers(1).Layer1, 9 => ShiftTowers(2).Layer1(0));
117  when others => -- 011
118  OutEnergy_L1 <= (2 downto 0 => ShiftTowers(4).Layer1(3 downto 1), 4 downto 3 => ShiftTowers(5).Layer1(1 downto 0),
119  7 downto 5 => ShiftTowers(1).Layer1(3 downto 1), 9 downto 8 => ShiftTowers(2).Layer1(1 downto 0));
120  end case;
121 
122  -------------------------------------------------------------------------------
123  -- Energy L2
124  -------------------------------------------------------------------------------
125  case Selector is
126  when "100" =>
127  OutEnergy_L2 <= (4 downto 2 => ShiftTowers(4).Layer2(2 downto 0), 1 downto 0 => ShiftTowers(3).Layer2(3 downto 2),
128  9 downto 7 => ShiftTowers(7).Layer2(2 downto 0), 6 downto 5 => ShiftTowers(6).Layer2(3 downto 2));
129  when "101" =>
130  OutEnergy_L2 <= (4 downto 1 => ShiftTowers(4).Layer2, 0 => ShiftTowers(3).Layer2(3),
131  9 downto 6 => ShiftTowers(7).Layer2, 5 => ShiftTowers(6).Layer2(3));
132  when "110" =>
133  OutEnergy_L2 <= (3 downto 0 => ShiftTowers(4).Layer2, 4 => ShiftTowers(5).Layer2(0),
134  8 downto 5 => ShiftTowers(7).Layer2, 9 => ShiftTowers(8).Layer2(0));
135  when "111" =>
136  OutEnergy_L2 <= (2 downto 0 => ShiftTowers(4).Layer2(3 downto 1), 4 downto 3 => ShiftTowers(5).Layer2(1 downto 0),
137  7 downto 5 => ShiftTowers(7).Layer2(3 downto 1), 9 downto 8 => ShiftTowers(8).Layer2(1 downto 0));
138  when "000" => --down
139  OutEnergy_L2 <= (4 downto 2 => ShiftTowers(4).Layer2(2 downto 0), 1 downto 0 => ShiftTowers(3).Layer2(3 downto 2),
140  9 downto 7 => ShiftTowers(1).Layer2(2 downto 0), 6 downto 5 => ShiftTowers(0).Layer2(3 downto 2));
141  when "001" =>
142  OutEnergy_L2 <= (4 downto 1 => ShiftTowers(4).Layer2, 0 => ShiftTowers(3).Layer2(3),
143  9 downto 6 => ShiftTowers(1).Layer2, 5 => ShiftTowers(0).Layer2(3));
144  when "010" =>
145  OutEnergy_L2 <= (3 downto 0 => ShiftTowers(4).Layer2, 4 => ShiftTowers(5).Layer2(0),
146  8 downto 5 => ShiftTowers(1).Layer2, 9 => ShiftTowers(2).Layer2(0));
147  when others => -- 011
148  OutEnergy_L2 <= (2 downto 0 => ShiftTowers(4).Layer2(3 downto 1), 4 downto 3 => ShiftTowers(5).Layer2(1 downto 0),
149  7 downto 5 => ShiftTowers(1).Layer2(3 downto 1), 9 downto 8 => ShiftTowers(2).Layer2(1 downto 0));
150  end case;
151 
152 
153 
154  -----------------------------------------------------------------------
155  -- Jet Core Data
156  -----------------------------------------------------------------------
157  case Selector is
158  -- Up
159  when "100" => --up
160  OutJetCoreData <= (0 => ShiftTowers(4).Layer2(1), 1 => ShiftTowers(4).Layer2(0), 2 => ShiftTowers(3).Layer2(3),
161  3 => ShiftTowers(7).Layer2(1), 4 => ShiftTowers(7).Layer2(0), 5 => ShiftTowers(6).Layer2(3));
162  when "101" =>
163  OutJetCoreData <= (0 => ShiftTowers(4).Layer2(2), 1 => ShiftTowers(4).Layer2(1), 2 => ShiftTowers(4).Layer2(0),
164  3 => ShiftTowers(7).Layer2(2), 4 => ShiftTowers(7).Layer2(1), 5 => ShiftTowers(7).Layer2(0));
165  when "110" =>
166  OutJetCoreData <= (0 => ShiftTowers(4).Layer2(3), 1 => ShiftTowers(4).Layer2(2), 2 => ShiftTowers(4).Layer2(1),
167  3 => ShiftTowers(7).Layer2(3), 4 => ShiftTowers(7).Layer2(2), 5 => ShiftTowers(7).Layer2(1));
168  when "111" =>
169  OutJetCoreData <= (0 => ShiftTowers(5).Layer2(0), 1 => ShiftTowers(4).Layer2(3), 2 => ShiftTowers(4).Layer2(2),
170  3 => ShiftTowers(8).Layer2(0), 4 => ShiftTowers(7).Layer2(3), 5 => ShiftTowers(7).Layer2(2));
171  when "000" => --down
172  OutJetCoreData <= (0 => ShiftTowers(4).Layer2(1), 1 => ShiftTowers(4).Layer2(0), 2 => ShiftTowers(3).Layer2(3),
173  3 => ShiftTowers(1).Layer2(1), 4 => ShiftTowers(1).Layer2(0), 5 => ShiftTowers(0).Layer2(3));
174  when "001" =>
175  OutJetCoreData <= (0 => ShiftTowers(4).Layer2(2), 1 => ShiftTowers(4).Layer2(1), 2 => ShiftTowers(4).Layer2(0),
176  3 => ShiftTowers(1).Layer2(2), 4 => ShiftTowers(1).Layer2(1), 5 => ShiftTowers(1).Layer2(0));
177  when "010" =>
178  OutJetCoreData <= (0 => ShiftTowers(4).Layer2(3), 1 => ShiftTowers(4).Layer2(2), 2 => ShiftTowers(4).Layer2(1),
179  3 => ShiftTowers(1).Layer2(3), 4 => ShiftTowers(1).Layer2(2), 5 => ShiftTowers(1).Layer2(1));
180  when others => -- 011
181  OutJetCoreData <= (0 => ShiftTowers(5).Layer2(0), 1 => ShiftTowers(4).Layer2(3), 2 => ShiftTowers(4).Layer2(2),
182  3 => ShiftTowers(2).Layer2(0), 4 => ShiftTowers(1).Layer2(3), 5 => ShiftTowers(1).Layer2(2));
183  end case;
184 
185 
186 
187  -------------------------------------------------------------------------------
188  -- Jet Env Data
189  -------------------------------------------------------------------------------
190  case Selector is
191  -- Up
192  when "100" => --up
193  OutJetEnvData <= (0 => ShiftTowers(4).Layer2(3), 1 => ShiftTowers(4).Layer2(2), 2 => ShiftTowers(3).Layer2(2), 3 => ShiftTowers(3).Layer2(1), 4 => ShiftTowers(3).Layer2(0), 5 => ShiftTowers(5).Layer2(0),
194  6 => ShiftTowers(7).Layer2(3), 7 => ShiftTowers(7).Layer2(2), 8 => ShiftTowers(6).Layer2(2), 9 => ShiftTowers(6).Layer2(1), 10 => ShiftTowers(6).Layer2(0), 11 => ShiftTowers(8).Layer2(0)
195  );
196 
197  when "101" =>
198  OutJetEnvData <= (0 => ShiftTowers(4).Layer2(3), 1 => ShiftTowers(3).Layer2(3), 2 => ShiftTowers(3).Layer2(2), 3 => ShiftTowers(3).Layer2(1), 4 => ShiftTowers(5).Layer2(1), 5 => ShiftTowers(5).Layer2(0),
199  6 => ShiftTowers(7).Layer2(3), 7 => ShiftTowers(6).Layer2(3), 8 => ShiftTowers(6).Layer2(2), 9 => ShiftTowers(6).Layer2(1), 10 => ShiftTowers(8).Layer2(1), 11 => ShiftTowers(8).Layer2(0)
200  );
201 
202  when "110" =>
203  OutJetEnvData <= (0 => ShiftTowers(4).Layer2(0), 1 => ShiftTowers(3).Layer2(2), 2 => ShiftTowers(3).Layer2(3), 3 => ShiftTowers(5).Layer2(2), 4 => ShiftTowers(5).Layer2(1), 5 => ShiftTowers(5).Layer2(0),
204  6 => ShiftTowers(7).Layer2(0), 7 => ShiftTowers(6).Layer2(2), 8 => ShiftTowers(6).Layer2(3), 9 => ShiftTowers(8).Layer2(2), 10 => ShiftTowers(8).Layer2(1), 11 => ShiftTowers(8).Layer2(0)
205  );
206 
207  when "111" =>
208  OutJetEnvData <= (0 => ShiftTowers(4).Layer2(1), 1 => ShiftTowers(4).Layer2(0), 2 => ShiftTowers(3).Layer2(3), 3 => ShiftTowers(5).Layer2(3), 4 => ShiftTowers(5).Layer2(2), 5 => ShiftTowers(5).Layer2(1),
209  6 => ShiftTowers(7).Layer2(1), 7 => ShiftTowers(7).Layer2(0), 8 => ShiftTowers(6).Layer2(3), 9 => ShiftTowers(8).Layer2(3), 10 => ShiftTowers(8).Layer2(2), 11 => ShiftTowers(8).Layer2(1)
210  );
211 -- down
212  when "000" =>
213  OutJetEnvData <= (0 => ShiftTowers(4).Layer2(3), 1 => ShiftTowers(4).Layer2(2), 2 => ShiftTowers(3).Layer2(2), 3 => ShiftTowers(3).Layer2(1), 4 => ShiftTowers(3).Layer2(0), 5 => ShiftTowers(5).Layer2(0),
214  6 => ShiftTowers(1).Layer2(3), 7 => ShiftTowers(1).Layer2(2), 8 => ShiftTowers(0).Layer2(2), 9 => ShiftTowers(0).Layer2(1), 10 => ShiftTowers(0).Layer2(0), 11 => ShiftTowers(2).Layer2(0)
215  );
216 
217  when "001" =>
218  OutJetEnvData <= (0 => ShiftTowers(4).Layer2(3), 1 => ShiftTowers(3).Layer2(3), 2 => ShiftTowers(3).Layer2(2), 3 => ShiftTowers(3).Layer2(1), 4 => ShiftTowers(5).Layer2(1), 5 => ShiftTowers(5).Layer2(0),
219  6 => ShiftTowers(1).Layer2(3), 7 => ShiftTowers(0).Layer2(3), 8 => ShiftTowers(0).Layer2(2), 9 => ShiftTowers(0).Layer2(1), 10 => ShiftTowers(2).Layer2(1), 11 => ShiftTowers(2).Layer2(0)
220  );
221 
222  when "010" =>
223  OutJetEnvData <= (0 => ShiftTowers(4).Layer2(0), 1 => ShiftTowers(3).Layer2(2), 2 => ShiftTowers(3).Layer2(3), 3 => ShiftTowers(5).Layer2(2), 4 => ShiftTowers(5).Layer2(1), 5 => ShiftTowers(5).Layer2(0),
224  6 => ShiftTowers(1).Layer2(0), 7 => ShiftTowers(0).Layer2(2), 8 => ShiftTowers(0).Layer2(3), 9 => ShiftTowers(2).Layer2(2), 10 => ShiftTowers(2).Layer2(1), 11 => ShiftTowers(2).Layer2(0)
225  );
226 
227  when others => -- 011
228  OutJetEnvData <= (0 => ShiftTowers(4).Layer2(1), 1 => ShiftTowers(4).Layer2(0), 2 => ShiftTowers(3).Layer2(3), 3 => ShiftTowers(5).Layer2(3), 4 => ShiftTowers(5).Layer2(2), 5 => ShiftTowers(5).Layer2(1),
229  6 => ShiftTowers(1).Layer2(1), 7 => ShiftTowers(1).Layer2(0), 8 => ShiftTowers(0).Layer2(3), 9 => ShiftTowers(2).Layer2(3), 10 => ShiftTowers(2).Layer2(2), 11 => ShiftTowers(2).Layer2(1)
230  );
231  end case;
232 
233  end if;
234  end process;
235 
236 ----------------------------------------------------------------------------------------------------------------------------------------------------------------
237 -- Output connections
238 ----------------------------------------------------------------------------------------------------------------------------------------------------------------
239  OUT_Energy_L0 <= OutEnergy_L0;
240  OUT_Energy_L1 <= OutEnergy_L1;
241  OUT_Energy_L2 <= OutEnergy_L2;
242  OUT_Energy_L3 <= OutEnergy_L3;
243  OUT_Energy_HAD <= OutEnergy_HAD;
244 
245  OUT_JetEnvData <= OutJetEnvData;
246  OUT_JetCoreData <= OutJetCoreData;
247 
248 end Behavioral;
Input Data Multiplexer for Tau: addresses SuperCells to the correct sum area.
Input Data Multiplexer for Tau: addresses SuperCells to the correct sum area.
in CLK std_logic
200 MHz clock