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

Back to eFEX documentation
AlgoDataTypes.vhd
Go to the documentation of this file.
1 -------------------------------------------------------
10 library IEEE;
11 use IEEE.STD_LOGIC_1164.all;
12 use IEEE.NUMERIC_STD.all;
13 
15 package AlgoDataTypes is
16 
17 -----------------------------------------------------------------------------
18 -- eFEX data Parameter
19 -----------------------------------------------------------------------------
20 
21  constant INPUT_DATA_WIDTH : integer := 10;
22 
23  constant INPUT_COLUMNS : integer := 6;
24  constant INPUT_ROWS : integer := 10;
25  constant INPUT_TOWERS : integer := INPUT_ROWS*INPUT_COLUMNS;
26 
27 -------------------------------------------------------------------------------
28 -- Trigger Tower Parameters
29 -------------------------------------------------------------------------------
30 
31  constant LAYER0 : integer := 1;
32  constant LAYER1 : integer := 4;
33  constant LAYER2 : integer := 4;
34  constant LAYER3 : integer := 1;
35  constant HADRON : integer := 1;
36 
37  constant LAYERS : integer := LAYER0 + LAYER1 + LAYER2 + LAYER3 + HADRON;
38 
39 -------------------------------------------------------------------------------
40 -- Trigger Object Parameters
41 -------------------------------------------------------------------------------
42 
43  constant OUT_XTOB_WIDTH : integer := 64;
44  constant OUT_TOB_WIDTH : integer := 32;
45  constant OUTPUT_TOBS : integer := 8;
46 
47 -------------------------------------------------------------------------------
48 -- Useful subtypes, types, constants
49 -------------------------------------------------------------------------------
50 
51  subtype BCID_t is std_logic_vector(6 downto 0);
52  type BCID_array is array(59 downto 0) of BCID_t;
53 
55  subtype AlgoWord is std_logic_vector(INPUT_DATA_WIDTH-1 downto 0);
56 
58  type AlgoWords is array(natural range <>) of AlgoWord;
59 
61  type AlgoLayer0 is array(LAYER0-1 downto 0) of AlgoWord;
63  type AlgoLayer1 is array(LAYER1-1 downto 0) of AlgoWord;
65  type AlgoLayer2 is array(LAYER2-1 downto 0) of AlgoWord;
67  type AlgoLayer3 is array(LAYER3-1 downto 0) of AlgoWord;
69  type AlgoHadron is array(HADRON-1 downto 0) of AlgoWord;
70 
71  constant ZERO_ALGO_WORD : AlgoWord := (others => '0');
72 
84  type AlgoTower is record
85  Layer0 : AlgoLayer0;
86  Layer1 : AlgoLayer1;
87  Layer2 : AlgoLayer2;
88  Layer3 : AlgoLayer3;
89  Hadron : AlgoHadron;
90  end record;
91 
93  constant ZERO_ALGO_TOWER : AlgoTower := (Layer0 => ((others => (others => '0'))),
94  Layer1 => ((others => (others => '0'))),
95  Layer2 => ((others => (others => '0'))),
96  Layer3 => ((others => (others => '0'))),
97  Hadron => ((others => (others => '0'))));
98 
100  type AlgoColumn is array(INPUT_ROWS-1 downto 0) of AlgoTower;
101 
102 -------------------------------------------------------------------------------
104  type Algo2DInput is array(INPUT_COLUMNS-1 downto 0, INPUT_ROWS-1 downto 0) of AlgoTower;
105 -------------------------------------------------------------------------------
106 
107 -------------------------------------------------------------------------------
109  type AlgoInput is array(INPUT_COLUMNS-1 downto 0) of AlgoColumn;
110 
111  constant ZERO_ALGO_INPUT : AlgoInput := (others => (others => ZERO_ALGO_TOWER));
112 -------------------------------------------------------------------------------
113 
114 -----------------------------------------------------------------------------
115 -- OUTPUT
116 -----------------------------------------------------------------------------
118  subtype AlgoXTriggerObject is std_logic_vector(OUT_XTOB_WIDTH-1 downto 0);
120  subtype AlgoTriggerObject is std_logic_vector(OUT_TOB_WIDTH-1 downto 0);
122  type AlgoTriggerObjects is array (natural range <>) of AlgoTriggerObject;
123  type AlgoXTriggerObjects is array (natural range <>) of AlgoXTriggerObject;
124 -------------------------------------------------------------------------------
126  type AlgoOutput is array(OUTPUT_TOBS-1 downto 0) of AlgoTriggerObject;
128  type AlgoXOutput is array(OUTPUT_TOBS-1 downto 0) of AlgoXTriggerObject;
129 -------------------------------------------------------------------------------
130 
131  constant ZERO_ALGO_TRIGGER_OBJECT : AlgoTriggerObject := (others => '0');
132  constant ZERO_ALGO_XTRIGGER_OBJECT : AlgoXTriggerObject := (others => '0');
133 
134 -------------------------------------------------------------------------------
135 -- Conversion Functions
136 -------------------------------------------------------------------------------
137 
138  function to_AlgoInput (X : Algo2DInput) return AlgoInput;
139  function to_Algo2DInput (Y : AlgoInput) return Algo2DInput;
140  function to_LogicVector (Y : AlgoInput; Z : std_logic_vector(11 downto 0)) return std_logic_vector;
141  function to_AlgoInput (X : std_logic_vector) return AlgoInput;
142  function to_BCN (X : std_logic_vector) return std_logic_vector;
143 
144  function to_LogicVector (Y : AlgoOutput) return std_logic_vector;
145  function to_AlgoOutput (X : std_logic_vector) return AlgoOutput;
146  function to_AlgoXOutput (X : std_logic_vector) return AlgoXOutput;
147 
148  function to_LogicVector (Y : AlgoTriggerObject) return std_logic_vector;
149  function to_LogicVector2 (Y : AlgoXTriggerObject) return std_logic_vector;
150  function to_AlgoTriggerObject (X : std_logic_vector) return AlgoTriggerObject;
151  function to_AlgoTriggerObjects (X : AlgoOutput) return AlgoTriggerObjects;
152 
153 end package;
154 
156 package body AlgoDataTypes is
157 
159  function to_AlgoInput (X : Algo2DInput) return AlgoInput is
160  variable Y : AlgoInput;
161  begin
162  for i in 0 to (INPUT_COLUMNS-1) loop
163  for j in 0 to (INPUT_ROWS-1) loop
164  Y(i)(j) := X(i, j);
165  end loop;
166  end loop;
167 
168  return Y;
169  end;
170 
172  function to_Algo2DInput (Y : AlgoInput) return Algo2DInput is
173  variable X : Algo2DInput;
174  begin
175  for i in 0 to (INPUT_COLUMNS-1) loop
176  for j in 0 to (INPUT_ROWS-1) loop
177  X(i, j) := Y(i)(j);
178  end loop;
179  end loop;
180 
181  return X;
182  end;
183 
208  function to_LogicVector (Y : AlgoInput; Z : std_logic_vector(11 downto 0)) return std_logic_vector is
209  variable X : std_logic_vector(128*INPUT_TOWERS-1 downto 0);
210  begin
211  for c in 0 to (INPUT_COLUMNS-1) loop
212  for r in 0 to (INPUT_ROWS-1) loop
213  X(127 + 128*(c*INPUT_ROWS + r) downto 128*(c*INPUT_ROWS + r)) := "11" & Z(9 downto 0) & Y(c)(r).Hadron(0) & Y(c)(r).Layer3(0) &
214  "10" & Y(c)(r).Layer2(3) & Y(c)(r).Layer2(2) & Y(c)(r).Layer2(1) &
215  "01" & Y(c)(r).Layer2(0) & Y(c)(r).Layer1(3) & Y(c)(r).Layer1(2) &
216  "00" & Y(c)(r).Layer1(1) & Y(c)(r).Layer1(0) & Y(c)(r).Layer0(0);
217  end loop;
218  end loop;
219 
220  return X;
221  end;
222 
227  function to_AlgoInput (X : std_logic_vector) return AlgoInput is
228  variable Y : AlgoInput;
229  begin
230  for c in 0 to (INPUT_COLUMNS-1) loop
231  for r in 0 to (INPUT_ROWS-1) loop
232  Y(c)(r).Layer0(0) := X(INPUT_DATA_WIDTH-1 + c*INPUT_ROWS*128+INPUT_DATA_WIDTH*00+r*128+0 downto c*INPUT_ROWS*128+INPUT_DATA_WIDTH*00+r*128+0);
233  Y(c)(r).Layer1(0) := X(INPUT_DATA_WIDTH-1 + c*INPUT_ROWS*128+INPUT_DATA_WIDTH*01+r*128+0 downto c*INPUT_ROWS*128+INPUT_DATA_WIDTH*01+r*128+0);
234  Y(c)(r).Layer1(1) := X(INPUT_DATA_WIDTH-1 + c*INPUT_ROWS*128+INPUT_DATA_WIDTH*02+r*128+0 downto c*INPUT_ROWS*128+INPUT_DATA_WIDTH*02+r*128+0);
235  Y(c)(r).Layer1(2) := X(INPUT_DATA_WIDTH-1 + c*INPUT_ROWS*128+INPUT_DATA_WIDTH*03+r*128+2 downto c*INPUT_ROWS*128+INPUT_DATA_WIDTH*03+r*128+2);
236  Y(c)(r).Layer1(3) := X(INPUT_DATA_WIDTH-1 + c*INPUT_ROWS*128+INPUT_DATA_WIDTH*04+r*128+2 downto c*INPUT_ROWS*128+INPUT_DATA_WIDTH*04+r*128+2);
237  Y(c)(r).Layer2(0) := X(INPUT_DATA_WIDTH-1 + c*INPUT_ROWS*128+INPUT_DATA_WIDTH*05+r*128+2 downto c*INPUT_ROWS*128+INPUT_DATA_WIDTH*05+r*128+2);
238  Y(c)(r).Layer2(1) := X(INPUT_DATA_WIDTH-1 + c*INPUT_ROWS*128+INPUT_DATA_WIDTH*06+r*128+4 downto c*INPUT_ROWS*128+INPUT_DATA_WIDTH*06+r*128+4);
239  Y(c)(r).Layer2(2) := X(INPUT_DATA_WIDTH-1 + c*INPUT_ROWS*128+INPUT_DATA_WIDTH*07+r*128+4 downto c*INPUT_ROWS*128+INPUT_DATA_WIDTH*07+r*128+4);
240  Y(c)(r).Layer2(3) := X(INPUT_DATA_WIDTH-1 + c*INPUT_ROWS*128+INPUT_DATA_WIDTH*08+r*128+4 downto c*INPUT_ROWS*128+INPUT_DATA_WIDTH* 8+r*128+4);
241  Y(c)(r).Layer3(0) := X(INPUT_DATA_WIDTH-1 + c*INPUT_ROWS*128+INPUT_DATA_WIDTH*09+r*128+6 downto c*INPUT_ROWS*128+INPUT_DATA_WIDTH* 9+r*128+6);
242  Y(c)(r).Hadron(0) := X(INPUT_DATA_WIDTH-1 + c*INPUT_ROWS*128+INPUT_DATA_WIDTH*10+r*128+6 downto c*INPUT_ROWS*128+INPUT_DATA_WIDTH*10+r*128+6);
243  end loop;
244  end loop;
245 
246  return Y;
247  end;
248 
249  function to_BCN (X : std_logic_vector) return std_logic_vector is
250  variable Y : std_logic_vector(11 downto 0);
251  begin
252  Y := "00"& X(125 downto 116);
253  return Y;
254  end;
255 
256 
258  function to_LogicVector (Y : AlgoOutput) return std_logic_vector is
259  variable X : std_logic_vector(OUTPUT_TOBS*OUT_TOB_WIDTH-1 downto 0);
260  begin
261  for i in 0 to (OUTPUT_TOBS-1) loop
262  X(i*OUT_TOB_WIDTH + OUT_TOB_WIDTH-1 downto i*OUT_TOB_WIDTH) := Y(i);
263  end loop;
264 
265  return X;
266  end;
267 
269  function to_AlgoOutput (X : std_logic_vector) return AlgoOutput is
270  variable Y : AlgoOutput;
271  begin
272  for i in 0 to (OUTPUT_TOBS-1) loop
273  Y(i) := X(i*OUT_TOB_WIDTH + OUT_TOB_WIDTH-1 downto i*OUT_TOB_WIDTH);
274  end loop;
275 
276  return Y;
277  end;
278 
280  function to_AlgoXOutput (X : std_logic_vector) return AlgoXOutput is
281  variable Y : AlgoXOutput;
282  begin
283  for i in 0 to (OUTPUT_TOBS-1) loop
284  Y(i) := X(i*OUT_TOB_WIDTH + OUT_TOB_WIDTH-1 downto i*OUT_TOB_WIDTH);
285  end loop;
286 
287  return Y;
288  end;
289 
291  function to_LogicVector (Y : AlgoTriggerObject) return std_logic_vector is
292  variable X : std_logic_vector(OUT_TOB_WIDTH-1 downto 0);
293  begin
294  for i in 0 to (OUT_TOB_WIDTH-1) loop
295  X(i) := Y(i);
296  end loop;
297 
298  return X;
299  end;
300 
302  function to_LogicVector2 (Y : AlgoXTriggerObject) return std_logic_vector is
303  variable X : std_logic_vector(OUT_XTOB_WIDTH-1 downto 0);
304  begin
305  for i in 0 to (OUT_XTOB_WIDTH-1) loop
306  X(i) := Y(i);
307  end loop;
308 
309  return X;
310  end;
311 
312 
313 
315  function to_AlgoTriggerObject (X : std_logic_vector) return AlgoTriggerObject is
316  variable Y : AlgoTriggerObject;
317  begin
318  for i in 0 to (OUT_TOB_WIDTH-1) loop
319  Y(i) := X(i);
320  end loop;
321 
322  return Y;
323  end;
324 
325  function to_AlgoTriggerObjects (
326  X : AlgoOutput)
327  return AlgoTriggerObjects is
328  variable Y : AlgoTriggerObjects(OUTPUT_TOBS-1 downto 0);
329  begin -- function to_AlgoTriggerObjects
330  for i in 0 to (OUTPUT_TOBS-1) loop
331  Y(i) := X(i);
332  end loop;
333  return Y;
334  end function to_AlgoTriggerObjects;
335 
336 
337 
338 end AlgoDataTypes;
External data-types and functions.
( LAYER2- 1 downto 0) AlgoWord AlgoLayer2
External layer 2 array: dimension 4.
( INPUT_ROWS- 1 downto 0) AlgoTower AlgoColumn
Algorithm Phi column.
array(natural range <> ) of AlgoWord AlgoWords
External arra of AlgoWord.
( HADRON- 1 downto 0) AlgoWord AlgoHadron
External hadronic layer array: dimension 1.
( LAYER1- 1 downto 0) AlgoWord AlgoLayer1
External layer 1 array: dimension 4.
( OUTPUT_TOBS- 1 downto 0) AlgoTriggerObject AlgoOutput
Algorithm OUTPUT port.
array(natural range <> ) of AlgoTriggerObject AlgoTriggerObjects
Algorithm OUTPUT port.
( INPUT_COLUMNS- 1 downto 0) AlgoColumn AlgoInput
Algorithm INPUT port.
std_logic_vector( OUT_TOB_WIDTH- 1 downto 0) AlgoTriggerObject
Algorithm Trigger Object TOB.
AlgoTower
Data-structure containing energy samples for the 4+hadronic layers.
( LAYER0- 1 downto 0) AlgoWord AlgoLayer0
External layer 0 array: dimension 1.
( LAYER3- 1 downto 0) AlgoWord AlgoLayer3
External layer 3 array: dimension 1.
AlgoTower :=( Layer0=>(( others =>( others => '0'))), Layer1=>(( others =>( others => '0'))), Layer2=>(( others =>( others => '0'))), Layer3=>(( others =>( others => '0'))), Hadron=>(( others =>( others => '0')))) ZERO_ALGO_TOWER
An AlgoTower filled with zeroes.
std_logic_vector( OUT_XTOB_WIDTH- 1 downto 0) AlgoXTriggerObject
Algorithm Extended Trigger Object XTOB.
( INPUT_COLUMNS- 1 downto 0, INPUT_ROWS- 1 downto 0) AlgoTower Algo2DInput
Algorithm 2D INPUT port.
std_logic_vector( INPUT_DATA_WIDTH- 1 downto 0) AlgoWord
External (10 bit) non-linearly encoded data word.
( OUTPUT_TOBS- 1 downto 0) AlgoXTriggerObject AlgoXOutput
Algorithm XOUTPUT port.