diff --git a/applications/lofar2/libraries/sdp/hdllib.cfg b/applications/lofar2/libraries/sdp/hdllib.cfg index 8369aee4be263ba8176c1e9f5fd799569f5c09ad..155e1d076d43f449f2d139068ec3cfc551e73e9b 100644 --- a/applications/lofar2/libraries/sdp/hdllib.cfg +++ b/applications/lofar2/libraries/sdp/hdllib.cfg @@ -22,7 +22,6 @@ synth_files = src/vhdl/sdp_beamformer_output.vhd src/vhdl/sdp_statistics_offload.vhd src/vhdl/sdp_crosslets_subband_select.vhd - src/vhdl/sdp_crosslets_remote.vhd src/vhdl/sdp_crosslets_remote_v2.vhd src/vhdl/node_sdp_adc_input_and_timing.vhd src/vhdl/node_sdp_filterbank.vhd diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_crosslets_remote.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_crosslets_remote.vhd deleted file mode 100644 index 97c1941ff2278c6f0218008e9a96d170e5b0e439..0000000000000000000000000000000000000000 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_crosslets_remote.vhd +++ /dev/null @@ -1,267 +0,0 @@ -------------------------------------------------------------------------------- --- --- Copyright 2021 --- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> --- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. --- -------------------------------------------------------------------------------- - -------------------------------------------------------------------------------- --- --- Author: R. van der Walle, E. Kooistra --- Purpose: --- . Implements the functionality for remote crosslets IO and aligning the --- local and remote crosslets in the node_sdp_correlator of the LOFAR2 --- SDPFW design. --- Description: -------------------------------------------------------------------------------- - -library IEEE, common_lib, dp_lib, reorder_lib, st_lib, mm_lib, ring_lib; -use IEEE.std_logic_1164.all; -use common_lib.common_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 ring_lib.ring_pkg.all; -use work.sdp_pkg.all; - -entity sdp_crosslets_remote is - generic ( - g_P_sq : natural := c_sdp_P_sq - ); - port ( - dp_clk : in std_logic; - dp_rst : in std_logic; - - xsel_sosi : in t_dp_sosi; - from_ri_sosi : in t_dp_sosi := c_dp_sosi_rst; - to_ri_sosi : out t_dp_sosi; - - crosslets_sosi : out t_dp_sosi; - crosslets_copi : in t_mem_copi := c_mem_copi_rst; - crosslets_cipo_arr : out t_mem_cipo_arr(g_P_sq - 1 downto 0); - - mm_rst : in std_logic; - mm_clk : in std_logic; - - reg_bsn_align_copi : in t_mem_copi := c_mem_copi_rst; - reg_bsn_align_cipo : out t_mem_cipo; - reg_bsn_monitor_v2_bsn_align_input_copi : in t_mem_copi := c_mem_copi_rst; - reg_bsn_monitor_v2_bsn_align_input_cipo : out t_mem_cipo; - reg_bsn_monitor_v2_bsn_align_output_copi : in t_mem_copi := c_mem_copi_rst; - reg_bsn_monitor_v2_bsn_align_output_cipo : out t_mem_cipo - ); -end sdp_crosslets_remote; - -architecture str of sdp_crosslets_remote is - constant c_block_size : natural := c_sdp_N_crosslets_max * c_sdp_S_pn; - constant c_block_size_longwords : natural := ceil_div(c_block_size, 2); -- 32b -> 64b - constant c_data_w : natural := c_sdp_W_crosslet * c_nof_complex; - -- The channel field carries the index of time multiplexed crosslet packets - constant c_use_channel : boolean := true; - constant c_channel_w : natural := ceil_log2(g_P_sq); - -- With 32b data repacked in 64b one empty bit is enough. For crosslets the number - -- of 32b words is c_block_size is even, so empty will be 0 always. However do - -- support odd sizes, to be save. - constant c_use_empty : boolean := true; - constant c_empty_w : natural := 1; - -- The from_ri_sosi only carries correct packets, so error field is not used. - constant c_use_error : boolean := false; - - -- The size for 1 block is probably already enough as the number of blocks received - -- on the remote input of the mux probably have enough gap time in between. Just - -- to be sure to not run into issues in the future, the fifo size is increased to - -- buffer the maximum nof blocks per block period. - constant c_mux_fifo_size : natural := 2**ceil_log2(g_P_sq * c_block_size_longwords); - -- c_fifo_fill_size should be at least 2 * c_block_size_longwords as dp_repack_data - -- repacks from 64bit to 32bit. Chosing 3x to have some room. - constant c_fifo_fill_size : natural := 2**ceil_log2(3 * c_block_size_longwords); - - signal xsel_data_sosi : t_dp_sosi := c_dp_sosi_rst; - signal local_sosi : t_dp_sosi := c_dp_sosi_rst; - - signal ring_mux_sosi : t_dp_sosi := c_dp_sosi_rst; - signal ring_mux_siso : t_dp_siso := c_dp_siso_rdy; - signal dp_fifo_fill_sosi : t_dp_sosi := c_dp_sosi_rst; - signal dp_fifo_fill_siso : t_dp_siso := c_dp_siso_rdy; - signal rx_sosi : t_dp_sosi := c_dp_sosi_rst; - signal dispatch_invert_sosi_arr : t_dp_sosi_arr(0 to g_P_sq - 1) := (others => c_dp_sosi_rst); - signal dispatch_sosi_arr : t_dp_sosi_arr(g_P_sq - 1 downto 0) := (others => c_dp_sosi_rst); -begin - --------------------------------------------------------------- - -- Repack 32b to 64b - --------------------------------------------------------------- - -- repacking xsel re/im to data field. - p_wire_xsel_sosi : process(xsel_sosi) - begin - xsel_data_sosi <= xsel_sosi; - xsel_data_sosi.data( c_sdp_W_crosslet - 1 downto 0) <= xsel_sosi.re(c_sdp_W_crosslet - 1 downto 0); - xsel_data_sosi.data(c_nof_complex * c_sdp_W_crosslet - 1 downto c_sdp_W_crosslet) <= xsel_sosi.im(c_sdp_W_crosslet - 1 downto 0); - end process; - - u_dp_repack_data_local : entity dp_lib.dp_repack_data - generic map ( - g_in_dat_w => c_data_w, - g_in_nof_words => c_longword_w / c_data_w, - g_out_dat_w => c_longword_w, - g_out_nof_words => 1, - g_pipeline_ready => true -- Needed for src_in.ready to snk_out.ready. - ) - port map ( - rst => dp_rst, - clk => dp_clk, - - snk_in => xsel_data_sosi, - src_out => local_sosi - ); - - --------------------------------------------------------------- - -- ring_mux - --------------------------------------------------------------- - u_ring_mux : entity ring_lib.ring_mux - generic map ( - g_bsn_w => c_dp_stream_bsn_w, - g_data_w => c_longword_w, - g_channel_w => c_word_w, - g_use_error => c_use_error, - g_fifo_size => array_init(c_mux_fifo_size, 2) - ) - port map ( - dp_clk => dp_clk, - dp_rst => dp_rst, - - remote_sosi => from_ri_sosi, - local_sosi => local_sosi, - mux_sosi => ring_mux_sosi, - mux_siso => ring_mux_siso - ); - - to_ri_sosi <= ring_mux_sosi; - - -- fill fifo to remove valid gaps that occur due to repack 32b/64b in local_sosi, - -- the from_ri_sosi has no valid gaps during block. - u_dp_fifo_fill_eop : entity dp_lib.dp_fifo_fill_eop - generic map ( - g_data_w => c_longword_w, - g_bsn_w => c_dp_stream_bsn_w, - g_empty_w => c_empty_w, - g_channel_w => c_channel_w, - g_use_bsn => true, - g_use_empty => c_use_empty, - g_use_channel => c_use_channel, - g_use_error => c_use_error, - g_use_sync => true, - g_fifo_fill => c_block_size_longwords, - g_fifo_size => c_fifo_fill_size - ) - port map ( - wr_rst => dp_rst, - wr_clk => dp_clk, - rd_rst => dp_rst, - rd_clk => dp_clk, - - snk_out => ring_mux_siso, - snk_in => ring_mux_sosi, - - src_in => dp_fifo_fill_siso, - src_out => dp_fifo_fill_sosi - ); - - --------------------------------------------------------------- - -- Repack 64b to 32b - --------------------------------------------------------------- - u_dp_repack_data_rx : entity dp_lib.dp_repack_data - generic map ( - g_in_dat_w => c_longword_w, - g_in_nof_words => 1, - g_out_dat_w => c_data_w, - g_out_nof_words => c_longword_w / c_data_w, - g_pipeline_ready => true -- Needed for src_in.ready to snk_out.ready. - ) - port map ( - rst => dp_rst, - clk => dp_clk, - - snk_in => dp_fifo_fill_sosi, - snk_out => dp_fifo_fill_siso, - src_out => rx_sosi - ); - - --------------------------------------------------------------- - -- dp_demux - --------------------------------------------------------------- - u_dp_demux : entity dp_lib.dp_demux - generic map ( - g_mode => 0, - g_nof_output => g_P_sq, - g_remove_channel_lo => false, - g_sel_ctrl_invert => true -- TRUE when indexed (g_nof_input-1 DOWNTO 0) - ) - port map ( - rst => dp_rst, - clk => dp_clk, - - snk_in => rx_sosi, - src_out_arr => dispatch_invert_sosi_arr - ); - - dispatch_sosi_arr <= func_dp_stream_arr_reverse_range(dispatch_invert_sosi_arr); - - --------------------------------------------------------------- - -- dp_bsn_aligner_v2 - --------------------------------------------------------------- - u_mmp_dp_bsn_align_v2 : entity dp_lib.mmp_dp_bsn_align_v2 - generic map( - -- for dp_bsn_align_v2 - g_nof_streams => g_P_sq, - g_bsn_latency_max => 2, - g_nof_aligners_max => 1, -- 1 for Access scheme 3. - g_block_size => c_block_size, - g_data_w => c_data_w, - g_use_mm_output => true, - g_rd_latency => 1, -- Required for st_xst - -- for mms_dp_bsn_monitor_v2 - -- Using c_sdp_N_clk_sync_timeout_xsub as g_nof_clk_per_sync is used for BSN monitor timeout. - g_nof_clk_per_sync => c_sdp_N_clk_sync_timeout_xsub, - g_nof_input_bsn_monitors => g_P_sq, - g_use_bsn_output_monitor => true - ) - port map ( - -- Memory-mapped clock domain - mm_rst => mm_rst, - mm_clk => mm_clk, - - reg_bsn_align_copi => reg_bsn_align_copi, - reg_bsn_align_cipo => reg_bsn_align_cipo, - - reg_input_monitor_copi => reg_bsn_monitor_v2_bsn_align_input_copi, - reg_input_monitor_cipo => reg_bsn_monitor_v2_bsn_align_input_cipo, - - reg_output_monitor_copi => reg_bsn_monitor_v2_bsn_align_output_copi, - reg_output_monitor_cipo => reg_bsn_monitor_v2_bsn_align_output_cipo, - - -- Streaming clock domain - dp_rst => dp_rst, - dp_clk => dp_clk, - - -- Streaming input - in_sosi_arr => dispatch_sosi_arr, - - -- Output via local MM interface in dp_clk domain, when g_use_mm_output = TRUE. - mm_sosi => crosslets_sosi, - mm_copi => crosslets_copi, - mm_cipo_arr => crosslets_cipo_arr - ); -end str;