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;
26 FIFO_DIN_SHIFT_DEPTH_g : := 2 31 prime_fifos : in := '0';
32 summing_ena : in := '0';
35 wave_fifo_wr_asic : in (4 downto 0) := (others=>'0');
36 wave_fifo_wr_ena : in := '0';
37 main_samp_in : in (11 downto 0) := (others=>'0');
38 ped_fifo_wr_asic : in (4 downto 0) := (others=>'0');
39 ped_fifo_wr_ena : in := '0';
40 ped_fifo_din : in (11 downto 0) := (others=>'0');
43 fifo_rd_asic : in (4 downto 0) := (others=>'0');
44 fifo_rd_ena : in := '0';
45 fifo_dout : out (23 downto 0) := (others=>'0');
46 fifo_drdy : out := '0';
48 fifos_empty : out := '0' 51 end WaveAndPedStaging;
55 type ped_navg_adder is ( 58 ADD_SAMPLE_AND_WRITE_FIFOS, 59 PRIME_FIFOS_WITH_ZEROS 61 signal add_peds_state : ped_navg_adder := IDLE;
63 signal i_ped_fifo_wr_ena : (4 downto 0) := "00000";
64 signal i_ped_fifo_din : (11 downto 0) := (others=>'0');
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 : (4 downto 0) := (others=>'0');
68 signal i_fifo_rd_ena : (4 downto 0) := "00000";
69 signal i_fifo_rd_asic : (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 : (11 downto 0) := (others=>'0');
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 : (11 downto 0) := (others=>'0');
76 signal fifo_drdy_q0 : := '0';
77 signal fifo_drdy_q1 : := '0';
78 signal fifo_drdy_q2 : := '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 : (11 downto 0) := (others=>'0');
83 signal start_adder : := '0';
84 signal pedcalc_dual_fifo_wr_asic : (4 downto 0) := (others=>'0');
85 signal pedcalc_dual_fifo_wr_ena : (4 downto 0) := (others=>'0');
86 signal pedcalc_dual_fifo_din : (23 downto 0) := (others=>'0');
87 signal pedcalc_dual_fifo_rd_asic : (4 downto 0) := (others=>'0');
88 signal pedcalc_dual_fifo_rd_ena : (4 downto 0) := (others=>'0');
90 signal ped_fifos_empty : (4 downto 0) := (others => '0');
91 signal wave_fifos_empty : (4 downto 0) := (others => '0');
92 signal all_ped_fifos_empty : := '0';
93 signal all_wave_fifos_empty : := '0';
94 signal i_ped_reset : (4 downto 0) := (others => '0');
95 signal i_wave_reset : (4 downto 0) := (others => '0');
96 signal reset_q1 : (1 downto 0) := (others => '0');
101 fifo_dout_mux :
process(clk, i_fifo_rd_asic, wave_fifo_dout_q1, fifo_drdy_q1, ped_fifo_dout_q1)
103 if rising_edge(clk) then 104 case i_fifo_rd_asic is 106 -- wave_fifo_dout_q2 <= (others=>'-'); 107 -- ped_fifo_dout_q2 <= "------------"; 108 -- fifo_drdy_q2 <= '0'; 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;
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;
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;
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;
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;
130 -- wave_fifo_dout_q2 <= (others=>'-'); 131 -- ped_fifo_dout_q2 <= "------------"; 135 end process fifo_dout_mux;
138 dout_concatenation:
process(clk, fifo_drdy_q2, wave_fifo_dout_q2, ped_fifo_dout_q2)
140 if rising_edge(clk) then 141 fifo_dout <= ped_fifo_dout_q2 & wave_fifo_dout_q2;
142 fifo_drdy <= fifo_drdy_q2;
144 end process dout_concatenation;
147 dout_buf:
process(clk, wave_fifo_dout_q0, ped_fifo_dout_q0, fifo_drdy_q0)
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;
157 chk_all_empty_fan_in_1:
process(clk, ped_fifos_empty, wave_fifos_empty)
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);
165 chk_all_empty_fan_in_2:
process(clk, all_ped_fifos_empty, all_wave_fifos_empty)
167 if rising_edge(clk) then 168 fifos_empty <= all_ped_fifos_empty and all_wave_fifos_empty;
172 reset_fanout_1:
process(clk, reset)
174 if rising_edge(clk) then 175 reset_q1 <= reset & reset;
179 reset_fanout_2:
process(clk, reset_q1)
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);
188 PedFifo : for i in 0 to 4 generate 189 -- ped_i : entity work.waveFIFO 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
) 210 WaveFifo : for i in 0 to 4 generate 211 -- wave_i : entity work.pedFIFO 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
) 233 sync_rdy_sig:
process(clk, i_fifo_rd_ena)
235 if rising_edge(clk) then 237 if or_reduce(i_fifo_rd_ena) = '1' then 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)
249 if rising_edge(clk) then 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);
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;
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;
273 end process mode_mux;
275 cp_samp:
process(clk, wave_fifo_wr_ena, main_samp_in)
277 if rising_edge(clk) then 278 if wave_fifo_wr_ena = '1' then 279 main_samp_in_copy <= main_samp_in;
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 : range 0 to 31 := 0;
290 if rising_edge(clk) then 291 case add_peds_state is 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;
304 add_peds_state <= IDLE;
307 When WAIT_FIFO_READ_LAG => 308 pedcalc_dual_fifo_rd_ena <= (others=>'0');
311 add_peds_state <= WAIT_FIFO_READ_LAG;
314 add_peds_state <= ADD_SAMPLE_AND_WRITE_FIFOS;
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;
322 When PRIME_FIFOS_WITH_ZEROS => 323 pedcalc_dual_fifo_wr_ena <= "11111";
324 pedcalc_dual_fifo_din <= (others=>'0');
327 add_peds_state <= IDLE;
330 add_peds_state <= PRIME_FIFOS_WITH_ZEROS;
334 add_peds_state <= IDLE;