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

Back to eFEX documentation
EnergyConverter.vhd
Go to the documentation of this file.
1 
10 
11 library ieee;
12 use ieee.std_logic_1164.all;
13 use IEEE.NUMERIC_STD.all;
14 
15 library work;
16 use work.DataTypes.all;
17 use work.AlgoDataTypes.all;
18 
20 entity EnergyConverter is
21  generic(
22  ENCODING_MODE : integer
23  );
24  port (
25  clk : in std_logic;
26  is_hadronic : in std_logic := '0';
27  IN_threshold : in std_logic_vector(INPUT_DATA_WIDTH-1 downto 0);
28  IN_Load : in std_logic;
29  IN_Data : in std_logic_vector(INPUT_DATA_WIDTH-1 downto 0);
30  OUT_Data : out std_logic_vector(DATA_WIDTH-1 downto 0)
31  );
32 end entity EnergyConverter;
33 
34 
36 architecture str of EnergyConverter is
37  -----------------------------------------------------------------------------
38  -- Internal signal declarations
39  -----------------------------------------------------------------------------
40  signal Data : std_logic_vector(INPUT_DATA_WIDTH-1 downto 0);
41 
42  signal IntegerOutData0 : unsigned(DATA_WIDTH-7 downto 0);
43  signal IntegerOutData1 : unsigned(DATA_WIDTH-6 downto 0);
44  signal IntegerOutData2 : unsigned(DATA_WIDTH-5 downto 0);
45  signal IntegerOutData3 : unsigned(DATA_WIDTH-4 downto 0);
46  signal IntegerOutData4 : unsigned(DATA_WIDTH-3 downto 0);
47  signal OverThreshold : std_logic;
48  signal Data2, Data4 : std_logic_vector(DATA_WIDTH-1 downto 0);
49  signal Saturated : std_logic;
50  signal Invalid : std_logic;
51  signal Negative : std_logic;
52 
53  signal OutData : std_logic_vector(DATA_WIDTH-1 downto 0);
54  signal special : std_logic_vector(1 downto 0);
55 
56 begin -- architecture str
57  -----------------------------------------------------------------------------
58  -- Component instantiations
59  -----------------------------------------------------------------------------
60 
61  ENCODING_IF : if ENCODING_MODE = 1 generate
62 
63  Sync_proc : process (clk)
64  begin
65  if rising_edge(clk) then
66  if IN_Load = '1' then
67  Data <= IN_Data;
68  OverThreshold <= '0' when unsigned(IN_Data) <= unsigned(IN_threshold) else '1';
69  Invalid <= '1' when IN_Data = "1111111110" or IN_Data = "1111111101" else '0';
70  Saturated <= '1' when unsigned(IN_Data) > 1011 else '0';
71  Negative <= '1' when IN_Data(INPUT_DATA_WIDTH -1 downto 5) = "00000" and is_hadronic = '0' else '0';
72  Data2 <= '0'&'0'&'0'&'0'& IN_Data &'0'&'0';
73  Data4 <= '0'&'0'& IN_Data &'0'&'0'&'0'&'0';
74 
75  IntegerOutData0 <= unsigned(IN_Data) - 32;
76  IntegerOutData1 <= unsigned(IN_Data &'0') - 128;
77  IntegerOutData2 <= unsigned(IN_Data &'0'&'0') - 512;
78  IntegerOutData3 <= unsigned(IN_Data &'0'&'0'&'0') - 2048;
79  IntegerOutData4 <= unsigned(IN_Data &'0'&'0'&'0'&'0') - 8192;
80  else
81  Data <= Data;
82  OverThreshold <= OverThreshold;
83  Invalid <= Invalid;
84  Saturated <= Saturated;
85  Data2 <= Data2;
86  Data4 <= Data4;
87 
88  IntegerOutData0 <= IntegerOutData0;
89  IntegerOutData1 <= IntegerOutData1;
90  IntegerOutData2 <= IntegerOutData2;
91  IntegerOutData3 <= IntegerOutData3;
92  IntegerOutData4 <= IntegerOutData4;
93 
94  end if;
95 
96  OUT_Data <= "0000000000000000" when OverThreshold = '0' or Invalid = '1' or Negative = '1' else
97  "1111111111111111" when Saturated = '1' else
98  std_logic_vector(unsigned(Data2) + unsigned(Data4)) when is_hadronic = '1' else
99  (DATA_WIDTH-3 downto 0 => std_logic_vector(IntegerOutData4), others => '0') when unsigned(Data) > 767 else
100  (DATA_WIDTH-4 downto 0 => std_logic_vector(IntegerOutData3), others => '0') when unsigned(Data) > 383 else
101  (DATA_WIDTH-5 downto 0 => std_logic_vector(IntegerOutData2), others => '0') when unsigned(Data) > 191 else
102  (DATA_WIDTH-6 downto 0 => std_logic_vector(IntegerOutData1), others => '0') when unsigned(Data) > 95 else
103  (DATA_WIDTH-7 downto 0 => std_logic_vector(IntegerOutData0), others => '0');
104 
105  end if;
106  end process Sync_proc;
107 
108  elsif ENCODING_MODE = 2 -- Steve'scheme
109  generate
110 
111  data_proc : process (clk)
112  begin
113  if rising_edge(clk) then
114  if IN_Load = '1' then
115  if is_hadronic = '1' then
116  OutData <= '0'& std_logic_vector(unsigned('0' & IN_Data & '0'&'0'&'0'&'0') + unsigned('0'& IN_Data &'0'&'0'));
117  else
118  case IN_Data(9 downto 8) is
119  when "00" =>
120  if IN_Data(7 downto 5) = "000" then
121  OutData <= "0000000000000000";
122  else
123  OutData <= '0'&'0'&'0'&'0'&'0'&'0'&'0'&'0'&std_logic_vector(unsigned(IN_Data(7 downto 0)) - 32); --8 bit
124  end if;
125  when "01" =>
126  OutData <= '0'&'0'&'0'&'0'&'0'&'0'&std_logic_vector(unsigned('0'&IN_Data(7 downto 0)&'0') + 224); --9 bit
127  when "10" =>
128  OutData <= '0'&'0'&'0'&'0'&'0'&std_logic_vector(unsigned('0'&IN_Data(7 downto 0)&'0'&'0') + 736); --11 bit
129  when others =>
130  OutData <= '0'&'0'&'0'&std_logic_vector(unsigned('0'&IN_Data(7 downto 0)&'0'&'0'&'0'&'0') + 1760); --12 bit
131  end case;
132  end if;
133  else
134  OutData <= OutData;
135  end if;
136  end if;
137  end process data_proc;
138 
139  special_proc : process (clk)
140  begin
141  if rising_edge(clk) then
142  if IN_Load = '1' then
143  if unsigned(IN_Data) <= unsigned(IN_threshold) then
144  special <= "01";
145  elsif IN_Data(INPUT_DATA_WIDTH-1 downto 2) = "11111111" then --as bit 8 and 9 are '1' this can't be hadronic
146  case IN_Data(1 downto 0) is
147  when "00" =>
148  special <= "00"; -- 1020 is not special
149  when "11" =>
150  special <= "10"; --saturated
151  when others =>
152  special <= "01"; -- 1021 and 1022 are to be zeroed
153  end case;
154  else
155  special <= "00";
156  end if;
157  else
158  special <= special;
159  end if;
160  end if;
161  end process special_proc;
162 
163 
164  out_proc : process (clk)
165  begin
166  if rising_edge(clk) then
167  case special is
168  when "01" =>
169  OUT_Data <= "0000000000000000";
170  when "10" =>
171  OUT_Data <= "1111111111111111";
172  when others =>
173  OUT_Data <= OutData;
174  end case;
175  end if;
176  end process out_proc;
177 
178  end generate;
179 
180 end architecture str;
External data-types and functions.
Energy converter module.
Energy converter module.