diff --git a/applications/arts/designs/arts_unb1_sc4/hdllib.cfg b/applications/arts/designs/arts_unb1_sc4/hdllib.cfg index aa8c6c5781fb7874c6807b3aa1cf4689262246a9..fdd07905db2b99d336c1c909598fa38e74054a8a 100644 --- a/applications/arts/designs/arts_unb1_sc4/hdllib.cfg +++ b/applications/arts/designs/arts_unb1_sc4/hdllib.cfg @@ -1,15 +1,14 @@ hdl_lib_name = arts_unb1_sc4 hdl_library_clause_name = arts_unb1_sc4_lib -hdl_lib_uses_synth = common dp mm diag bf tr_10GbE apertif unb1_board +hdl_lib_uses_synth = common dp mm diag bf tr_10GbE apertif unb1_board arts_unb1_sc4_bg hdl_lib_uses_sim = apertif_unb1_fn_bf_emu hdl_lib_technology = ip_stratixiv synth_files = ../../../apertif/designs/apertif_unb1_correlator/src/vhdl/node_apertif_unb1_correlator_mesh.vhd - src/vhdl/arts_unb1_sc4_mm_master.vhd src/vhdl/arts_unb1_sc4_input.vhd - src/vhdl/arts_unb1_sc4_output.vhd src/vhdl/arts_unb1_sc4_processing.vhd + src/vhdl/arts_unb1_sc4_mm_master.vhd src/vhdl/arts_unb1_sc4.vhd test_bench_files = diff --git a/applications/arts/designs/arts_unb1_sc4/src/vhdl/arts_unb1_sc4.vhd b/applications/arts/designs/arts_unb1_sc4/src/vhdl/arts_unb1_sc4.vhd index de5916d9c000f4962b64cbbe96504ee016bb922c..a3b5489114b49f33a12dc68e5bcc38fa802e1b59 100644 --- a/applications/arts/designs/arts_unb1_sc4/src/vhdl/arts_unb1_sc4.vhd +++ b/applications/arts/designs/arts_unb1_sc4/src/vhdl/arts_unb1_sc4.vhd @@ -44,6 +44,7 @@ LIBRARY unb1_board_lib; LIBRARY tr_10GbE_lib; LIBRARY apertif_lib; USE apertif_lib.apertif_udp_offload_pkg.ALL; +LIBRARY arts_unb1_sc4_bg_lib; ENTITY arts_unb1_sc4 IS GENERIC ( @@ -107,7 +108,7 @@ ARCHITECTURE str OF arts_unb1_sc4 IS -- CONSTANT c_nof_polarizations : NATURAL := 2; CONSTANT c_nof_telescopes : NATURAL := 12; CONSTANT c_nof_tabs : NATURAL := 1; --FIXME First 1, then upgrade to 12 TABs - CONSTANT c_nof_abs : NATURAL := c_nof_tabs+1; -- + 1 IAB + CONSTANT c_nof_iabs : NATURAL := c_nof_tabs+1; -- + 1 IAB -- CONSTANT c_channel_compl_dat_w : NATURAL := 8; -- CONSTANT c_channel_dat_w : NATURAL := 2*c_channel_compl_dat_w; -- CONSTANT c_nof_beamlets : NATURAL := 88; --88 beamlets per node, 704 in total @@ -115,14 +116,39 @@ ARCHITECTURE str OF arts_unb1_sc4 IS -- CONSTANT c_nof_timesamples_per_packet : NATURAL := 50; -- CONSTANT c_nof_apertif_bf_units : NATURAL := 4; -- 4 bf_units per Apertif FN - + ------------------------------------------------------------------------------- + -- Input + ------------------------------------------------------------------------------- + SIGNAL arts_unb1_sc4_input_src_out_arr : t_dp_sosi_arr(c_nof_telescopes-1 DOWNTO 0); ------------------------------------------------------------------------------- - -- Beam Former + -- Processing ------------------------------------------------------------------------------- SIGNAL arts_unb1_sc4_processing_snk_in_arr : t_dp_sosi_arr(c_nof_telescopes-1 DOWNTO 0); SIGNAL arts_unb1_sc4_processing_src_out_arr : t_dp_sosi_arr(c_nof_tabs-1 DOWNTO 0); + ------------------------------------------------------------------------------- + -- Output + ------------------------------------------------------------------------------- + CONSTANT c_nof_10GbE_tx_streams : NATURAL := 1; + + SIGNAL arts_unb1_sc4_output_snk_in_arr : t_dp_sosi_arr(c_nof_tabs-1 DOWNTO 0); + + SIGNAL arts_unb1_sc4_output_src_out : t_dp_sosi; + SIGNAL arts_unb1_sc4_output_src_in : t_dp_siso := c_dp_siso_rdy; + + SIGNAL reg_dp_xonoff_iquv_mosi : t_mem_mosi; + SIGNAL reg_dp_xonoff_iquv_miso : t_mem_miso; + + SIGNAL reg_dp_offload_tx_iquv_hdr_dat_mosi : t_mem_mosi; + SIGNAL reg_dp_offload_tx_iquv_hdr_dat_miso : t_mem_miso; + + SIGNAL reg_dp_xonoff_i_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL reg_dp_xonoff_i_miso : t_mem_miso := c_mem_miso_rst; + + SIGNAL reg_dp_offload_tx_i_hdr_dat_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL reg_dp_offload_tx_i_hdr_dat_miso : t_mem_miso := c_mem_miso_rst; + ------------------------------------------------------------------------------ -- ctrl_unb1_board ------------------------------------------------------------------------------- @@ -140,7 +166,7 @@ ARCHITECTURE str OF arts_unb1_sc4 IS SIGNAL sa_rst : STD_LOGIC; - SIGNAL this_chip_id : STD_LOGIC_VECTOR(c_unb1_board_nof_chip_w-1 DOWNTO 0); + SIGNAL chip_id : STD_LOGIC_VECTOR(c_unb1_board_nof_chip_w-1 DOWNTO 0); SIGNAL pout_wdi : STD_LOGIC; SIGNAL pio_system_info_mosi : t_mem_mosi; @@ -178,22 +204,50 @@ ARCHITECTURE str OF arts_unb1_sc4 IS BEGIN ----------------------------------------------------------------------------- - -- Input & reordering & stage + -- Input & reordering stage ----------------------------------------------------------------------------- u_arts_unb1_sc4_input: ENTITY work.arts_unb1_sc4_input GENERIC MAP ( g_sim => g_sim ) PORT MAP ( - dp_clk => dp_clk, - dp_rst => dp_rst, - mm_clk => mm_clk, mm_rst => mm_rst, + dp_clk => dp_clk, + dp_rst => dp_rst, + dp_pps => dp_pps, + + chip_id => chip_id, + + cal_rec_clk => cal_rec_clk, + + SB_CLK => SB_CLK, + FN_BN_0_TX => FN_BN_0_TX, + FN_BN_0_RX => FN_BN_0_RX, + FN_BN_1_TX => FN_BN_1_TX, + FN_BN_1_RX => FN_BN_1_RX, + FN_BN_2_TX => FN_BN_2_TX, + FN_BN_2_RX => FN_BN_2_RX, + FN_BN_3_TX => FN_BN_3_TX, + FN_BN_3_RX => FN_BN_3_RX, + + SA_CLK => SA_CLK, + SI_FN_0_TX => SI_FN_0_TX, + SI_FN_0_RX => SI_FN_0_RX, + SI_FN_1_TX => SI_FN_1_TX, + SI_FN_1_RX => SI_FN_1_RX, + SI_FN_2_TX => SI_FN_2_TX, + SI_FN_2_RX => SI_FN_2_RX, + SI_FN_0_CNTRL => SI_FN_0_CNTRL, + SI_FN_1_CNTRL => SI_FN_1_CNTRL, + SI_FN_2_CNTRL => SI_FN_2_CNTRL, + SI_FN_3_CNTRL => SI_FN_3_CNTRL, + SI_FN_RSTN => SI_FN_RSTN, + src_out_arr => arts_unb1_sc4_input_src_out_arr ); - + ----------------------------------------------------------------------------- -- Processing stage ----------------------------------------------------------------------------- @@ -217,23 +271,46 @@ BEGIN ----------------------------------------------------------------------------- -- Output reordering & packetizing stage ----------------------------------------------------------------------------- - u_arts_unb1_sc4_output: ENTITY work.arts_unb1_sc4_output + u_arts_unb1_sc4_output: ENTITY arts_unb1_sc4_bg_lib.arts_unb1_sc4_output GENERIC MAP ( - g_sim => g_sim + g_sim => g_sim, + g_override_payload_data => FALSE, + g_nof_tabs => 12, + g_nof_compound_beams => 12, + g_nof_subbands_per_compound_beam => 24, + g_nof_stokes => 4, + g_nof_channels => 8, + g_nof_timesamples => 25000, + g_nof_bytes_per_iquv_packet => 8500, + g_nof_bytes_per_i_packet => 6250 ) PORT MAP ( - dp_clk => dp_clk, - dp_rst => dp_rst, + dp_clk => dp_clk, + dp_rst => dp_rst, - mm_clk => mm_clk, - mm_rst => mm_rst, + mm_clk => mm_clk, + mm_rst => mm_rst, - snk_in_arr => arts_unb1_sc4_output_snk_in_arr - ); - + reg_dp_offload_tx_iquv_hdr_dat_mosi => reg_dp_offload_tx_iquv_hdr_dat_mosi, + reg_dp_offload_tx_iquv_hdr_dat_miso => reg_dp_offload_tx_iquv_hdr_dat_miso, + + reg_dp_xonoff_iquv_mosi => reg_dp_xonoff_iquv_mosi, + reg_dp_xonoff_iquv_miso => reg_dp_xonoff_iquv_miso, + reg_dp_offload_tx_i_hdr_dat_mosi => reg_dp_offload_tx_i_hdr_dat_mosi, + reg_dp_offload_tx_i_hdr_dat_miso => reg_dp_offload_tx_i_hdr_dat_miso, + reg_dp_xonoff_i_mosi => reg_dp_xonoff_i_mosi, + reg_dp_xonoff_i_miso => reg_dp_xonoff_i_miso, + snk_in_arr => arts_unb1_sc4_output_snk_in_arr, + + src_out => arts_unb1_sc4_output_src_out, + src_in => arts_unb1_sc4_output_src_in, + + ID => ID + ); + ------------------------------------------------------------------------------- -- ctrl_unb1_board ------------------------------------------------------------------------------- @@ -269,7 +346,7 @@ BEGIN dp_pps => dp_pps, cal_rec_clk => cal_rec_clk, - this_chip_id => this_chip_id, + this_chip_id => chip_id, -- Toggle WDI pout_wdi => pout_wdi, diff --git a/applications/arts/designs/arts_unb1_sc4/src/vhdl/arts_unb1_sc4_input.vhd b/applications/arts/designs/arts_unb1_sc4/src/vhdl/arts_unb1_sc4_input.vhd index 6a9d33aef7aad8e3e265fc61bac0dd546a6becf4..404e23cc14d0d41ad361b18cd471f5ebbd0dbf45 100644 --- a/applications/arts/designs/arts_unb1_sc4/src/vhdl/arts_unb1_sc4_input.vhd +++ b/applications/arts/designs/arts_unb1_sc4/src/vhdl/arts_unb1_sc4_input.vhd @@ -1,6 +1,6 @@ ------------------------------------------------------------------------------- -- --- Copyright (C) 2015 +-- Copyright (C) 2017 -- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> -- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands -- @@ -20,203 +20,268 @@ ------------------------------------------------------------------------------- -- Purpose: --- . Wrapper containing dp_offload_tx and design-specific header fields +-- . Input stage from 10GbE receivers to mesh output -- Description: --- . +-- . TODO: This input stage has been taken from SC1. +-- . We need to take into account the transposed input beamlets! +-- . Output should be interleaved -LIBRARY IEEE, common_lib, work, technology_lib, mm_lib, unb1_board_lib, dp_lib, tech_tse_lib; +LIBRARY IEEE, common_lib, work, technology_lib, mm_lib, unb1_board_lib, dp_lib, tech_tse_lib, tr_10GbE_lib, apertif_lib; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.NUMERIC_STD.ALL; USE common_lib.common_pkg.ALL; USE common_lib.common_mem_pkg.ALL; USE dp_lib.dp_stream_pkg.ALL; -USE common_lib.common_field_pkg.ALL; USE unb1_board_lib.unb1_board_pkg.ALL; USE tech_tse_lib.tech_tse_pkg.ALL; USE technology_lib.technology_select_pkg.ALL; +USE common_lib.common_interface_layers_pkg.ALL; +USE apertif_lib.apertif_udp_offload_pkg.ALL; +USE common_lib.common_field_pkg.ALL; -ENTITY arts_unb1_sc4_output IS +ENTITY arts_unb1_sc4_input IS GENERIC ( - g_technology : NATURAL := c_tech_select_default; - g_nof_streams : POSITIVE := 1; - g_nof_blocks : NATURAL := 50; - g_nof_channels : NATURAL := 24; g_sim : BOOLEAN ); PORT ( - mm_rst : IN STD_LOGIC; - mm_clk : IN STD_LOGIC; + mm_rst : IN STD_LOGIC; + mm_clk : IN STD_LOGIC; - dp_rst : IN STD_LOGIC; - dp_clk : IN STD_LOGIC; - - reg_dp_offload_tx_hdr_dat_mosi : IN t_mem_mosi := c_mem_mosi_rst; - reg_dp_offload_tx_hdr_dat_miso : OUT t_mem_miso := c_mem_miso_rst; - - reg_dp_xonoff_output_mosi : IN t_mem_mosi; - reg_dp_xonoff_output_miso : OUT t_mem_miso; - - snk_in : IN t_dp_sosi; - snk_out : OUT t_dp_siso; - - src_out_arr : OUT t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); - src_in_arr : IN t_dp_siso_arr(g_nof_streams-1 DOWNTO 0); - - ID : IN STD_LOGIC_VECTOR(c_unb1_board_aux.id_w-1 DOWNTO 0) + dp_rst : IN STD_LOGIC; + dp_clk : IN STD_LOGIC; + dp_pps : IN STD_LOGIC; + + chip_id : STD_LOGIC_VECTOR(c_unb1_board_nof_chip_w-1 DOWNTO 0); + + cal_rec_clk : STD_LOGIC; + + -- Mesh Serial I/O + SB_CLK : IN STD_LOGIC; -- SerDes clock FN-BN (tr_mesh) + FN_BN_0_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0); + FN_BN_0_RX : IN STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0); + FN_BN_1_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0); + FN_BN_1_RX : IN STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0); + FN_BN_2_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0); + FN_BN_2_RX : IN STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0); + FN_BN_3_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0); + FN_BN_3_RX : IN STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0); + + -- Serial I/O: 10GbE receivers + SA_CLK : IN STD_LOGIC; -- SerDes Clock BN-BI / SI_FN + SI_FN_0_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0); + SI_FN_0_RX : IN STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0); + SI_FN_1_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0); + SI_FN_1_RX : IN STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0); + SI_FN_2_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0); + SI_FN_2_RX : IN STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0); + SI_FN_0_CNTRL : INOUT STD_LOGIC_VECTOR(c_unb1_board_ci.tr.cntrl_w-1 DOWNTO 0); + SI_FN_1_CNTRL : INOUT STD_LOGIC_VECTOR(c_unb1_board_ci.tr.cntrl_w-1 DOWNTO 0); + SI_FN_2_CNTRL : INOUT STD_LOGIC_VECTOR(c_unb1_board_ci.tr.cntrl_w-1 DOWNTO 0); + SI_FN_3_CNTRL : INOUT STD_LOGIC_VECTOR(c_unb1_board_ci.tr.cntrl_w-1 DOWNTO 0); + SI_FN_RSTN : OUT STD_LOGIC := '1'; + + src_out_arr : OUT t_dp_sosi_arr(12-1 DOWNTO 0) ); -END arts_unb1_sc4_output; - - -ARCHITECTURE wrap OF arts_unb1_sc4_output IS - - -- Word align + Eth + IP + UDP + ID + Flags - CONSTANT c_nof_hdr_fields : NATURAL := 1 + 3 + 12 + 4 + 6 + 8 ; -- 34 fields - -- Numer of bytes: 2 + <-----42-----> + 16 + 8*24/8 -- 2 + 42 + 40 = 84 bytes = 672 bits - - CONSTANT c_hdr_field_arr : t_common_field_arr(c_nof_hdr_fields-1 DOWNTO 0) := ( ( field_name_pad("word_align" ), " ", 16, field_default(0) ), - ( field_name_pad("eth_dst_mac" ), " ", 48, field_default(x"1418774428B8") ), - ( field_name_pad("eth_src_mac" ), " ", 48, field_default(0) ), - ( field_name_pad("eth_type" ), " ", 16, field_default(x"800") ), - ( field_name_pad("ip_version" ), " ", 4, field_default(4) ), - ( field_name_pad("ip_header_length" ), " ", 4, field_default(5) ), - ( field_name_pad("ip_services" ), " ", 8, field_default(0) ), - ( field_name_pad("ip_total_length" ), " ", 16, field_default(4868) ), - ( field_name_pad("ip_identification" ), " ", 16, field_default(0) ), - ( field_name_pad("ip_flags" ), " ", 3, field_default(2) ), - ( field_name_pad("ip_fragment_offset" ), " ", 13, field_default(0) ), - ( field_name_pad("ip_time_to_live" ), " ", 8, field_default(127) ), - ( field_name_pad("ip_protocol" ), " ", 8, field_default(17) ), - ( field_name_pad("ip_header_checksum" ), " ", 16, field_default(0) ), - ( field_name_pad("ip_src_addr" ), " ", 32, field_default(0) ), - ( field_name_pad("ip_dst_addr" ), " ", 32, field_default(x"0A63C82A") ), - ( field_name_pad("udp_src_port" ), " ", 16, field_default(4000) ), - ( field_name_pad("udp_dst_port" ), " ", 16, field_default(4000) ), - ( field_name_pad("udp_total_length" ), " ", 16, field_default(4848) ), - ( field_name_pad("udp_checksum" ), " ", 16, field_default(0) ), - ( field_name_pad("id_marker_byte" ), " ", 8, field_default(65) ), - ( field_name_pad("id_format_version" ), " ", 8, field_default(1) ), - ( field_name_pad("id_source_id" ), " ", 16, field_default(0) ), - ( field_name_pad("id_n_channels" ), " ", 16, field_default(0) ), - ( field_name_pad("id_n_blocks" ), " ", 16, field_default(0) ), - ( field_name_pad("id_timestamp" ), " ", 64, field_default(0) ), - ( field_name_pad("flags_crc_error" ), " ", 24, field_default(0) ), - ( field_name_pad("flags_no_input_present" ), " ", 24, field_default(0) ), - ( field_name_pad("flags_uploading_weights" ), " ", 24, field_default(0) ), - ( field_name_pad("flags_noise_source_enabled" ), " ", 24, field_default(0) ), - ( field_name_pad("flags_telescope_pointing_off" ), " ", 24, field_default(0) ), - ( field_name_pad("flags_antenna_broken" ), " ", 24, field_default(0) ), - ( field_name_pad("flags_reserved_0" ), " ", 24, field_default(0) ), - ( field_name_pad("flags_reserved_1" ), " ", 24, field_default(0) ) ); - - CONSTANT c_hdr_field_sel : STD_LOGIC_VECTOR(c_nof_hdr_fields-1 DOWNTO 0) := "1101" & -- Eth header fields: eth_src_mac from data path (others use MM default value). - "111111111101" & -- IP header fields: ip_src_addr from data path (others use MM default value). - "1111" & -- UDP header fields - "110000" & -- ID header fields: MM controlled: marker byte, format version. From data path: source ID, n_channels, n_blocks and timestamp. - "00111111"; -- Flag fields: crc_error and no_input_present from data path, others via MM. - - CONSTANT c_nof_hdr_words : NATURAL := field_slv_len(c_hdr_field_arr)/c_tech_tse_data_w; - CONSTANT c_bsn_w : NATURAL := 64; - CONSTANT c_nof_words_per_block : NATURAL := 24; - CONSTANT c_nof_blocks_per_packet : NATURAL := 50; - CONSTANT c_fifo_size : NATURAL := 4096; - - SIGNAL mms_dp_xonoff_snk_in_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); - SIGNAL mms_dp_xonoff_snk_out_arr : t_dp_siso_arr(g_nof_streams-1 DOWNTO 0); - - SIGNAL dp_fifo_sc_snk_in_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); - SIGNAL dp_fifo_sc_snk_out_arr : t_dp_siso_arr(g_nof_streams-1 DOWNTO 0); - - SIGNAL dp_fifo_sc_src_out_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); - SIGNAL dp_fifo_sc_src_in_arr : t_dp_siso_arr(g_nof_streams-1 DOWNTO 0); - - SIGNAL dp_offload_tx_src_out_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); - SIGNAL dp_offload_tx_src_in_arr : t_dp_siso_arr(g_nof_streams-1 DOWNTO 0); - - SIGNAL hdr_fields_in_arr : t_slv_1024_arr(g_nof_streams-1 DOWNTO 0); - SIGNAL id_backplane : STD_LOGIC_VECTOR(c_byte_w-1 DOWNTO 0); - SIGNAL id_chip : STD_LOGIC_VECTOR(c_byte_w-1 DOWNTO 0); +END arts_unb1_sc4_input; + + +ARCHITECTURE str OF arts_unb1_sc4_input IS + + ------------------------------------------------------------------------------- + -- ARTS SC4 + ------------------------------------------------------------------------------- + CONSTANT c_nof_polarizations : NATURAL := 2; + CONSTANT c_nof_telescopes : NATURAL := 12; + CONSTANT c_nof_apertif_bf_units : NATURAL := 4; -- 4 bf_units per Apertif FN + CONSTANT c_channel_compl_dat_w : NATURAL := 8; + CONSTANT c_channel_dat_w : NATURAL := 2*c_channel_compl_dat_w; + CONSTANT c_nof_beamlets : NATURAL := 88; --88 beamlets per node, 704 in total + + ------------------------------------------------------------------------------- + -- 10GbE input stage + ------------------------------------------------------------------------------- + CONSTANT c_nof_10GbE_streams : NATURAL := 3; -- The number of 10G input streams + + SIGNAL sa_rst : STD_LOGIC; + SIGNAL xaui_tx_arr : t_xaui_arr(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL xaui_rx_arr : t_xaui_arr(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL unb_xaui_tx_arr : t_unb1_board_xaui_sl_2arr(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL unb_xaui_rx_arr : t_unb1_board_xaui_sl_2arr(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL mdio_mdc_arr : STD_LOGIC_VECTOR(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL mdio_mdat_in_arr : STD_LOGIC_VECTOR(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL mdio_mdat_oen_arr : STD_LOGIC_VECTOR(c_nof_10GbE_streams-1 DOWNTO 0); + + SIGNAL reg_tr_10gbe_mosi : t_mem_mosi; + SIGNAL reg_tr_10gbe_miso : t_mem_miso; + SIGNAL reg_tr_xaui_mosi : t_mem_mosi; + SIGNAL reg_tr_xaui_miso : t_mem_miso; + SIGNAL reg_mdio_0_mosi : t_mem_mosi; + SIGNAL reg_mdio_0_miso : t_mem_miso; + SIGNAL reg_mdio_1_mosi : t_mem_mosi; + SIGNAL reg_mdio_1_miso : t_mem_miso; + SIGNAL reg_mdio_2_mosi : t_mem_mosi; + SIGNAL reg_mdio_2_miso : t_mem_miso; + + SIGNAL reg_mdio_mosi_arr : t_mem_mosi_arr(c_unb1_board_nof_mdio-1 DOWNTO 0); + SIGNAL reg_mdio_miso_arr : t_mem_miso_arr(c_unb1_board_nof_mdio-1 DOWNTO 0); + + -- DP offload RX + SIGNAL dp_offload_rx_snk_in_arr : t_dp_sosi_arr(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL dp_offload_rx_snk_out_arr : t_dp_siso_arr(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL dp_offload_rx_src_out_arr : t_dp_sosi_arr(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL dp_offload_rx_src_in_arr : t_dp_siso_arr(c_nof_10GbE_streams-1 DOWNTO 0) := (OTHERS=> c_dp_siso_rdy); + SIGNAL dp_offload_rx_restored_src_out_arr : t_dp_sosi_arr(c_nof_10GbE_streams-1 DOWNTO 0) := (OTHERS=> c_dp_sosi_rst); + SIGNAL hdr_fields_out_arr : t_slv_1024_arr(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL reg_dp_offload_rx_hdr_dat_mosi : t_mem_mosi; + SIGNAL reg_dp_offload_rx_hdr_dat_miso : t_mem_miso; + + -- BSN monitors + SIGNAL dp_bsn_monitor_input_in_sosi_arr : t_dp_sosi_arr(c_nof_10GbE_streams*2-1 DOWNTO 0); + SIGNAL dp_bsn_monitor_input_in_siso_arr : t_dp_siso_arr(c_nof_10GbE_streams*2-1 DOWNTO 0); + + SIGNAL reg_dp_bsn_monitor_input_mosi : t_mem_mosi; + SIGNAL reg_dp_bsn_monitor_input_miso : t_mem_miso; + SIGNAL reg_dp_bsn_monitor_mesh_mosi : t_mem_mosi; + SIGNAL reg_dp_bsn_monitor_mesh_miso : t_mem_miso; + + -- BSN Aligner + FIFOs + CONSTANT c_block_period : NATURAL := 186; -- FIXME Based on....? + CONSTANT c_block_size : NATURAL := 176; + CONSTANT c_bsn_align_latency : NATURAL := 3; + CONSTANT c_bsn_align_sop_timeout : NATURAL := (c_bsn_align_latency + 1) * c_block_period; -- wait somewhat more than c_bsn_align_latency periods + CONSTANT c_bsn_align_xoff_timeout : NATURAL := c_bsn_align_latency * 2 * c_block_period; -- flush factor 2 longer than needed + CONSTANT c_dp_fifo_size : NATURAL := (c_bsn_align_latency + 5) * c_block_size; -- be able to fit blocks for as long as sop time out; + CONSTANT c_dp_fifo_fill : NATURAL := c_block_size; + + SIGNAL dp_fifo_fill_src_in_arr : t_dp_siso_arr(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL dp_fifo_fill_src_out_arr : t_dp_sosi_arr(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL dp_bsn_align_src_out_arr : t_dp_sosi_arr(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL reg_dp_bsn_align_mesh_mosi : t_mem_mosi; + SIGNAL reg_dp_bsn_align_mesh_miso : t_mem_miso := c_mem_miso_rst; + SIGNAL reg_dp_bsn_align_input_mosi : t_mem_mosi; + SIGNAL reg_dp_bsn_align_input_miso : t_mem_miso := c_mem_miso_rst; + + ------------------------------------------------------------------------------- + -- Beamlet distribution & Mesh terminal preparation + ------------------------------------------------------------------------------- + CONSTANT c_nof_nodes : NATURAL := 8; + SIGNAL dp_deinterleave_snk_in_2arr_4 : t_dp_sosi_2arr_4(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL dp_deinterleave_src_out_3arr_4_2 : t_dp_sosi_3arr_4_2(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL dp_deinterleave_src_out_2arr_8 : t_dp_sosi_2arr_8(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL dp_deinterleave_src_out_2arr_3 : t_dp_sosi_2arr_3(c_nof_nodes-1 DOWNTO 0); + SIGNAL dp_deinterleave_src_out_arr : t_dp_sosi_arr(c_nof_nodes-1 DOWNTO 0); + + SIGNAL dp_fifo_sc_0_src_out_2arr_8 : t_dp_sosi_2arr_8(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL dp_fifo_sc_0_src_in_2arr_8 : t_dp_siso_2arr_8(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL dp_repack_data_0_snk_in_2arr_8 : t_dp_sosi_2arr_8(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL dp_repack_data_0_snk_out_2arr_8 : t_dp_siso_2arr_8(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL dp_repack_data_0_src_out_2arr_8 : t_dp_sosi_2arr_8(c_nof_10GbE_streams-1 DOWNTO 0); + + ------------------------------------------------------------------------------- + -- Mesh Terminals + ------------------------------------------------------------------------------- + SIGNAL node_apertif_unb1_correlator_mesh_snk_in_arr : t_dp_sosi_arr(c_nof_nodes-1 DOWNTO 0); + SIGNAL node_apertif_unb1_correlator_mesh_src_out_arr : t_dp_sosi_arr(c_nof_nodes-1 DOWNTO 0); + SIGNAL node_apertif_unb1_correlator_mesh_src_out_2arr_12 : t_dp_sosi_2arr_12(c_nof_polarizations-1 DOWNTO 0); BEGIN - --------------------------------------------------------------------------------------- - -- Swap the bytes in the 32b words to make them little-endian - --------------------------------------------------------------------------------------- - p_connect : PROCESS(snk_in) - BEGIN - -- Control - mms_dp_xonoff_snk_in_arr(0) <= snk_in; - -- Data: re&im concatenated so real part is put on the line first: re,im,re,im, .. - mms_dp_xonoff_snk_in_arr(0).data( c_byte_w-1 DOWNTO 0) <= snk_in.data(4*c_byte_w-1 DOWNTO 3*c_byte_w); - mms_dp_xonoff_snk_in_arr(0).data(2*c_byte_w-1 DOWNTO c_byte_w) <= snk_in.data(3*c_byte_w-1 DOWNTO 2*c_byte_w); - mms_dp_xonoff_snk_in_arr(0).data(3*c_byte_w-1 DOWNTO 2*c_byte_w) <= snk_in.data(2*c_byte_w-1 DOWNTO c_byte_w); - mms_dp_xonoff_snk_in_arr(0).data(4*c_byte_w-1 DOWNTO 3*c_byte_w) <= snk_in.data( c_byte_w-1 DOWNTO 0); - END PROCESS; - ----------------------------------------------------------------------------- - -- DP Xon Off. --> output to the GPU machine(s) can be switched on or off. + -- Interface : 10GbE ----------------------------------------------------------------------------- - u_mms_dp_xonoff : ENTITY dp_lib.mms_dp_xonoff - GENERIC MAP( - g_nof_streams => 1, - g_combine_streams => TRUE, - g_bypass => FALSE, - g_default_value => sel_a_b(g_sim, '1', '0') -- Sim: on by default like block gens + -- Wire together different types + gen_wires: FOR i IN 0 TO c_nof_10GbE_streams-1 GENERATE + unb_xaui_tx_arr(i) <= xaui_tx_arr(i); + xaui_rx_arr(i) <= unb_xaui_rx_arr(i); + END GENERATE; + + u_front_io : ENTITY unb1_board_lib.unb1_board_front_io + GENERIC MAP ( + g_nof_xaui => c_nof_10GbE_streams ) - PORT MAP( - mm_rst => mm_rst, - mm_clk => mm_clk, - - reg_mosi => reg_dp_xonoff_output_mosi, - reg_miso => reg_dp_xonoff_output_miso, - - dp_rst => dp_rst, - dp_clk => dp_clk, - - snk_out_arr => mms_dp_xonoff_snk_out_arr, - snk_in_arr => mms_dp_xonoff_snk_in_arr, - - src_in_arr => dp_fifo_sc_snk_out_arr, - src_out_arr => dp_fifo_sc_snk_in_arr + PORT MAP ( + xaui_tx_arr => unb_xaui_tx_arr, + xaui_rx_arr => unb_xaui_rx_arr, + + mdio_mdc_arr => mdio_mdc_arr, + mdio_mdat_in_arr => mdio_mdat_in_arr, + mdio_mdat_oen_arr => mdio_mdat_oen_arr, + + SI_FN_0_TX => SI_FN_0_TX, + SI_FN_0_RX => SI_FN_0_RX, + SI_FN_1_TX => SI_FN_1_TX, + SI_FN_1_RX => SI_FN_1_RX, + SI_FN_2_TX => SI_FN_2_TX, + SI_FN_2_RX => SI_FN_2_RX, + + SI_FN_0_CNTRL => SI_FN_0_CNTRL, + SI_FN_1_CNTRL => SI_FN_1_CNTRL, + SI_FN_2_CNTRL => SI_FN_2_CNTRL, + SI_FN_3_CNTRL => SI_FN_3_CNTRL ); - - --------------------------------------------------------------------------------------- - -- FIFO - --------------------------------------------------------------------------------------- - u_dp_fifo_sc : ENTITY dp_lib.dp_fifo_sc + + u_areset_sa_rst : ENTITY common_lib.common_areset GENERIC MAP( - g_technology => g_technology, - g_data_w => c_tech_tse_data_w, - g_bsn_w => c_bsn_w, - g_fifo_size => c_fifo_size, - g_use_bsn => TRUE, - g_use_sync => TRUE, --Used to realign to 50 timesample grid in dp_offload_tx - g_use_ctrl => TRUE + g_rst_level => '1', + g_delay_len => 4 ) - PORT MAP ( - rst => dp_rst, - clk => dp_clk, - - snk_out => dp_fifo_sc_snk_out_arr(0), - snk_in => dp_fifo_sc_snk_in_arr(0), - - src_in => dp_fifo_sc_src_in_arr(0), - src_out => dp_fifo_sc_src_out_arr(0) + PORT MAP( + clk => SA_CLK, + in_rst => '0', + out_rst => sa_rst + ); + + u_tr_10GbE: ENTITY tr_10GbE_lib.tr_10GbE + GENERIC MAP( + g_sim => g_sim, + g_sim_level => 1, + g_nof_macs => c_nof_10GbE_streams, + g_use_mdio => TRUE + ) + + PORT MAP ( + tr_ref_clk_156 => SA_CLK, + tr_ref_rst_156 => sa_rst, + + cal_rec_clk => mm_clk, + + mm_rst => mm_rst, + mm_clk => mm_clk, + + reg_mac_mosi => reg_tr_10GbE_mosi, + reg_mac_miso => reg_tr_10GbE_miso, + + xaui_mosi => reg_tr_xaui_mosi, + xaui_miso => reg_tr_xaui_miso, + + mdio_mosi_arr => reg_mdio_mosi_arr(c_nof_10GbE_streams-1 DOWNTO 0), + mdio_miso_arr => reg_mdio_miso_arr(c_nof_10GbE_streams-1 DOWNTO 0), + + dp_rst => dp_rst, + dp_clk => dp_clk, + + src_out_arr => dp_offload_rx_snk_in_arr, + src_in_arr => dp_offload_rx_snk_out_arr, + + xaui_tx_arr => xaui_tx_arr, + xaui_rx_arr => xaui_rx_arr, + + mdio_rst => SI_FN_RSTN, + mdio_mdc_arr => mdio_mdc_arr, + mdio_mdat_in_arr => mdio_mdat_in_arr, + mdio_mdat_oen_arr => mdio_mdat_oen_arr ); - - --------------------------------------------------------------------------------------- - -- dp_offload_tx - --------------------------------------------------------------------------------------- - u_dp_offload_tx : ENTITY dp_lib.dp_offload_tx + + ----------------------------------------------------------------------------- + -- RX: dp_offload_rx + ----------------------------------------------------------------------------- + u_dp_offload_rx : ENTITY dp_lib.dp_offload_rx GENERIC MAP ( - g_technology => g_technology, - g_nof_streams => g_nof_streams, - g_data_w => c_tech_tse_data_w, - g_use_complex => FALSE, - g_nof_words_per_block => c_nof_words_per_block, - g_nof_blocks_per_packet => c_nof_blocks_per_packet, - g_hdr_field_arr => c_hdr_field_arr, - g_hdr_field_sel => c_hdr_field_sel, - g_pkt_merge_align_at_sync => TRUE -- Maintain 50 timesample grid during packet merging + g_nof_streams => c_nof_10GbE_streams, + g_data_w => c_xgmii_data_w, + g_hdr_field_arr => c_apertif_udp_offload_hdr_field_arr, + g_remove_crc => FALSE, + g_crc_nof_words => 0 ) PORT MAP ( mm_rst => mm_rst, @@ -224,41 +289,285 @@ BEGIN dp_rst => dp_rst, dp_clk => dp_clk, + + reg_hdr_dat_mosi => reg_dp_offload_rx_hdr_dat_mosi, + reg_hdr_dat_miso => reg_dp_offload_rx_hdr_dat_miso, + + snk_in_arr => dp_offload_rx_snk_in_arr, + snk_out_arr => dp_offload_rx_snk_out_arr, + + src_out_arr => dp_offload_rx_src_out_arr, + src_in_arr => (OTHERS=>c_dp_siso_rdy), --dp_offload_rx_src_in_arr, + + hdr_fields_out_arr => hdr_fields_out_arr + ); + + gen_restore_bf_out_i : FOR i IN 0 TO c_nof_10GbE_streams-1 GENERATE + dp_offload_rx_restored_src_out_arr(i).sync <= sl(hdr_fields_out_arr(i)(field_hi(c_apertif_udp_offload_hdr_field_arr, "dp_sync") DOWNTO field_lo(c_apertif_udp_offload_hdr_field_arr, "dp_sync" ))); + dp_offload_rx_restored_src_out_arr(i).bsn <= RESIZE_UVEC(hdr_fields_out_arr(i)(field_hi(c_apertif_udp_offload_hdr_field_arr, "dp_bsn" ) DOWNTO field_lo(c_apertif_udp_offload_hdr_field_arr, "dp_bsn" )), c_dp_stream_bsn_w); + + dp_offload_rx_restored_src_out_arr(i).re <= dp_offload_rx_src_out_arr(i).re; + dp_offload_rx_restored_src_out_arr(i).im <= dp_offload_rx_src_out_arr(i).im; + dp_offload_rx_restored_src_out_arr(i).valid <= dp_offload_rx_src_out_arr(i).valid; + dp_offload_rx_restored_src_out_arr(i).sop <= dp_offload_rx_src_out_arr(i).sop; + dp_offload_rx_restored_src_out_arr(i).eop <= dp_offload_rx_src_out_arr(i).eop; + dp_offload_rx_restored_src_out_arr(i).err <= dp_offload_rx_src_out_arr(i).err; + END GENERATE; - reg_hdr_dat_mosi => reg_dp_offload_tx_hdr_dat_mosi, - reg_hdr_dat_miso => reg_dp_offload_tx_hdr_dat_miso, - - snk_in_arr => dp_fifo_sc_src_out_arr, - snk_out_arr => dp_fifo_sc_src_in_arr, + ----------------------------------------------------------------------------- + -- RX: BSN monitors + ----------------------------------------------------------------------------- + dp_bsn_monitor_input_in_sosi_arr(2 DOWNTO 0) <= dp_offload_rx_restored_src_out_arr; --Un-aligned, non-flow controlled input streams + dp_bsn_monitor_input_in_siso_arr(2 DOWNTO 0) <= (OTHERS=>c_dp_siso_rdy); - src_out_arr => dp_offload_tx_src_out_arr, - src_in_arr => dp_offload_tx_src_in_arr, + dp_bsn_monitor_input_in_sosi_arr(5 DOWNTO 3) <= dp_bsn_align_src_out_arr; --BSN aligned streams + dp_bsn_monitor_input_in_siso_arr(5 DOWNTO 3) <= dp_fifo_fill_src_in_arr; - hdr_fields_in_arr => hdr_fields_in_arr + u_dp_bsn_monitor_input : ENTITY dp_lib.mms_dp_bsn_monitor + GENERIC MAP ( + g_nof_streams => c_nof_10GbE_streams*2, + g_sync_timeout => 225280000, --200000000*1.024*1.1 (1.1 = margin) + g_log_first_bsn => FALSE + ) + PORT MAP ( + mm_rst => mm_rst, + mm_clk => mm_clk, + reg_mosi => reg_dp_bsn_monitor_input_mosi, + reg_miso => reg_dp_bsn_monitor_input_miso, + + dp_rst => dp_rst, + dp_clk => dp_clk, + sync_in => dp_pps, + in_siso_arr => dp_bsn_monitor_input_in_siso_arr, + in_sosi_arr => dp_bsn_monitor_input_in_sosi_arr ); + + ----------------------------------------------------------------------------- + -- RX: BSN alignment + ----------------------------------------------------------------------------- + gen_dp_fifo_fill: FOR i IN 0 TO c_nof_10GbE_streams-1 GENERATE + u_dp_fifo_fill : ENTITY dp_lib.dp_fifo_fill + GENERIC MAP ( + g_data_w => c_xgmii_data_w, + g_bsn_w => c_dp_stream_bsn_w, + g_channel_w => c_dp_stream_channel_w, + g_use_bsn => TRUE, + g_use_channel => TRUE, + g_use_error => TRUE, + g_use_sync => TRUE, + g_use_complex => TRUE, + g_fifo_fill => c_dp_fifo_fill, + g_fifo_size => c_dp_fifo_size + ) + PORT MAP ( + rst => dp_rst, + clk => dp_clk, + + snk_out => dp_offload_rx_src_in_arr(i), + snk_in => dp_offload_rx_restored_src_out_arr(i), + + src_in => dp_fifo_fill_src_in_arr(i), + src_out => dp_fifo_fill_src_out_arr(i) + ); + END GENERATE; + + u_mms_dp_bsn_align : ENTITY dp_lib.mms_dp_bsn_align + GENERIC MAP ( + g_block_size => c_block_size, + g_block_period => c_block_period, + g_nof_input => c_nof_10GbE_streams, + g_xoff_timeout => c_bsn_align_xoff_timeout, + g_sop_timeout => c_bsn_align_sop_timeout, + g_bsn_latency => c_bsn_align_latency, + g_bsn_request_pipeline => 2 + ) + PORT MAP ( + dp_rst => dp_rst, + dp_clk => dp_clk, + + snk_out_arr => dp_fifo_fill_src_in_arr, + snk_in_arr => dp_fifo_fill_src_out_arr, + + src_in_arr => (OTHERS=>c_dp_siso_rdy), + src_out_arr => dp_bsn_align_src_out_arr, + + mm_rst => mm_rst, + mm_clk => mm_clk, + + reg_mosi => reg_dp_bsn_align_input_mosi, + reg_miso => reg_dp_bsn_align_input_miso + ); + + ------------------------------------------------------------------------------- + -- Extract the 4 bf_unit substreams from each 10GbE input stream + -- . 3 64b streams -> 3*4 16b streams + -- . Incoming beamlets (same for each of the 3 10GbE inputs): 3 inputs*704 beamlets/FPGA + -- . 10GbE 64b word index ) [0],[1], ..[175] + -- . BF Stream 0 ) 0, 1 , .. 175 + -- . BF Stream 1 ) 256,257 , .. 431 + -- . BF Stream 2 ) 512,513 , .. 687 + -- . BF Stream 3 ) 768,769 , .. 943 + ------------------------------------------------------------------------------- + gen_dp_stream_deconcat : FOR i IN 0 TO c_nof_10GbE_streams-1 GENERATE + dp_deinterleave_snk_in_2arr_4(i) <= func_dp_stream_deconcat(dp_bsn_align_src_out_arr(i), c_nof_apertif_bf_units, c_channel_dat_w); + END GENERATE; - src_out_arr <= dp_offload_tx_src_out_arr; - dp_offload_tx_src_in_arr <= src_in_arr; - - --------------------------------------------------------------------------------------- - -- Extract the backplane number from ID - --------------------------------------------------------------------------------------- - id_backplane <= RESIZE_UVEC(ID(7 DOWNTO 3), c_byte_w); - id_chip <= RESIZE_UVEC(ID(2 DOWNTO 0), c_byte_w); - - --------------------------------------------------------------------------------------- - -- Assign DP record fields and ID to header fields - --------------------------------------------------------------------------------------- - gen_slv_hard_fields : FOR i IN 0 TO g_nof_streams-1 GENERATE - hdr_fields_in_arr(i)(field_hi(c_hdr_field_arr, "eth_src_mac" ) DOWNTO field_lo(c_hdr_field_arr, "eth_src_mac" )) <= x"00228608" & id_backplane & id_chip; - hdr_fields_in_arr(i)(field_hi(c_hdr_field_arr, "udp_src_port" ) DOWNTO field_lo(c_hdr_field_arr, "udp_src_port" )) <= x"D0" & ID; - hdr_fields_in_arr(i)(field_hi(c_hdr_field_arr, "udp_dst_port" ) DOWNTO field_lo(c_hdr_field_arr, "udp_dst_port" )) <= x"D0" & ID; - hdr_fields_in_arr(i)(field_hi(c_hdr_field_arr, "ip_src_addr" ) DOWNTO field_lo(c_hdr_field_arr, "ip_src_addr" )) <= x"0A63" & id_backplane & INCR_UVEC(id_chip, 1); - - hdr_fields_in_arr(i)(field_hi(c_hdr_field_arr, "id_source_id" ) DOWNTO field_lo(c_hdr_field_arr, "id_source_id" )) <= x"00" & id_backplane; - hdr_fields_in_arr(i)(field_hi(c_hdr_field_arr, "id_n_channels" ) DOWNTO field_lo(c_hdr_field_arr, "id_n_channels" )) <= TO_UVEC(g_nof_channels, c_halfword_w); - hdr_fields_in_arr(i)(field_hi(c_hdr_field_arr, "id_n_blocks" ) DOWNTO field_lo(c_hdr_field_arr, "id_n_blocks" )) <= TO_UVEC(g_nof_blocks, c_halfword_w); - hdr_fields_in_arr(i)(field_hi(c_hdr_field_arr, "id_timestamp" ) DOWNTO field_lo(c_hdr_field_arr, "id_timestamp" )) <= dp_fifo_sc_src_out_arr(0).bsn; + ------------------------------------------------------------------------------- + -- Deinterleave 3*4 into 3*4*2 + ------------------------------------------------------------------------------- + gen_deinterleave_i : FOR i IN 0 TO c_nof_10GbE_streams-1 GENERATE + gen_deinterleave_j : FOR j IN 0 TO c_nof_apertif_bf_units-1 GENERATE + u_deinterleave : ENTITY dp_lib.dp_deinterleave + GENERIC MAP ( + g_nof_out => 2, + g_block_size_int => 1, + g_block_size_output => c_nof_beamlets, + g_dat_w => c_channel_dat_w, + g_use_ctrl => TRUE, + g_use_sync_bsn => TRUE, + g_align_out => TRUE, + g_use_complex => FALSE + ) + PORT MAP ( + rst => dp_rst, + clk => dp_clk, + + snk_in => dp_deinterleave_snk_in_2arr_4(i)(j), + src_out_arr => dp_deinterleave_src_out_3arr_4_2(i)(j) + ); + END GENERATE; END GENERATE; -END wrap; + ------------------------------------------------------------------------------- + -- Rewire 3*4*2 into 3*8 + ------------------------------------------------------------------------------- + gen_rewire : FOR i IN 0 TO c_nof_10GbE_streams-1 GENERATE + -- Deinterleaver output 0 = even beamlet indices + dp_deinterleave_src_out_2arr_8(i)(0) <= dp_deinterleave_src_out_3arr_4_2(i)(0)(0); -- Beamlet 0, 2, 4, .. 174 + dp_deinterleave_src_out_2arr_8(i)(1) <= dp_deinterleave_src_out_3arr_4_2(i)(1)(0); -- Beamlet 256, 258, 260, .. 430 + dp_deinterleave_src_out_2arr_8(i)(2) <= dp_deinterleave_src_out_3arr_4_2(i)(2)(0); -- Beamlet 512, 514, 516, .. 686 + dp_deinterleave_src_out_2arr_8(i)(3) <= dp_deinterleave_src_out_3arr_4_2(i)(3)(0); -- Beamlet 768, 770, 772, .. 942 + -- Deinterleaver output 1 = odd beamlet indices + dp_deinterleave_src_out_2arr_8(i)(4) <= dp_deinterleave_src_out_3arr_4_2(i)(0)(1); -- Beamlet 1, 3, 5, .. 175 + dp_deinterleave_src_out_2arr_8(i)(5) <= dp_deinterleave_src_out_3arr_4_2(i)(1)(1); -- Beamlet 257, 259, 261, .. 431 + dp_deinterleave_src_out_2arr_8(i)(6) <= dp_deinterleave_src_out_3arr_4_2(i)(2)(1); -- Beamlet 513, 515, 517, .. 689 + dp_deinterleave_src_out_2arr_8(i)(7) <= dp_deinterleave_src_out_3arr_4_2(i)(3)(1); -- Beamlet 769, 771, 773, .. 943 + END GENERATE; + + ------------------------------------------------------------------------------- + -- Transpose 3*8 into 8*3 streams + ------------------------------------------------------------------------------- + gen_transpose_i : FOR i IN 0 TO c_nof_10GbE_streams-1 GENERATE + gen_transpose_j : FOR j IN 0 TO c_nof_nodes-1 GENERATE + dp_deinterleave_src_out_2arr_3(j)(i) <= dp_deinterleave_src_out_2arr_8(i)(j); + END GENERATE; + END GENERATE; + + ------------------------------------------------------------------------------- + -- Concatenate 8*3 16b streams into 8 48b streams + ------------------------------------------------------------------------------- + gen_concat : FOR i IN 0 TO c_nof_nodes-1 GENERATE + dp_deinterleave_src_out_arr(i) <= func_dp_stream_concat(dp_deinterleave_src_out_2arr_3(i), c_channel_dat_w); + END GENERATE; + + ------------------------------------------------------------------------------- + -- Mesh Terminals: transpose + -- . Input : 8 destination FPGAs * 3 local inputs 0..2 + -- . Output : 8 source FPGAs * 3 remote inputs (total: inputs 0..23) + -- . Processed beamlet/FPGA should match the Apertif XC and ARTS SC4: 24 inputs*88 beamlets/FPGA + -- . FPGA 0 = FN0 - 0, 2, 4, .. 174 (88 beamlets*24 inputs) <- Output enabled only on this FPGA; central beam should be in these beamlets. + -- . FPGA 1 = FN1 - 256, 258, 260, .. 430 (88 beamlets*24 inputs) + -- . FPGA 2 = FN2 - 512, 514, 516, .. 686 (88 beamlets*24 inputs) + -- . FPGA 3 = FN3 - 768, 770, 772, .. 942 (88 beamlets*24 inputs) + -- . FPGA 4 = BN0 - 1, 3, 5, .. 175 (88 beamlets*24 inputs) + -- . FPGA 5 = BN1 - 257, 259, 261, .. 431 (88 beamlets*24 inputs) + -- . FPGA 6 = BN2 - 513, 515, 517, .. 689 (88 beamlets*24 inputs) + -- . FPGA 7 = BN3 - 769, 771, 773, .. 943 (88 beamlets*24 inputs) + ------------------------------------------------------------------------------- + node_apertif_unb1_correlator_mesh_snk_in_arr <= dp_deinterleave_src_out_arr; + + u_node_apertif_unb1_correlator_mesh : ENTITY work.node_apertif_unb1_correlator_mesh + GENERIC MAP( + g_sim => g_sim, + g_sim_level => 1, + g_nof_input_streams => c_nof_nodes, + g_nof_output_streams => c_nof_nodes, + g_usr_use_complex => FALSE, + g_usr_frame_len => c_nof_beamlets + ) + PORT MAP( + chip_id => chip_id, + mm_rst => mm_rst, + mm_clk => mm_clk, + dp_rst => dp_rst, + dp_clk => dp_clk, + dp_pps => dp_pps, + tr_mesh_clk => SB_CLK, + cal_clk => cal_rec_clk, + + snk_in_arr => node_apertif_unb1_correlator_mesh_snk_in_arr, + src_out_arr => node_apertif_unb1_correlator_mesh_src_out_arr, + + reg_bsn_monitor_mosi => reg_dp_bsn_monitor_mesh_mosi, + reg_bsn_monitor_miso => reg_dp_bsn_monitor_mesh_miso, + + reg_dp_bsn_align_mosi => reg_dp_bsn_align_mesh_mosi, + reg_dp_bsn_align_miso => reg_dp_bsn_align_mesh_miso, + + FN_BN_0_TX => FN_BN_0_TX, + FN_BN_0_RX => FN_BN_0_RX, + FN_BN_1_TX => FN_BN_1_TX, + FN_BN_1_RX => FN_BN_1_RX, + FN_BN_2_TX => FN_BN_2_TX, + FN_BN_2_RX => FN_BN_2_RX, + FN_BN_3_TX => FN_BN_3_TX, + FN_BN_3_RX => FN_BN_3_RX + ); + + ------------------------------------------------------------------------------- + -- Unconcatenate the 8 48b streams into 2*12 16b streams + ------------------------------------------------------------------------------- + p_unconcat_mesh_src_out: PROCESS(node_apertif_unb1_correlator_mesh_src_out_arr) + BEGIN + FOR i IN 0 TO c_nof_polarizations-1 LOOP + FOR j IN 0 TO c_nof_telescopes-1 LOOP + node_apertif_unb1_correlator_mesh_src_out_2arr_12(i)(j) <= node_apertif_unb1_correlator_mesh_src_out_arr(0); --Sop, Eop, BSN, sync etc. + END LOOP; + END LOOP; + + -- Y polarization + node_apertif_unb1_correlator_mesh_src_out_2arr_12(1)(11).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(7).data(47 DOWNTO 32); --FIXME Put this in a FOR loop. + node_apertif_unb1_correlator_mesh_src_out_2arr_12(1)(10).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(7).data(31 DOWNTO 16); + node_apertif_unb1_correlator_mesh_src_out_2arr_12(1)(9).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(7).data(15 DOWNTO 0); + + node_apertif_unb1_correlator_mesh_src_out_2arr_12(1)(8).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(6).data(47 DOWNTO 32); + node_apertif_unb1_correlator_mesh_src_out_2arr_12(1)(7).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(6).data(31 DOWNTO 16); + node_apertif_unb1_correlator_mesh_src_out_2arr_12(1)(6).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(6).data(15 DOWNTO 0); + + node_apertif_unb1_correlator_mesh_src_out_2arr_12(1)(5).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(5).data(47 DOWNTO 32); + node_apertif_unb1_correlator_mesh_src_out_2arr_12(1)(4).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(5).data(31 DOWNTO 16); + node_apertif_unb1_correlator_mesh_src_out_2arr_12(1)(3).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(5).data(15 DOWNTO 0); + + node_apertif_unb1_correlator_mesh_src_out_2arr_12(1)(2).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(4).data(47 DOWNTO 32); + node_apertif_unb1_correlator_mesh_src_out_2arr_12(1)(1).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(4).data(31 DOWNTO 16); + node_apertif_unb1_correlator_mesh_src_out_2arr_12(1)(0).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(4).data(15 DOWNTO 0); + -- X polarization + node_apertif_unb1_correlator_mesh_src_out_2arr_12(0)(11).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(3).data(47 DOWNTO 32); + node_apertif_unb1_correlator_mesh_src_out_2arr_12(0)(10).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(3).data(31 DOWNTO 16); + node_apertif_unb1_correlator_mesh_src_out_2arr_12(0)(9).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(3).data(15 DOWNTO 0); + + node_apertif_unb1_correlator_mesh_src_out_2arr_12(0)(8).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(2).data(47 DOWNTO 32); + node_apertif_unb1_correlator_mesh_src_out_2arr_12(0)(7).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(2).data(31 DOWNTO 16); + node_apertif_unb1_correlator_mesh_src_out_2arr_12(0)(6).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(2).data(15 DOWNTO 0); + + node_apertif_unb1_correlator_mesh_src_out_2arr_12(0)(5).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(1).data(47 DOWNTO 32); + node_apertif_unb1_correlator_mesh_src_out_2arr_12(0)(4).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(1).data(31 DOWNTO 16); + node_apertif_unb1_correlator_mesh_src_out_2arr_12(0)(3).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(1).data(15 DOWNTO 0); + + node_apertif_unb1_correlator_mesh_src_out_2arr_12(0)(2).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(0).data(47 DOWNTO 32); + node_apertif_unb1_correlator_mesh_src_out_2arr_12(0)(1).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(0).data(31 DOWNTO 16); + node_apertif_unb1_correlator_mesh_src_out_2arr_12(0)(0).data(15 DOWNTO 0) <= node_apertif_unb1_correlator_mesh_src_out_arr(0).data(15 DOWNTO 0); + END PROCESS; + + +END str; diff --git a/applications/arts/designs/arts_unb1_sc4/src/vhdl/arts_unb1_sc4_processing.vhd b/applications/arts/designs/arts_unb1_sc4/src/vhdl/arts_unb1_sc4_processing.vhd index 05457804666028c523fc823c702e5a7fbbe266f7..7fab99f4446dca08ac17e069dd7c759d8f463053 100644 --- a/applications/arts/designs/arts_unb1_sc4/src/vhdl/arts_unb1_sc4_processing.vhd +++ b/applications/arts/designs/arts_unb1_sc4/src/vhdl/arts_unb1_sc4_processing.vhd @@ -74,29 +74,29 @@ ARCHITECTURE str OF arts_unb1_sc4_processing IS ------------------------------------------------------------------------------- -- WPFB ------------------------------------------------------------------------------- - CONSTANT c_use_prefilter : BOOLEAN := FALSE; - CONSTANT c_wpfb_wb_factor : NATURAL := 1; - CONSTANT c_wpfb_nof_wb_streams : NATURAL := g_nof_telescopes; - CONSTANT c_wpfb_nof_chan : NATURAL := g_nof_polarizations; - CONSTANT c_wpfb_nof_points : NATURAL := c_nof_channels; - CONSTANT c_wpfb_nof_taps : NATURAL := 8; - CONSTANT c_wpfb_coef_w : NATURAL := 9; - CONSTANT c_wpfb_in_backoff_w : natural := 0; - CONSTANT c_wpfb_in_dat_w : NATURAL := g_input_data_w; - CONSTANT c_wpfb_fft_in_dat_w : NATURAL := g_input_data_w; - CONSTANT c_wpfb_out_dat_w : NATURAL := 12; - CONSTANT c_wpfb_out_dat_significant_w : NATURAL := sel_a_b(g_input_data_w = 6, 10, 12); - CONSTANT c_wpfb_out_gain_w : NATURAL := 0; - CONSTANT c_wpfb_use_separate : BOOLEAN := FALSE; - CONSTANT c_wpfb_use_reorder : BOOLEAN := FALSE; - CONSTANT c_wpfb_use_fft_shift : BOOLEAN := FALSE; - - CONSTANT c_wpfb : t_wpfb := (c_wpfb_wb_factor, c_wpfb_nof_points, c_wpfb_nof_chan, c_wpfb_nof_wb_streams, - c_wpfb_nof_taps, c_wpfb_in_backoff_w, c_wpfb_in_dat_w, 16, c_wpfb_coef_w, - c_wpfb_use_reorder, c_wpfb_use_fft_shift, c_wpfb_use_separate, c_wpfb_fft_in_dat_w, c_wpfb_out_dat_w, c_wpfb_out_gain_w, 18, 2, true, 56, 2, c_nof_blocks_per_sync, - c_fft_pipeline, c_fft_pipeline, c_fil_ppf_pipeline); - - CONSTANT c_wpfb_coefs_file_prefix : STRING := "hex/chan_fil_coefs_wide1_p32_t8"; +-- CONSTANT c_use_prefilter : BOOLEAN := FALSE; +-- CONSTANT c_wpfb_wb_factor : NATURAL := 1; +-- CONSTANT c_wpfb_nof_wb_streams : NATURAL := g_nof_telescopes; +-- CONSTANT c_wpfb_nof_chan : NATURAL := g_nof_polarizations; +-- CONSTANT c_wpfb_nof_points : NATURAL := c_nof_channels; +-- CONSTANT c_wpfb_nof_taps : NATURAL := 8; +-- CONSTANT c_wpfb_coef_w : NATURAL := 9; +-- CONSTANT c_wpfb_in_backoff_w : natural := 0; +-- CONSTANT c_wpfb_in_dat_w : NATURAL := g_input_data_w; +-- CONSTANT c_wpfb_fft_in_dat_w : NATURAL := g_input_data_w; +-- CONSTANT c_wpfb_out_dat_w : NATURAL := 12; +-- CONSTANT c_wpfb_out_dat_significant_w : NATURAL := sel_a_b(g_input_data_w = 6, 10, 12); +-- CONSTANT c_wpfb_out_gain_w : NATURAL := 0; +-- CONSTANT c_wpfb_use_separate : BOOLEAN := FALSE; +-- CONSTANT c_wpfb_use_reorder : BOOLEAN := FALSE; +-- CONSTANT c_wpfb_use_fft_shift : BOOLEAN := FALSE; +-- +-- CONSTANT c_wpfb : t_wpfb := (c_wpfb_wb_factor, c_wpfb_nof_points, c_wpfb_nof_chan, c_wpfb_nof_wb_streams, +-- c_wpfb_nof_taps, c_wpfb_in_backoff_w, c_wpfb_in_dat_w, 16, c_wpfb_coef_w, +-- c_wpfb_use_reorder, c_wpfb_use_fft_shift, c_wpfb_use_separate, c_wpfb_fft_in_dat_w, c_wpfb_out_dat_w, c_wpfb_out_gain_w, 18, 2, true, 56, 2, c_nof_blocks_per_sync, +-- c_fft_pipeline, c_fft_pipeline, c_fil_ppf_pipeline); +-- +-- CONSTANT c_wpfb_coefs_file_prefix : STRING := "hex/chan_fil_coefs_wide1_p32_t8"; SIGNAL wpfb_snk_in_arr : t_dp_sosi_arr(g_nof_telescopes-1 DOWNTO 0); SIGNAL wpfb_src_out_arr : t_dp_sosi_arr(g_nof_telescopes-1 DOWNTO 0); @@ -118,6 +118,8 @@ ARCHITECTURE str OF arts_unb1_sc4_processing IS -- stat_data_w : POSITIVE; -- = 32 -- stat_data_sz : POSITIVE; -- = 2 + CONSTANT c_nof_bf_subbands : NATURAL := 240; + CONSTANT c_channel_dat_w : NATURAL := 8; CONSTANT c_bf_bf : t_c_bf := (g_nof_telescopes, g_nof_telescopes, c_nof_bf_subbands, c_nof_bf_subbands, g_nof_tabs, c_channel_dat_w, 16, 1, 16, 1, 8, 32, 2); CONSTANT c_bf_bf_weights_file_name : STRING := "hex/bf_weights"; @@ -227,26 +229,26 @@ BEGIN ------------------------------------------------------------------------------- -- TAB Beam former FIFO stage: BF module requires flow control ------------------------------------------------------------------------------- - gen_dp_fifo_sc : FOR i IN 0 TO g_nof_telescopes-1 GENERATE - u_dp_fifo_sc : ENTITY dp_lib.dp_fifo_sc - GENERIC MAP( - g_data_w => g_input_data_w, - g_bsn_w => 64, - g_fifo_size => 30, - g_use_bsn => TRUE, - g_use_sync => TRUE, - g_use_ctrl => TRUE - ) - PORT MAP ( - rst => dp_rst, - clk => dp_clk, - - snk_in => wpfb_src_out_arr(i), - - src_in => bf_src_out_arr(i), - src_out => bf_snk_in_arr(i) - ); - END GENERATE; +-- gen_dp_fifo_sc : FOR i IN 0 TO g_nof_telescopes-1 GENERATE +-- u_dp_fifo_sc : ENTITY dp_lib.dp_fifo_sc +-- GENERIC MAP( +-- g_data_w => g_input_data_w, +-- g_bsn_w => 64, +-- g_fifo_size => 30, +-- g_use_bsn => TRUE, +-- g_use_sync => TRUE, +-- g_use_ctrl => TRUE +-- ) +-- PORT MAP ( +-- rst => dp_rst, +-- clk => dp_clk, +-- +-- snk_in => wpfb_src_out_arr(i), +-- +-- src_in => bf_src_out_arr(i), +-- src_out => bf_snk_in_arr(i) +-- ); +-- END GENERATE; ------------------------------------------------------------------------------- -- TAB Beam Former