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

Back to eFEX documentation
SeedFinder.vhd
Go to the documentation of this file.
1 
13 
14 library IEEE;
15 use IEEE.STD_LOGIC_1164.all;
16 use IEEE.NUMERIC_STD.all;
17 
18 library work;
19 use work.DataTypes.all;
20 
22 entity SeedFinder is
23  port (
24  CLK : in std_logic;
25  IN_Data : in DataWords(5 downto 0);
26  IN_DataUp : in DataWords(5 downto 0);
27  IN_DataDown : in DataWords(5 downto 0);
28  OUT_UpNotDown : out std_logic; --1 => up, 0 => down
29  OUT_Seed : out std_logic_vector(1 downto 0);
30  OUT_IsLocalMax : out std_logic;
31  OUT_IsMax : out std_logic);
32 end SeedFinder;
33 
34 architecture Behavioral of SeedFinder is
35 
36  signal Result : std_logic_vector(2 downto 0) := (others => '0');
37  signal UpOrDown, UpOrDown_d : std_logic_vector(3 downto 0) := (others => '0');
38  signal alpha, beta, gamma : std_logic := '0';
39  signal pos : std_logic_vector(3 downto 0) := "0000";
40 
42 begin
43 
44  OUT_IsMax <= '1';
45 
46  process (CLK)
47  begin
48  if rising_edge(CLK) then
49  -- first clock cycle
50  -- pos(0) is for IN_Data(1)
51  pos(0) <= '1' when not (IN_Data(0) > IN_Data(1)) and (IN_Data(1) > IN_Data(2)) and
52  not (IN_DataUp(0) > IN_Data(1)) and (IN_Data(1) > IN_DataUp(1)) and (IN_Data(1) > IN_DataUp(2)) and
53  not (IN_DataDown(0) > IN_Data(1)) and not (IN_DataDown(1) > IN_Data(1)) and (IN_Data(1) > IN_DataDown(2))
54  else '0';
55  -- pos(1) is for IN_Data(2)
56  pos(1) <= '1' when not (IN_Data(1) > IN_Data(2)) and (IN_Data(2) > IN_Data(3)) and
57  not (IN_DataUp(1) > IN_Data(2)) and (IN_Data(2) > IN_DataUp(2)) and (IN_Data(2) > IN_DataUp(3)) and
58  not (IN_DataDown(1) > IN_Data(2)) and not (IN_DataDown(2) > IN_Data(2)) and (IN_Data(2) > IN_DataDown(3))
59  else '0';
60  -- pos(2) is for IN_Data(3)
61  pos(2) <= '1' when not (IN_Data(2) > IN_Data(3)) and (IN_Data(3) > IN_Data(4)) and
62  not (IN_DataUp(2) > IN_Data(3)) and (IN_Data(3) > IN_DataUp(3)) and (IN_Data(3) > IN_DataUp(4)) and
63  not (IN_DataDown(2) > IN_Data(3)) and not (IN_DataDown(3) > IN_Data(3)) and (IN_Data(3) > IN_DataDown(4))
64  else '0';
65  -- pos(3) is for IN_Data(4)
66  pos(3) <= '1' when not (IN_Data(3) > IN_Data(4)) and (IN_Data(4) > IN_Data(5)) and
67  not (IN_DataUp(3) > IN_Data(4)) and (IN_Data(4) > IN_DataUp(4)) and (IN_Data(4) > IN_DataUp(5)) and
68  not (IN_DataDown(3) > IN_Data(4)) and not (IN_DataDown(4) > IN_Data(4)) and (IN_Data(4) > IN_DataDown(5))
69  else '0';
70 
71  -- in case of 2 maxima with the same energy, the higher theta wins
72  alpha <= '1' when (IN_Data(3) < IN_Data(1)) else '0'; -- '1' when pos(2) <= pos(0)
73  beta <= '1' when (IN_Data(4) < IN_Data(1)) else '0'; -- '1' when pos(3) <= pos(0)
74  gamma <= '1' when (IN_Data(4) < IN_Data(2)) else '0'; -- '1' when pos(3) <= pos(1)
75 
76  UpOrDown(0) <= '0' when IN_DataDown(1) > IN_DataUp(1) else '1';
77  UpOrDown(1) <= '0' when IN_DataDown(2) > IN_DataUp(2) else '1';
78  UpOrDown(2) <= '0' when IN_DataDown(3) > IN_DataUp(3) else '1';
79  UpOrDown(3) <= '0' when IN_DataDown(4) > IN_DataUp(4) else '1';
80 
81  -- second clock cycle
82  Result <= "111" when (pos = "1000") or (pos(3) = '1' and pos(0) = '1' and beta = '0') or (pos(3) = '1' and pos(1) = '1' and gamma = '0') else
83  "110" when (pos = "0100") or (pos(2) = '1' and pos(0) = '1' and alpha = '0') else
84  "101" when (pos = "0010") or (pos(1) = '1' and pos(3) = '1' and gamma = '1') else
85  "100" when (pos = "0001") or (pos(0) = '1' and pos(3) = '1' and beta = '1') or (pos(0) = '1' and pos(2) = '1' and alpha = '1') else
86  "000";
87  UpOrDown_d <= UpOrDown;
88 
89 
90 
91  end if;
92  end process;
93 
94  OUT_IsLocalMax <= Result(2);
95  -- up/down is evaluated in parallel for each of the 4 cells
96  -- the correct one is picked on the basis of the seed, i.e. Result(1 downto 0)
97  OUT_UpNotDown <= UpOrDown_d(to_integer(unsigned(Result(1 downto 0))));
98  OUT_Seed <= Result(1 downto 0);
99 
100 end Behavioral;
Seed Finder for the electromagnetic algorithm.
Definition: SeedFinder.vhd:22