diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd index 29edc88476ce5bea7dc600340e61b31cd9e9a2f1..0545074b81b422b77f4bf4ddbe6d3020b9344ef3 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_output.vhd @@ -30,7 +30,7 @@ -- ------------------------------------------------------------------------------- -library IEEE, common_lib, dp_lib, tr_10GbE_lib; +library IEEE, common_lib, dp_lib, reorder_lib, tr_10GbE_lib; use IEEE.std_logic_1164.all; use IEEE.numeric_std.all; use common_lib.common_pkg.all; @@ -38,11 +38,13 @@ use common_lib.common_field_pkg.all; use common_lib.common_mem_pkg.all; use common_lib.common_network_layers_pkg.all; use dp_lib.dp_stream_pkg.all; +use reorder_lib.reorder_pkg.all; use work.sdp_pkg.all; entity sdp_beamformer_output is generic ( - g_beamset_id : natural := 0 + g_beamset_id : natural := 0; + g_use_transpose : boolean := false ); port ( dp_clk : in std_logic; @@ -88,9 +90,29 @@ architecture str of sdp_beamformer_output is constant c_fifo_fill : natural := c_sdp_cep_payload_nof_longwords; -- 976 constant c_fifo_size : natural := true_log_pow2(c_sdp_cep_payload_nof_longwords) * c_sdp_N_beamsets; -- 2048 + -- Reorder c_nof_ch = c_nof_ch_sel = c_nof_ch_in + constant c_nof_ch : natural := c_sdp_S_sub_bf * c_sdp_cep_nof_blocks_per_packet; + + -- Dynamic reorder block size control input + -- . The input packet has nof_ch = nof_data_per_block * nof_blocks_per_packet + -- of data per packet. + -- . The transposed output packet will have blocks with nof_blocks_per_packet + -- data per block and nof_data_per_block blocks per packet. + signal nof_ch : natural := c_nof_ch; + signal nof_data_per_block : natural := c_sdp_S_sub_bf; + signal nof_blocks_per_packet : natural := c_sdp_cep_nof_blocks_per_packet; + signal select_copi : t_mem_copi := c_mem_copi_rst; + signal select_cipo : t_mem_cipo := c_mem_cipo_rst; + signal r_identity : t_reorder_identity; + signal d_identity : t_reorder_identity; + signal r_transpose : t_reorder_transpose; + signal d_transpose : t_reorder_transpose; + signal snk_in_concat : t_dp_sosi; signal dp_repack_beamlet_src_out : t_dp_sosi; signal dp_packet_merge_src_out : t_dp_sosi; + signal dp_packet_reorder_src_out : t_dp_sosi; + signal reorder_busy : std_logic; signal dp_repack_longword_src_out : t_dp_sosi; signal dp_fifo_fill_eop_src_out : t_dp_sosi; signal dp_fifo_fill_eop_src_in : t_dp_siso; @@ -197,6 +219,92 @@ begin src_out => dp_packet_merge_src_out ); + ------------------------------------------------------------------------------- + -- reorder_col_select + -- . Reorder beamlet data from: + -- int8[t] [N_blocks_per_packet][S_sub_bf] [N_pol_bf][N_complex] + -- to: + -- int8[t] [S_sub_bf][N_blocks_per_packet] [N_pol_bf][N_complex] + -- + -- See tb_reorder_col_select_all.vhd for how to control col_select_copi/cipo. + ------------------------------------------------------------------------------- + u_reorder_col_select : entity reorder_lib.reorder_col_select + generic map ( + g_dsp_data_w => c_sdp_W_dual_pol_beamlet, -- = 32b + g_nof_ch_in => c_nof_ch, + g_nof_ch_sel => c_nof_ch, + g_use_complex => false + ) + port map ( + dp_rst => dp_rst, + dp_clk => dp_clk, + + reorder_busy => reorder_busy, + + -- Dynamic reorder block size control input + nof_ch_in => nof_ch, + nof_ch_sel => nof_ch, + + -- Captured reorder block size control used for output_sosi + output_nof_ch_in => open, + output_nof_ch_sel => open, + + -- Memory Mapped + col_select_mosi => select_copi, + col_select_miso => select_cipo, + + -- Streaming + input_sosi => dp_packet_merge_src_out, + output_sosi => dp_packet_reorder_src_out + ); + + -- Use synchronous reset in d signals + p_dp_clk_synchronous : process(dp_clk) + begin + if rising_edge(dp_clk) then + r_identity <= d_identity; + r_transpose <= d_transpose; + end if; + end process; + + -- Pass on beamlet data in original order or in transposed order + select_copi <= r_transpose.select_copi when g_use_transpose else r_identity.select_copi; + + p_reorder_identity : process(dp_rst, select_cipo, nof_ch, r_identity) + variable v : t_reorder_identity; + begin + if select_cipo.waitrequest = '0' then + -- Read from reorder_col_select page + v := func_reorder_identity(nof_ch, r_identity); + else + -- No read, new reorder_col_select page not available yet + v := c_reorder_identity_rst; + end if; + -- Synchronous reset + if dp_rst = '1' then + v := c_reorder_identity_rst; + end if; + d_identity <= v; + end process; + + p_reorder_transpose : process(dp_rst, select_cipo, + nof_data_per_block, nof_blocks_per_packet, r_transpose) + variable v : t_reorder_transpose; + begin + if select_cipo.waitrequest = '0' then + -- Read from reorder_col_select page + v := func_reorder_transpose(nof_data_per_block, nof_blocks_per_packet, r_transpose); + else + -- No read, new reorder_col_select page not available yet + v := c_reorder_transpose_rst; + end if; + -- Synchronous reset + if dp_rst = '1' then + v := c_reorder_transpose_rst; + end if; + d_transpose <= v; + end process; + ------------------------------------------------------------------------------- -- dp_repack_data -- . Repack 32b -> 64b, to get 64b longwords for network packet data @@ -213,7 +321,7 @@ begin clk => dp_clk, rst => dp_rst, - snk_in => dp_packet_merge_src_out, + snk_in => dp_packet_reorder_src_out, snk_out => OPEN, src_out => dp_repack_longword_src_out,