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

Back to eFEX documentation
TopSortingModule.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 
21  generic (
22  STAGE : integer := 3;
23  N_TOBS : integer := 5
24  );
25  port (CLK : in std_logic;
26 
27  IN_Control : in AlgoRegister;
28  OUT_Status : out AlgoRegister;
29 
30  IN_Start : in std_logic;
31  IN_Data : in AlgoTriggerObjects((2**STAGE)-1 downto 0);
32 
33  OUT_Start : out std_logic;
34  OUT_Write : out std_logic;
35  OUT_Data : out AlgoTriggerObject
36  );
37 
40 architecture Behavioral of TopSortingModule is
41 
42  signal connector : AlgoTriggerObjects((2**(stage+1))-2 downto 0);
43  signal start : std_logic_vector((2**(stage+1))-2 downto 0);
44  signal writ : std_logic_vector((2**(stage+1))-2 downto 0);
45 
46 begin
47  OUT_Status <= x"a0a0a0a0";
48 
49  stage_gen : for s in 0 to (stage - 1) generate
50 
51  begin
52  ifFirst : if s = (stage -1) generate
53  begin
54  sorter_gen0 : for i in 0 to ((2**s) - 1) generate
55  begin
56  PAR_SORTER : entity work.ParallelSorter
57  generic map (
58  USE_EXTERNAL_WRITE => false,
59  N_TOBS_IN => N_TOBS,
60  N_TOBS_OUT => 7)
61  port map (
62  clk => CLK,
63  IN_Start => start(2*(2**s + i) downto 2*(2**s + i) - 1),
64  IN_Write => writ(2*(2**s + i) downto 2*(2**s + i) - 1),
65  IN_Data => connector(2*(2**s + i) downto 2*(2**s + i) - 1),
66 
67  OUT_Start => start((2**s) - 1 + i),
68  OUT_Write => writ((2**s) - 1 + i),
69  OUT_Data => connector((2**s) - 1 + i)
70  );
71  end generate sorter_gen0;
72  end generate ifFirst;
73 
74  ifAll : if s /= (stage -1) generate
75  sorter_gen : for i in 0 to ((2**s) - 1) generate
76  begin
77  PAR_SORTER : entity work.ParallelSorter
78  generic map (
79  USE_EXTERNAL_WRITE => true,
80  N_TOBS_IN => 7,
81  N_TOBS_OUT => 7)
82  port map (
83  clk => CLK,
84  IN_Start => start(2*(2**s + i) downto 2*(2**s + i) - 1),
85  IN_Write => writ(2*(2**s + i) downto 2*(2**s + i) - 1),
86  IN_Data => connector(2*(2**s + i) downto 2*(2**s + i) - 1),
87 
88  OUT_Start => start((2**s) - 1 + i),
89  OUT_Write => writ((2**s) - 1 + i),
90  OUT_Data => connector((2**s) - 1 + i)
91  );
92  end generate sorter_gen;
93  end generate ifAll;
94 
95  end generate stage_gen;
96 
97 
98  writ((2**(stage+1) - 2) downto (2**stage - 1)) <= (others => '0');
99 
100  process(CLK)
101  begin
102  if rising_edge(CLK) then
103  connector((2**(stage+1) - 2) downto (2**stage - 1)) <= IN_Data;
104  if IN_Start = '1' then
105  start((2**(stage+1) - 2) downto (2**stage - 1)) <= (others => '1');
106  else
107  start((2**(stage+1) - 2) downto (2**stage - 1)) <= (others => '0');
108  end if;
109  end if;
110  end process;
111 
112  process(CLK)
113  begin
114  if rising_edge(CLK) then
115  OUT_Data <= connector(0);
116  OUT_Write <= writ(0);
117  OUT_Start <= start(0);
118  end if;
119  end process;
120 
121 end Behavioral;
External data-types and functions.
array(natural range <> ) of AlgoTriggerObject AlgoTriggerObjects
Algorithm OUTPUT port.
std_logic_vector( OUT_TOB_WIDTH- 1 downto 0) AlgoTriggerObject
Algorithm Trigger Object TOB.
Parallel sorter module.
Top of TOB sorting module.
Top of TOB sorting module.