diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_remote.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_remote.vhd index 1a515832488603df758a204255b8f4ff5f571c1d..b969c5050b2e374b1a0d2fdff662bb06f57ad304 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_remote.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_beamformer_remote.vhd @@ -41,10 +41,10 @@ entity sdp_beamformer_remote is g_nof_aligners_max : natural := c_sdp_N_pn_max ); port ( - dp_clk : in std_logic; - dp_rst : in std_logic; + dp_clk : in std_logic; + dp_rst : in std_logic; - rn_index : in natural range 0 to c_sdp_N_pn_max - 1 := 0; + rn_index : in natural range 0 to c_sdp_N_pn_max - 1 := 0; local_bf_sosi : in t_dp_sosi; from_ri_sosi : in t_dp_sosi; @@ -68,9 +68,13 @@ end sdp_beamformer_remote; architecture str of sdp_beamformer_remote is constant c_data_w : natural := c_nof_complex * c_sdp_W_beamlet_sum; constant c_block_size : natural := c_sdp_S_sub_bf * c_sdp_N_pol_bf; - constant c_fifo_size : natural := 2**ceil_log2((c_block_size * 9) / 16); -- 9/16 = 36/64, 1 block of 64 bit words rounded to the next power of 2 = 1024. + constant c_fifo_size : natural := 2**ceil_log2((c_block_size * 9) / 16); -- 9/16 = 36/64, 1 block of + -- 64 bit words rounded to the next power of 2 = 1024. - signal dispatch_sosi_arr : t_dp_sosi_arr(c_sdp_P_sum - 1 downto 0) := (others => c_dp_sosi_rst); -- 1 for local, 1 for remote. + signal chain_node_index : natural range 0 to c_sdp_N_pn_max - 1 := 0; + + -- c_sdp_P_sum = 2 streams, 1 for local, 1 for remote + signal dispatch_sosi_arr : t_dp_sosi_arr(c_sdp_P_sum - 1 downto 0) := (others => c_dp_sosi_rst); signal dp_fifo_sosi : t_dp_sosi := c_dp_sosi_rst; signal dp_fifo_siso : t_dp_siso := c_dp_siso_rdy; signal beamlets_data_sosi_arr : t_dp_sosi_arr(c_sdp_P_sum - 1 downto 0) := (others => c_dp_sosi_rst); @@ -82,8 +86,10 @@ begin p_wire_local_bf_sosi : process(local_bf_sosi) begin dispatch_sosi_arr(0) <= local_bf_sosi; - dispatch_sosi_arr(0).data(c_sdp_W_beamlet_sum - 1 downto 0) <= local_bf_sosi.re(c_sdp_W_beamlet_sum - 1 downto 0); - dispatch_sosi_arr(0).data(c_data_w - 1 downto c_sdp_W_beamlet_sum) <= local_bf_sosi.im(c_sdp_W_beamlet_sum - 1 downto 0); + dispatch_sosi_arr(0).data(c_sdp_W_beamlet_sum - 1 downto 0) <= + local_bf_sosi.re(c_sdp_W_beamlet_sum - 1 downto 0); + dispatch_sosi_arr(0).data(c_data_w - 1 downto c_sdp_W_beamlet_sum) <= + local_bf_sosi.im(c_sdp_W_beamlet_sum - 1 downto 0); end process; --------------------------------------------------------------- @@ -129,20 +135,30 @@ begin --------------------------------------------------------------- -- dp_bsn_aligner_v2 --------------------------------------------------------------- + + -- The SDP beamformer starts at ring node 0 and outputs at the last ring + -- node, therefore the chain_node_index = the rn_index. The chain_node_index + -- does not wrap, because it starts at ring node 0. Therefore a design with + -- an SDP beamformer that is defined for g_nof_aligners_max = c_sdp_N_pn_max + -- = 16 will also work in a ring with less nodes. + chain_node_index <= rn_index; + u_mmp_dp_bsn_align_v2 : entity dp_lib.mmp_dp_bsn_align_v2 generic map( -- for dp_bsn_align_v2 - g_nof_streams => c_sdp_P_sum, - g_bsn_latency_max => 2, -- max 2 blocks latency - g_nof_aligners_max => g_nof_aligners_max, - g_block_size => c_block_size, - g_data_w => c_data_w, - g_use_mm_output => false, - g_rd_latency => 1, + g_nof_streams => c_sdp_P_sum, + g_bsn_latency_max => 2, -- max 2 blocks latency + g_use_aligner_at_first_node => true, + g_nof_aligners_max => g_nof_aligners_max, + g_block_size => c_block_size, + g_data_w => c_data_w, + g_use_mm_output => false, + g_rd_latency => 1, -- for mms_dp_bsn_monitor_v2 - g_nof_clk_per_sync => c_sdp_N_clk_sync_timeout, -- Using c_sdp_N_clk_sync_timeout as g_nof_clk_per_sync is used for BSN monitor timeout. - g_nof_input_bsn_monitors => c_sdp_P_sum, - g_use_bsn_output_monitor => true + g_nof_clk_per_sync => c_sdp_N_clk_sync_timeout, -- Using c_sdp_N_clk_sync_timeout as g_nof_clk_per_sync + -- is used for BSN monitor timeout. + g_nof_input_bsn_monitors => c_sdp_P_sum, + g_use_bsn_output_monitor => true ) port map ( -- Memory-mapped clock domain @@ -162,7 +178,7 @@ begin dp_rst => dp_rst, dp_clk => dp_clk, - node_index => rn_index, + chain_node_index => chain_node_index, -- Streaming input in_sosi_arr => dispatch_sosi_arr,