diff --git a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_pkg.vhd b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_pkg.vhd index b2160e3ac4fc414a0bf0f0b4698365b583de9701..512e44428bfef575e28ad1f8289af9f5250cb426 100644 --- a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_pkg.vhd +++ b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_pkg.vhd @@ -148,6 +148,17 @@ package tb_sdp_pkg is function func_sdp_undo_transpose_beamlet_packet(packet_list : t_sdp_beamlet_packet_list) return t_sdp_beamlet_packet_list; -- Read beamlet packet octets per re and im parts + procedure proc_sdp_rx_beamlet_octets( + constant c_nof_blocks_per_packet : in natural; + signal clk : in std_logic; + signal rx_beamlet_sosi : in t_dp_sosi; + signal rx_beamlet_cnt : inout natural; + signal rx_beamlet_valid : out std_logic; + signal rx_beamlet_arr_re : out t_sdp_beamlet_part_arr; + signal rx_beamlet_arr_im : out t_sdp_beamlet_part_arr; + signal rx_packet_list_re : out t_slv_8_arr; + signal rx_packet_list_im : out t_slv_8_arr); + procedure proc_sdp_rx_beamlet_octets( signal clk : in std_logic; signal rx_beamlet_sosi : in t_dp_sosi; @@ -628,21 +639,25 @@ package body tb_sdp_pkg is -- . Beamlets array is stored big endian in the data, so X.real index 0 first -- in MSByte of rx_beamlet_sosi.data. procedure proc_sdp_rx_beamlet_octets( - signal clk : in std_logic; - signal rx_beamlet_sosi : in t_dp_sosi; - signal rx_beamlet_cnt : inout natural; - signal rx_beamlet_valid : out std_logic; - signal rx_beamlet_arr_re : out t_sdp_beamlet_part_arr; - signal rx_beamlet_arr_im : out t_sdp_beamlet_part_arr; - signal rx_packet_list_re : out t_sdp_beamlet_packet_list; - signal rx_packet_list_im : out t_sdp_beamlet_packet_list) is + constant c_nof_blocks_per_packet : in natural; + signal clk : in std_logic; + signal rx_beamlet_sosi : in t_dp_sosi; + signal rx_beamlet_cnt : inout natural; + signal rx_beamlet_valid : out std_logic; + signal rx_beamlet_arr_re : out t_sdp_beamlet_part_arr; -- [0:3] + signal rx_beamlet_arr_im : out t_sdp_beamlet_part_arr; -- [0:3] + signal rx_packet_list_re : out t_slv_8_arr; -- [0:c_list_len - 1] + signal rx_packet_list_im : out t_slv_8_arr) is + constant c_nof_beamlets_per_packet : natural := c_nof_blocks_per_packet * c_sdp_cep_nof_beamlets_per_block; + constant c_nof_longwords_per_packet : natural := c_nof_beamlets_per_packet / c_sdp_nof_beamlets_per_longword; + constant c_list_len : natural := c_nof_beamlets_per_packet * c_sdp_N_pol_bf; begin rx_beamlet_cnt <= 0; rx_beamlet_valid <= '0'; -- Wait until start of a beamlet packet proc_common_wait_until_high(clk, rx_beamlet_sosi.sop); -- c_sdp_nof_beamlets_per_longword = 2 dual pol beamlets (= XY, XY) per 64b data word - for I in 0 to (c_sdp_cep_nof_beamlets_per_packet / c_sdp_nof_beamlets_per_longword) - 1 loop + for I in 0 to c_nof_longwords_per_packet - 1 loop proc_common_wait_until_high(clk, rx_beamlet_sosi.valid); rx_beamlet_valid <= '1'; -- Capture rx beamlets per longword in rx_beamlet_arr, for time series view in Wave window @@ -669,8 +684,29 @@ package body tb_sdp_pkg is -- contains no WAIT statement. wait until rising_edge(clk); rx_beamlet_valid <= '0'; - rx_beamlet_cnt <= (rx_beamlet_cnt + c_sdp_nof_beamlets_per_longword) mod c_sdp_cep_nof_beamlets_per_block; -- 4 blocks/packet + rx_beamlet_cnt <= (rx_beamlet_cnt + c_sdp_nof_beamlets_per_longword) mod c_sdp_cep_nof_beamlets_per_block; end loop; end proc_sdp_rx_beamlet_octets; + procedure proc_sdp_rx_beamlet_octets( + signal clk : in std_logic; + signal rx_beamlet_sosi : in t_dp_sosi; + signal rx_beamlet_cnt : inout natural; + signal rx_beamlet_valid : out std_logic; + signal rx_beamlet_arr_re : out t_sdp_beamlet_part_arr; + signal rx_beamlet_arr_im : out t_sdp_beamlet_part_arr; + signal rx_packet_list_re : out t_sdp_beamlet_packet_list; + signal rx_packet_list_im : out t_sdp_beamlet_packet_list) is + begin + proc_sdp_rx_beamlet_octets( + c_sdp_cep_nof_blocks_per_packet, -- 4 blocks/packet + clk, + rx_beamlet_sosi, + rx_beamlet_cnt, + rx_beamlet_valid , + rx_beamlet_arr_re, + rx_beamlet_arr_im, + rx_packet_list_re, + rx_packet_list_im); + end proc_sdp_rx_beamlet_octets; end tb_sdp_pkg;