Belle II KLM Scint Firmware  1
WaveAndPedStaging.vhd
1 library IEEE;
2  use IEEE.std_logic_1164.ALL;
3  use IEEE.NUMERIC_STD.ALL;
4  use IEEE.std_logic_MISC.ALL;
5  use IEEE.std_logic_UNSIGNED.ALL;
6 Library work;
7  use work.klm_scint_pkg.all;
8 
9 
23 
25  Generic (
26  FIFO_DIN_SHIFT_DEPTH_g : integer := 2
27  );
28  Port (
29  clk : in std_logic := '0';
30  reset : in std_logic := '0';
31  prime_fifos : in std_logic := '0';
32  summing_ena : in std_logic := '0';
33 
34  -- fifo writing
35  wave_fifo_wr_asic : in std_logic_vector(4 downto 0) := (others=>'0');
36  wave_fifo_wr_ena : in std_logic := '0';
37  main_samp_in : in std_logic_vector(11 downto 0) := (others=>'0');
38  ped_fifo_wr_asic : in std_logic_vector(4 downto 0) := (others=>'0');
39  ped_fifo_wr_ena : in std_logic := '0';
40  ped_fifo_din : in std_logic_vector(11 downto 0) := (others=>'0');
41 
42  -- fifo reading
43  fifo_rd_asic : in std_logic_vector(4 downto 0) := (others=>'0');
44  fifo_rd_ena : in std_logic := '0';
45  fifo_dout : out std_logic_vector(23 downto 0) := (others=>'0');
46  fifo_drdy : out std_logic := '0';
47 
48  fifos_empty : out std_logic := '0'
49 
50  );
51 end WaveAndPedStaging;
52 
53 architecture Behavioral of WaveAndPedStaging is
54 
55  type ped_navg_adder is (
56  IDLE,
57  WAIT_FIFO_READ_LAG,
58  ADD_SAMPLE_AND_WRITE_FIFOS,
59  PRIME_FIFOS_WITH_ZEROS
60  );
61  signal add_peds_state : ped_navg_adder := IDLE;
62 
63  signal i_ped_fifo_wr_ena : std_logic_vector(4 downto 0) := "00000";
64  signal i_ped_fifo_din : std_logic_vector(11 downto 0) := (others=>'0');
65 
66  signal i_wave_fifo_wr_ena : slv5(FIFO_DIN_SHIFT_DEPTH_g - 1 downto 0) := (others=>(others=>'0'));
67  signal wave_fifo_wr_asic_copy : std_logic_vector(4 downto 0) := (others=>'0');
68  signal i_fifo_rd_ena : std_logic_vector(4 downto 0) := "00000";
69  signal i_fifo_rd_asic : std_logic_vector(4 downto 0) := "00001";
70  signal i_wave_fifo_din : slv12(FIFO_DIN_SHIFT_DEPTH_g - 1 downto 0) := (others=>(others=>'0'));
71  signal main_samp_in_copy : std_logic_vector(11 downto 0) := (others=>'0');
72 
73  signal wave_fifo_dout_q0 : slv12(4 downto 0) := (others=>"000000000000");
74  signal wave_fifo_dout_q1 : slv12(4 downto 0) := (others=>"000000000000");
75  signal wave_fifo_dout_q2 : std_logic_vector(11 downto 0) := (others=>'0');
76  signal fifo_drdy_q0 : std_logic := '0';
77  signal fifo_drdy_q1 : std_logic := '0';
78  signal fifo_drdy_q2 : std_logic := '0';
79  signal ped_fifo_dout_q0 : slv12(4 downto 0) := (others=>"000000000000");
80  signal ped_fifo_dout_q1 : slv12(4 downto 0) := (others=>"000000000000");
81  signal ped_fifo_dout_q2 : std_logic_vector(11 downto 0) := (others=>'0');
82 
83  signal start_adder : std_logic := '0';
84  signal pedcalc_dual_fifo_wr_asic : std_logic_vector(4 downto 0) := (others=>'0');
85  signal pedcalc_dual_fifo_wr_ena : std_logic_vector(4 downto 0) := (others=>'0');
86  signal pedcalc_dual_fifo_din : std_logic_vector(23 downto 0) := (others=>'0');
87  signal pedcalc_dual_fifo_rd_asic : std_logic_vector(4 downto 0) := (others=>'0');
88  signal pedcalc_dual_fifo_rd_ena : std_logic_vector(4 downto 0) := (others=>'0');
89 
90  signal ped_fifos_empty : std_logic_vector(4 downto 0) := (others => '0');
91  signal wave_fifos_empty : std_logic_vector(4 downto 0) := (others => '0');
92  signal all_ped_fifos_empty : std_logic := '0';
93  signal all_wave_fifos_empty : std_logic := '0';
94  signal i_ped_reset : std_logic_vector(4 downto 0) := (others => '0');
95  signal i_wave_reset : std_logic_vector(4 downto 0) := (others => '0');
96  signal reset_q1 : std_logic_vector(1 downto 0) := (others => '0');
97 
98 
99 begin
100 
101  fifo_dout_mux : process(clk, i_fifo_rd_asic, wave_fifo_dout_q1, fifo_drdy_q1, ped_fifo_dout_q1)
102  begin
103  if rising_edge(clk) then
104  case i_fifo_rd_asic is
105  -- when "00000" =>
106  -- wave_fifo_dout_q2 <= (others=>'-');
107  -- ped_fifo_dout_q2 <= "------------";
108  -- fifo_drdy_q2 <= '0';
109  when "00001" =>
110  wave_fifo_dout_q2 <= wave_fifo_dout_q1(0);
111  ped_fifo_dout_q2 <= ped_fifo_dout_q1(0);
112  fifo_drdy_q2 <= fifo_drdy_q1;
113  when "00010" =>
114  wave_fifo_dout_q2 <= wave_fifo_dout_q1(1);
115  ped_fifo_dout_q2 <= ped_fifo_dout_q1(1);
116  fifo_drdy_q2 <= fifo_drdy_q1;
117  when "00100" =>
118  wave_fifo_dout_q2 <= wave_fifo_dout_q1(2);
119  ped_fifo_dout_q2 <= ped_fifo_dout_q1(2);
120  fifo_drdy_q2 <= fifo_drdy_q1;
121  when "01000" =>
122  wave_fifo_dout_q2 <= wave_fifo_dout_q1(3);
123  ped_fifo_dout_q2 <= ped_fifo_dout_q1(3);
124  fifo_drdy_q2 <= fifo_drdy_q1;
125  when "10000" =>
126  wave_fifo_dout_q2 <= wave_fifo_dout_q1(4);
127  ped_fifo_dout_q2 <= ped_fifo_dout_q1(4);
128  fifo_drdy_q2 <= fifo_drdy_q1;
129  when others =>
130  -- wave_fifo_dout_q2 <= (others=>'-');
131  -- ped_fifo_dout_q2 <= "------------";
132  fifo_drdy_q2 <= '0';
133  end case;
134  end if;
135  end process fifo_dout_mux;
136 
137 
138  dout_concatenation: process(clk, fifo_drdy_q2, wave_fifo_dout_q2, ped_fifo_dout_q2)
139  begin
140  if rising_edge(clk) then
141  fifo_dout <= ped_fifo_dout_q2 & wave_fifo_dout_q2;
142  fifo_drdy <= fifo_drdy_q2;
143  end if;
144  end process dout_concatenation;
145 
146 
147  dout_buf: process(clk, wave_fifo_dout_q0, ped_fifo_dout_q0, fifo_drdy_q0)
148  begin
149  if rising_edge(clk) then
150  wave_fifo_dout_q1 <= wave_fifo_dout_q0;
151  fifo_drdy_q1 <= fifo_drdy_q0;
152  ped_fifo_dout_q1 <= ped_fifo_dout_q0;
153  end if;
154  end process;
155 
156 
157  chk_all_empty_fan_in_1: process(clk, ped_fifos_empty, wave_fifos_empty)
158  begin
159  if rising_edge(clk) then
160  all_ped_fifos_empty <= and_reduce(ped_fifos_empty);
161  all_wave_fifos_empty <= and_reduce(wave_fifos_empty);
162  end if;
163  end process;
164 
165  chk_all_empty_fan_in_2: process(clk, all_ped_fifos_empty, all_wave_fifos_empty)
166  begin
167  if rising_edge(clk) then
168  fifos_empty <= all_ped_fifos_empty and all_wave_fifos_empty;
169  end if;
170  end process;
171 
172  reset_fanout_1: process(clk, reset)
173  begin
174  if rising_edge(clk) then
175  reset_q1 <= reset & reset;
176  end if;
177  end process;
178 
179  reset_fanout_2: process(clk, reset_q1)
180  begin
181  if rising_edge(clk) then
182  i_ped_reset <= reset_q1(0) & reset_q1(0) & reset_q1(0) & reset_q1(0) & reset_q1(0);
183  i_wave_reset <= reset_q1(1) & reset_q1(1) & reset_q1(1) & reset_q1(1) & reset_q1(1);
184  end if;
185  end process;
186 
187 
188  PedFifo : for i in 0 to 4 generate
189  -- ped_i : entity work.waveFIFO
190  ped_i : entity work.fifo_cc
191  generic map(
192  DATA_WIDTH => 12,
193  DEPTH => 7 -- bit
194  )
195  PORT MAP (
196  CLK => clk,
197  RST => i_ped_reset(i),
198  -- SRST => i_ped_reset(i),
199  WEN => i_ped_fifo_wr_ena(i),
200  REN => i_fifo_rd_ena(i),
201  -- WR_EN => i_ped_fifo_wr_ena(i),
202  -- RD_EN => i_fifo_rd_ena(i),
203  DIN => i_ped_fifo_din,
204  DOUT => ped_fifo_dout_q0(i),
205  FULL => open, --ped_fifo_full(i),
206  EMPTY => ped_fifos_empty(i)
207  );
208  end generate;
209 
210  WaveFifo : for i in 0 to 4 generate
211  -- wave_i : entity work.pedFIFO
212  wave_i : entity work.fifo_cc
213  generic map(
214  DATA_WIDTH => 12,
215  DEPTH => 7 -- bit
216  )
217  PORT MAP (
218  CLK => clk,
219  -- SRST => i_wave_reset(i),
220  RST => i_wave_reset(i),
221  WEN => i_wave_fifo_wr_ena(FIFO_DIN_SHIFT_DEPTH_g - 1)(i),
222  REN => i_fifo_rd_ena(i),
223  -- WR_EN => i_wave_fifo_wr_ena(i),
224  -- RD_EN => i_fifo_rd_ena(i),
225  DIN => i_wave_fifo_din(FIFO_DIN_SHIFT_DEPTH_g - 1),
226  DOUT => wave_fifo_dout_q0(i),
227  FULL => open, --wave_fifo_full(i),
228  EMPTY => wave_fifos_empty(i)
229  );
230  end generate;
231 
232 
233  sync_rdy_sig: process(clk, i_fifo_rd_ena)
234  begin
235  if rising_edge(clk) then
236  fifo_drdy_q0 <= '0';
237  if or_reduce(i_fifo_rd_ena) = '1' then
238  fifo_drdy_q0 <= '1';
239  end if;
240  end if;
241  end process;
242 
243 
244  mode_mux: process(clk, summing_ena, wave_fifo_wr_ena, fifo_rd_ena,
245  pedcalc_dual_fifo_wr_ena, pedcalc_dual_fifo_din,
246  pedcalc_dual_fifo_rd_ena,
247  wave_fifo_wr_asic, fifo_rd_asic, main_samp_in)
248  begin
249  if rising_edge(clk) then
250 
251  if summing_ena = '0' then -- normal mode
252  i_wave_fifo_wr_ena(i_wave_fifo_wr_ena'left downto 1) <= i_wave_fifo_wr_ena(i_wave_fifo_wr_ena'left - 1 downto 0);
253  asic_ena_mux : for i in 0 to 4 loop
254  i_wave_fifo_wr_ena(0)(i) <= wave_fifo_wr_ena and wave_fifo_wr_asic(i);
255  i_ped_fifo_wr_ena(i) <= ped_fifo_wr_ena and ped_fifo_wr_asic(i);
256  i_fifo_rd_ena(i) <= fifo_rd_ena and fifo_rd_asic(i);
257  end loop;
258  i_wave_fifo_din <= i_wave_fifo_din(i_wave_fifo_din'left - 1 downto 0) & main_samp_in;
259  i_ped_fifo_din <= ped_fifo_din;
260  i_fifo_rd_asic <= fifo_rd_asic;
261 
262  else -- add input to output and use ped fifos for carry bits
263  start_adder <= wave_fifo_wr_ena;
264  i_wave_fifo_wr_ena <= i_wave_fifo_wr_ena(i_wave_fifo_wr_ena'left - 1 downto 0) & pedcalc_dual_fifo_wr_ena;
265  i_ped_fifo_wr_ena <= pedcalc_dual_fifo_wr_ena;
266  i_wave_fifo_din <= i_wave_fifo_din(i_wave_fifo_din'left - 1 downto 0) & pedcalc_dual_fifo_din(11 downto 0);
267  i_ped_fifo_din <= pedcalc_dual_fifo_din(23 downto 12);
268  i_fifo_rd_ena <= pedcalc_dual_fifo_rd_ena;
269  i_fifo_rd_asic <= pedcalc_dual_fifo_rd_asic;
270  end if;
271 
272  end if;
273  end process mode_mux;
274 
275  cp_samp: process(clk, wave_fifo_wr_ena, main_samp_in)
276  begin
277  if rising_edge(clk) then
278  if wave_fifo_wr_ena = '1' then
279  main_samp_in_copy <= main_samp_in;
280  end if;
281  end if;
282  end process;
283 
284 
285 
286  add_peds: process(clk, start_adder, prime_fifos, wave_fifo_wr_asic, main_samp_in_copy,
287  ped_fifo_dout_q2, wave_fifo_dout_q2)
288  variable count : integer range 0 to 31 := 0;
289  begin
290  if rising_edge(clk) then
291  case add_peds_state is
292 
293  When IDLE =>
294  count := 0;
295  pedcalc_dual_fifo_wr_ena <= (others=>'0');
296  if start_adder = '1' then
297  wave_fifo_wr_asic_copy <= wave_fifo_wr_asic;
298  pedcalc_dual_fifo_rd_asic <= wave_fifo_wr_asic;
299  pedcalc_dual_fifo_rd_ena <= wave_fifo_wr_asic;
300  add_peds_state <= WAIT_FIFO_READ_LAG;
301  elsif prime_fifos = '1' then
302  add_peds_state <= PRIME_FIFOS_WITH_ZEROS;
303  else
304  add_peds_state <= IDLE;
305  end if;
306 
307  When WAIT_FIFO_READ_LAG =>
308  pedcalc_dual_fifo_rd_ena <= (others=>'0');
309  if count < 3 then
310  count := count + 1;
311  add_peds_state <= WAIT_FIFO_READ_LAG;
312  else
313  count := 0;
314  add_peds_state <= ADD_SAMPLE_AND_WRITE_FIFOS;
315  end if;
316 
317  When ADD_SAMPLE_AND_WRITE_FIFOS =>
318  pedcalc_dual_fifo_din <= ("000000000000" & main_samp_in_copy) + (ped_fifo_dout_q2 & wave_fifo_dout_q2);
319  pedcalc_dual_fifo_wr_ena <= wave_fifo_wr_asic_copy;
320  add_peds_state <= IDLE;
321 
322  When PRIME_FIFOS_WITH_ZEROS =>
323  pedcalc_dual_fifo_wr_ena <= "11111";
324  pedcalc_dual_fifo_din <= (others=>'0');
325  if count = 31 then
326  count := 0;
327  add_peds_state <= IDLE;
328  else
329  count := count + 1;
330  add_peds_state <= PRIME_FIFOS_WITH_ZEROS;
331  end if;
332 
333  When OTHERS =>
334  add_peds_state <= IDLE;
335 
336  end case;
337  end if;
338  end process;
339 
340 end Behavioral;
Definition: mem.vhd:103