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

Back to eFEX documentation
ipbus_outputRAM_wrapper.vhd
Go to the documentation of this file.
1 
40 
42 library IEEE;
43 use IEEE.STD_LOGIC_1164.all;
44 use ieee.numeric_std.all;
46 library ipbus_lib;
47 
49 use ipbus_lib.ipbus.all;
51 use work.DataTypes.all;
53 use work.AlgoDataTypes.all;
54 
57  port(
58  clk_ipb : in std_logic;
59  rst : in std_logic;
60  ipb_in : in ipb_wbus;
61  ipb_out : out ipb_rbus;
62  AlgoIn : in AlgoOutput;
63 
64  BCNIn : in std_logic_vector(11 downto 0);
65  SpyBCNIn : in std_logic := '0';
66 
67  rclk : in std_logic;
68  Sync : in std_logic;
69  we : in std_logic := '0';
70  AlgoOut : out AlgoTriggerObjects(7 downto 0)
71  );
72 
74 
76 architecture rtl of ipbus_outputRAM_wrapper is
77 
78  component AlgoOutputRAM
79  port (
80  clka : in std_logic;
81  ena : in std_logic;
82  wea : in std_logic_vector(0 downto 0);
83  addra : in std_logic_vector(9 downto 0);
84  dina : in std_logic_vector(31 downto 0);
85  douta : out std_logic_vector(31 downto 0);
86  clkb : in std_logic;
87  enb : in std_logic;
88  web : in std_logic_vector(0 downto 0);
89  addrb : in std_logic_vector(6 downto 0);
90  dinb : in std_logic_vector(255 downto 0);
91  doutb : out std_logic_vector(255 downto 0)
92  );
93  end component;
94 
95 
96  -- algorithm signals
97  signal din : std_logic_vector(255 downto 0);
98  signal q : std_logic_vector(255 downto 0);
99  signal counter : std_logic_vector(6 downto 0) := "0000000"; --16 BCs*5TOBs
100  signal BC_counter : std_logic_vector(3 downto 0) := "0000"; --16 BCs*5TOBs
101  signal S1 : std_logic := '0';
102  signal AlgoOut3, AlgoOut2, AlgoOut1 : AlgoTriggerObjects(7 downto 0);
103 
104 
105  --ipbus signals
106  signal ack : std_logic;
107  signal ack2 : std_logic;
108  signal ipbus_write : std_logic_vector(0 downto 0);
109  signal write_enable : std_logic_vector(0 downto 0);
110 
111 begin
112  IPBUS_RAM : process(clk_ipb)
113  begin
114  if rising_edge(clk_ipb) then
115  if ipb_in.ipb_strobe = '1' and ipb_in.ipb_write = '1' then
116  ipbus_write(0) <= '1';
117  else
118  ipbus_write(0) <= '0';
119  end if;
120  ack2 <= ipb_in.ipb_strobe and (not ack2) and (not ack);
121  ack <= ack2;
122 
123  end if;
124  end process;
125 
126  ipb_out.ipb_ack <= ack;
127  ipb_out.ipb_err <= '0';
128  write_enable(0) <= we;
129 
131  COUNTER_PROC : process(rclk)
132  begin
133  if rising_edge(rclk) then
134  S1 <= Sync;
135  if S1 = '1' then
136  BC_counter <= std_logic_vector(unsigned(BC_counter) + 1);
137  end if;
138 
139  if BC_Counter = "0000" and S1 = '1' then
140  counter <= (others => '0');
141  else
142  counter <= std_logic_vector(unsigned(counter) + 1);
143  end if;
144 
145  -- Output is sync'ed with next BC
146  AlgoOut <= AlgoOut1;
147  AlgoOut1 <= AlgoOut2;
148  AlgoOut2 <= AlgoOut3;
149  end if;
150  end process;
151 
153  ALGO_OUTPUT_RAM : AlgoOutputRAM
154  port map (
155  clka => clk_ipb,
156  ena => ipb_in.ipb_strobe,
157  wea => ipbus_write,
158  addra => ipb_in.ipb_addr(9 downto 0),
159  dina => ipb_in.ipb_wdata,
160  douta => ipb_out.ipb_rdata,
161  clkb => rclk,
162  enb => '1',
163  web => write_enable,
164  addrb => counter,
165  dinb => din,
166  doutb => q
167  );
168 
169  -- Conversion between algorithm data-types and std_logic_vectors
170  AlgoOut3 <= to_AlgoTriggerObjects(to_AlgoOutput(q));
171 
172  din <= to_LogicVector(AlgoIn) when spyBCNIn = '0' else to_LogicVector(AlgoIn)(din'high - 32 downto 0) & x"f" & x"0" & BCNIn & x"fff";
173 
174 end rtl;
External data-types and functions.
( OUTPUT_TOBS- 1 downto 0) AlgoTriggerObject AlgoOutput
Algorithm OUTPUT port.
array(natural range <> ) of AlgoTriggerObject AlgoTriggerObjects
Algorithm OUTPUT port.
IPBus wrapper for output spy/playback RAM for Algorithm module.
IPBus wrapper for output spy/playback RAM for Algorithm module.