Skip to content
Snippets Groups Projects

Resolve L2SDP-169

Merged
Reinier van der Wallerequested to merge
L2SDP-169 into master
2 open threads
4 files
+ 347
5
Compare changes
  • Side-by-side
  • Inline

Files

 
-------------------------------------------------------------------------------
 
--
 
-- Copyright 2020
 
-- 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
 
-- Purpose:
 
-- The beamformer output (BDO) packetizes the beamlet data into UDP/IP packets.
 
-- Description:
 
-- Remark:
 
--
 
-------------------------------------------------------------------------------
 
 
LIBRARY IEEE, common_lib, dp_lib, tr_10GbE_lib;
 
USE IEEE.STD_LOGIC_1164.ALL;
 
USE IEEE.NUMERIC_STD.ALL;
 
USE common_lib.common_pkg.ALL;
 
USE common_lib.common_field_pkg.ALL;
 
USE common_lib.common_mem_pkg.ALL;
 
USE dp_lib.dp_stream_pkg.ALL;
 
USE work.sdp_pkg.ALL;
 
 
ENTITY sdp_beamformer_output IS
 
GENERIC (
 
g_beamset_id : NATURAL := 0
 
 
);
 
PORT (
 
dp_clk : IN STD_LOGIC;
 
dp_rst : IN STD_LOGIC;
 
 
mm_clk : IN STD_LOGIC;
 
mm_rst : IN STD_LOGIC;
 
 
reg_hdr_dat_mosi : IN t_mem_mosi := c_mem_mosi_rst;
 
reg_hdr_dat_miso : OUT t_mem_miso;
 
 
reg_dp_xonoff_mosi : IN t_mem_mosi := c_mem_mosi_rst;
 
reg_dp_xonoff_miso : OUT t_mem_miso;
 
 
in_sosi : IN t_dp_sosi;
 
out_sosi : OUT t_dp_sosi;
 
src_in : IN t_dp_siso;
 
 
sdp_info : IN t_sdp_info;
 
gn_id : IN STD_LOGIC_VECTOR(4 DOWNTO 0);
 
 
eth_src_mac : IN STD_LOGIC_VECTOR(47 DOWNTO 0);
 
ip_src_addr : IN STD_LOGIC_VECTOR(31 DOWNTO 0);
 
udp_src_port : IN STD_LOGIC_VECTOR(15 DOWNTO 0);
 
 
hdr_fields_out : OUT STD_LOGIC_VECTOR(1023 DOWNTO 0)
 
);
 
END sdp_beamformer_output;
 
 
 
ARCHITECTURE str OF sdp_beamformer_output IS
 
 
CONSTANT c_data_w : NATURAL := c_nof_complex*c_sdp_W_beamlet; --16b
 
CONSTANT c_marker : STD_LOGIC_VECTOR := x"62";
 
CONSTANT c_version : NATURAL := 5;
 
CONSTANT c_nof_blocks_per_packet : NATURAL := 4;
 
CONSTANT c_nof_beamlets_per_block : NATURAL := c_sdp_N_pol * c_sdp_S_sub_bf;
 
CONSTANT c_beamlet_id : NATURAL := g_beamset_id * c_sdp_S_sub_bf;
 
CONSTANT c_fifo_fill : NATURAL := c_nof_blocks_per_packet * c_nof_beamlets_per_block / 4; -- 4 beamlets fit in 1 64bit longword
 
CONSTANT c_fifo_size : NATURAL := c_fifo_fill + 11; -- Make fifo size large enough for adding header.
 
 
SIGNAL snk_in_concat : t_dp_sosi;
 
SIGNAL dp_packet_merge_src_out : t_dp_sosi;
 
SIGNAL dp_repack_data_src_out : t_dp_sosi;
 
SIGNAL dp_fifo_sc_src_out : t_dp_sosi;
 
SIGNAL dp_fifo_sc_src_in : t_dp_siso;
 
SIGNAL dp_offload_tx_src_out : t_dp_sosi;
 
SIGNAL dp_offload_tx_src_in : t_dp_siso;
 
SIGNAL ip_checksum_src_out : t_dp_sosi;
 
SIGNAL ip_checksum_src_in : t_dp_siso;
 
 
SIGNAL common_fifo_rd_req : STD_LOGIC;
 
SIGNAL payload_err : STD_LOGIC_VECTOR(0 DOWNTO 0);
 
 
SIGNAL dp_offload_tx_hdr_fields : STD_LOGIC_VECTOR(1023 DOWNTO 0);
 
 
-------------------------------------------------------------------------------
 
-- dp_offload_tx
 
-------------------------------------------------------------------------------
 
CONSTANT c_nof_hdr_fields : NATURAL := 3+12+4+18+1; -- 592b; 9.25 64b words
 
CONSTANT c_hdr_field_sel : STD_LOGIC_VECTOR(c_nof_hdr_fields-1 DOWNTO 0) := "101"&"111111111001"&"0111"&"110000000010001110"&"0";
 
 
CONSTANT c_hdr_field_arr : t_common_field_arr(c_nof_hdr_fields-1 DOWNTO 0) := ( ( field_name_pad("eth_dst_mac" ), "RW", 48, field_default(x"00074306C700") ), -- 00074306C700=DOP36-eth0
 
( field_name_pad("eth_src_mac" ), "RW", 48, field_default(0) ),
 
( field_name_pad("eth_type" ), "RO", 16, field_default(x"0800") ),
 
( field_name_pad("ip_version" ), "RO", 4, field_default(4) ),
 
( field_name_pad("ip_header_length" ), "RO", 4, field_default(5) ),
 
( field_name_pad("ip_services" ), "RO", 8, field_default(0) ),
 
( field_name_pad("ip_total_length" ), "RO", 16, field_default(7868) ),
 
( field_name_pad("ip_identification" ), "RO", 16, field_default(0) ),
 
( field_name_pad("ip_flags" ), "RO", 3, field_default(2) ),
 
( field_name_pad("ip_fragment_offset" ), "RO", 13, field_default(0) ),
 
( field_name_pad("ip_time_to_live" ), "RO", 8, field_default(127) ),
 
( field_name_pad("ip_protocol" ), "RO", 8, field_default(17) ),
 
( field_name_pad("ip_header_checksum" ), "RW", 16, field_default(0) ),
 
( field_name_pad("ip_src_addr" ), "RW", 32, field_default(0) ),
 
( field_name_pad("ip_dst_addr" ), "RW", 32, field_default(x"C0A80001") ), -- C0A80001=DOP36-eth0 '192.168.0.1'
 
( field_name_pad("udp_src_port" ), "RW", 16, field_default(0) ),
 
( field_name_pad("udp_dst_port" ), "RW", 16, field_default(0) ),
 
( field_name_pad("udp_total_length" ), "RO", 16, field_default(7848) ),
 
( field_name_pad("udp_checksum" ), "RO", 16, field_default(0) ),
 
( field_name_pad("sdp_marker" ), "RO", 8, field_default(c_marker) ),
 
( field_name_pad("sdp_version_id" ), "RO", 8, field_default(c_version) ),
 
( field_name_pad("sdp_observation_id" ), "RW", 32, field_default(0) ),
 
( field_name_pad("sdp_station_id" ), "RW", 16, field_default(0) ),
 
( field_name_pad("sdp_source_info_antenna_band_id" ), "RW", 1, field_default(0) ),
 
( field_name_pad("sdp_source_info_nyquist_zone_id" ), "RW", 2, field_default(0) ),
 
( field_name_pad("sdp_source_info_f_adc" ), "RW", 1, field_default(0) ),
 
( field_name_pad("sdp_source_info_fsub_type" ), "RW", 1, field_default(0) ),
 
( field_name_pad("sdp_source_info_payload_error" ), "RW", 1, field_default(0) ),
 
( field_name_pad("sdp_source_info_repositioning_flag" ), "RW", 1, field_default(0) ),
 
( field_name_pad("sdp_source_info_beamlet_width" ), "RO", 4, field_default(c_sdp_W_beamlet) ),
 
( field_name_pad("sdp_source_info_gn_id" ), "RW", 5, field_default(0) ),
 
( field_name_pad("sdp_reserved" ), "RW", 40, field_default(0) ),
 
( field_name_pad("sdp_beamlet_scale" ), "RW", 16, field_default(2**15) ),
 
( field_name_pad("sdp_beamlet_id" ), "RO", 16, field_default(c_beamlet_id) ),
 
( field_name_pad("sdp_nof_blocks_per_packet" ), "RO", 8, field_default(c_nof_blocks_per_packet) ),
 
( field_name_pad("sdp_nof_beamlets_per_block" ), "RO", 16, field_default(c_nof_beamlets_per_block) ),
 
( field_name_pad("sdp_block_period" ), "RW", 16, field_default(5120) ),
 
( field_name_pad("dp_bsn" ), "RW", 64, field_default(0) ) );
 
 
BEGIN
 
 
-------------------------------------------------------------------------------
 
-- Input rewiring: concatenate input complex fields to data field
 
-- . dp_repack_data works with data fields only
 
-------------------------------------------------------------------------------
 
p_snk_in_arr : PROCESS(in_sosi)
 
BEGIN
 
snk_in_concat <= in_sosi;
 
snk_in_concat.data(c_data_w-1 DOWNTO 0) <= in_sosi.im(c_sdp_W_beamlet-1 DOWNTO 0) & in_sosi.re(c_sdp_W_beamlet-1 DOWNTO 0);
 
END PROCESS;
 
 
-------------------------------------------------------------------------------
 
-- dp_repack_data
 
-- . 16b -> 64b
 
-- . We don't need to flow control the source beacause we're going from 16b->64b
 
-------------------------------------------------------------------------------
 
u_dp_repack_data : ENTITY dp_lib.dp_repack_data
 
GENERIC MAP (
 
g_in_dat_w => c_data_w,
 
g_in_nof_words => 4,
 
g_out_dat_w => c_longword_w,
 
g_out_nof_words => 1
 
)
 
PORT MAP (
 
clk => dp_clk,
 
rst => dp_rst,
 
 
snk_in => snk_in_concat,
 
snk_out => OPEN,
 
 
src_out => dp_repack_data_src_out,
 
src_in => c_dp_siso_rdy
 
);
 
 
-------------------------------------------------------------------------------
 
-- dp_packet_merge
 
-------------------------------------------------------------------------------
 
u_dp_packet_merge : ENTITY dp_lib.dp_packet_merge
 
GENERIC MAP(
 
g_nof_pkt => c_nof_blocks_per_packet
 
)
 
PORT MAP(
 
rst => dp_rst,
 
clk => dp_clk,
 
 
snk_out => OPEN,
 
snk_in => dp_repack_data_src_out,
 
 
src_in => c_dp_siso_rdy,
 
src_out => dp_packet_merge_src_out
 
);
 
 
-------------------------------------------------------------------------------
 
-- FIFO
 
-- . We're inserting headers, so dp_offload_tx needs a flow controllable
 
-- source.
 
-- . Also, we need a fill FIFO here because 16b->64b will introduce gaps in our
 
-- TX stream (not allowed by 10G TX MAC).
 
-------------------------------------------------------------------------------
 
u_dp_fifo_fill_sc : ENTITY dp_lib.dp_fifo_fill_sc
 
GENERIC MAP (
 
g_data_w => c_longword_w,
 
g_empty_w => c_byte_w,
 
g_use_empty => TRUE,
 
g_use_bsn => TRUE,
 
g_bsn_w => 64,
 
g_use_sync => TRUE,
 
g_fifo_size => c_fifo_size,
 
g_fifo_fill => c_fifo_fill
 
)
 
PORT MAP (
 
clk => dp_clk,
 
rst => dp_rst,
 
 
snk_in => dp_packet_merge_src_out,
 
 
src_out => dp_fifo_sc_src_out,
 
src_in => dp_fifo_sc_src_in
 
);
 
 
-- Simple fifo to store the payload error at eop.
 
common_fifo_rd_req <= dp_fifo_sc_src_out.sop AND dp_fifo_sc_src_out.valid;
 
u_common_fifo_sc : ENTITY common_lib.common_fifo_sc
 
GENERIC MAP (
 
g_dat_w => 1,
 
g_nof_words => 2
 
)
 
PORT MAP (
 
rst => dp_rst,
 
clk => dp_clk,
 
wr_dat => dp_packet_merge_src_out.err(0 DOWNTO 0),
 
wr_req => dp_packet_merge_src_out.eop,
 
rd_dat => payload_err,
 
rd_req => common_fifo_rd_req
 
);
 
 
-------------------------------------------------------------------------------
 
-- Assemble offload info
 
-------------------------------------------------------------------------------
 
dp_offload_tx_hdr_fields(field_hi(c_hdr_field_arr, "eth_src_mac" ) DOWNTO field_lo(c_hdr_field_arr, "eth_src_mac" )) <= eth_src_mac;
 
dp_offload_tx_hdr_fields(field_hi(c_hdr_field_arr, "udp_src_port") DOWNTO field_lo(c_hdr_field_arr, "udp_src_port")) <= udp_src_port;
 
dp_offload_tx_hdr_fields(field_hi(c_hdr_field_arr, "ip_src_addr" ) DOWNTO field_lo(c_hdr_field_arr, "ip_src_addr" )) <= ip_src_addr;
 
 
dp_offload_tx_hdr_fields(field_hi(c_hdr_field_arr, "sdp_observation_id" ) DOWNTO field_lo(c_hdr_field_arr, "sdp_observation_id" )) <= sdp_info.observation_id;
 
dp_offload_tx_hdr_fields(field_hi(c_hdr_field_arr, "sdp_station_id" ) DOWNTO field_lo(c_hdr_field_arr, "sdp_station_id" )) <= sdp_info.station_id;
 
dp_offload_tx_hdr_fields(field_hi(c_hdr_field_arr, "sdp_source_info_antenna_band_id" ) DOWNTO field_lo(c_hdr_field_arr, "sdp_source_info_antenna_band_id" )) <= SLV(sdp_info.antenna_band_index);
 
dp_offload_tx_hdr_fields(field_hi(c_hdr_field_arr, "sdp_source_info_nyquist_zone_id" ) DOWNTO field_lo(c_hdr_field_arr, "sdp_source_info_nyquist_zone_id" )) <= sdp_info.nyquist_zone_index;
 
dp_offload_tx_hdr_fields(field_hi(c_hdr_field_arr, "sdp_source_info_f_adc" ) DOWNTO field_lo(c_hdr_field_arr, "sdp_source_info_f_adc" )) <= SLV(sdp_info.f_adc);
 
dp_offload_tx_hdr_fields(field_hi(c_hdr_field_arr, "sdp_source_info_fsub_type" ) DOWNTO field_lo(c_hdr_field_arr, "sdp_source_info_fsub_type" )) <= SLV(sdp_info.fsub_type);
 
dp_offload_tx_hdr_fields(field_hi(c_hdr_field_arr, "sdp_source_info_payload_error" ) DOWNTO field_lo(c_hdr_field_arr, "sdp_source_info_payload_error" )) <= payload_err;
 
dp_offload_tx_hdr_fields(field_hi(c_hdr_field_arr, "sdp_source_info_repositioning_flag" ) DOWNTO field_lo(c_hdr_field_arr, "sdp_source_info_repositioning_flag" )) <= SLV(sdp_info.beam_repositioning_flag);
 
dp_offload_tx_hdr_fields(field_hi(c_hdr_field_arr, "sdp_source_info_gn_id" ) DOWNTO field_lo(c_hdr_field_arr, "sdp_source_info_gn_id" )) <= gn_id;
 
dp_offload_tx_hdr_fields(field_hi(c_hdr_field_arr, "sdp_reserved" ) DOWNTO field_lo(c_hdr_field_arr, "sdp_reserved" )) <= (OTHERS => '0');
 
dp_offload_tx_hdr_fields(field_hi(c_hdr_field_arr, "sdp_beamlet_scale" ) DOWNTO field_lo(c_hdr_field_arr, "sdp_beamlet_scale" )) <= sdp_info.beamlet_scale;
 
dp_offload_tx_hdr_fields(field_hi(c_hdr_field_arr, "sdp_block_period" ) DOWNTO field_lo(c_hdr_field_arr, "sdp_block_period" )) <= sdp_info.block_period;
 
 
dp_offload_tx_hdr_fields(field_hi(c_hdr_field_arr, "dp_bsn" ) DOWNTO field_lo(c_hdr_field_arr, "dp_bsn" )) <= dp_fifo_sc_src_out.bsn(63 DOWNTO 0);
 
 
 
-------------------------------------------------------------------------------
 
-- dp_offload_tx_v3
 
-------------------------------------------------------------------------------
 
u_dp_offload_tx_v3 : ENTITY dp_lib.dp_offload_tx_v3
 
GENERIC MAP (
 
g_nof_streams => 1,
 
g_data_w => c_longword_w,
 
g_symbol_w => c_byte_w,
 
g_hdr_field_arr => c_hdr_field_arr,
 
g_hdr_field_sel => c_hdr_field_sel
 
)
 
PORT MAP (
 
mm_rst => mm_rst,
 
mm_clk => mm_clk,
 
 
dp_rst => dp_rst,
 
dp_clk => dp_clk,
 
 
reg_hdr_dat_mosi => reg_hdr_dat_mosi,
 
reg_hdr_dat_miso => reg_hdr_dat_miso,
 
 
snk_in_arr(0) => dp_fifo_sc_src_out,
 
snk_out_arr(0) => dp_fifo_sc_src_in,
 
 
src_out_arr(0) => dp_offload_tx_src_out,
 
src_in_arr(0) => dp_offload_tx_src_in,
 
 
hdr_fields_in_arr(0) => dp_offload_tx_hdr_fields,
 
hdr_fields_out_arr(0) => hdr_fields_out
 
);
 
 
-------------------------------------------------------------------------------
 
-- tr_10GbE_ip_checksum
 
-------------------------------------------------------------------------------
 
u_tr_10GbE_ip_checksum : ENTITY tr_10GbE_lib.tr_10GbE_ip_checksum
 
PORT MAP (
 
rst => dp_rst,
 
clk => dp_clk,
 
 
snk_in => dp_offload_tx_src_out,
 
snk_out => dp_offload_tx_src_in,
 
 
src_out => ip_checksum_src_out,
 
src_in => ip_checksum_src_in
 
);
 
 
-------------------------------------------------------------------------------
 
-- mms_dp_xonoff
 
-------------------------------------------------------------------------------
 
u_mms_dp_xonoff : ENTITY dp_lib.mms_dp_xonoff
 
GENERIC MAP(
 
g_default_value => '0'
 
)
 
PORT MAP(
 
-- Memory-mapped clock domain
 
mm_rst => mm_rst,
 
mm_clk => mm_clk,
 
 
reg_mosi => reg_dp_xonoff_mosi,
 
reg_miso => reg_dp_xonoff_miso,
 
 
-- Streaming clock domain
 
dp_rst => dp_rst,
 
dp_clk => dp_clk,
 
 
-- ST sinks
 
snk_out_arr(0) => ip_checksum_src_in,
 
snk_in_arr(0) => ip_checksum_src_out,
 
-- ST source
 
src_in_arr(0) => src_in,
 
src_out_arr(0) => out_sosi
 
);
 
 
END str;
Loading