Skip to content
Snippets Groups Projects
Commit 52c6385d authored by Eric Kooistra's avatar Eric Kooistra
Browse files

Add u_sdp_bdo_destinations_reg and u_dp_packet_unmerge.

parent 55939317
No related branches found
No related tags found
1 merge request!357Move func_sdp_bdo_cep_hdr_field_sel_dest() from sdp_bdo_pkg to...
...@@ -22,7 +22,8 @@ ...@@ -22,7 +22,8 @@
-- Purpose: -- Purpose:
-- Construct beamformer data output (BDO) payloads for multiple destinations. -- Construct beamformer data output (BDO) payloads for multiple destinations.
-- Description: -- Description:
-- Merge, reorder and unmerge beamlet data for N_destinations > 1 from: -- * Get N_destinations from sdp_bdo_destinations_reg.
-- * Merge, reorder and unmerge beamlet data for N_destinations > 1 from:
-- (int8) [t] [N_blocks_per_packet][S_sub_bf / N_destinations] [N_pol_bf][N_complex] -- (int8) [t] [N_blocks_per_packet][S_sub_bf / N_destinations] [N_pol_bf][N_complex]
-- to: -- to:
-- (int8) [t] [S_sub_bf / N_destinations][N_blocks_per_packet] [N_pol_bf][N_complex] -- (int8) [t] [S_sub_bf / N_destinations][N_blocks_per_packet] [N_pol_bf][N_complex]
...@@ -50,41 +51,75 @@ entity sdp_bdo_multiple_destinations is ...@@ -50,41 +51,75 @@ entity sdp_bdo_multiple_destinations is
g_use_transpose : boolean := false g_use_transpose : boolean := false
); );
port ( port (
mm_clk : in std_logic;
mm_rst : in std_logic;
dp_clk : in std_logic; dp_clk : in std_logic;
dp_rst : in std_logic; dp_rst : in std_logic;
reg_destinations_copi : in t_mem_copi;
reg_destinations_cipo : out t_mem_cipo;
destinations_info : out t_sdp_bdo_destinations_info;
snk_in : in t_dp_sosi; snk_in : in t_dp_sosi;
src_out : out t_dp_sosi src_out : out t_dp_sosi
); );
end sdp_bdo_multiple_destinations; end sdp_bdo_multiple_destinations;
architecture str of sdp_bdo_multiple_destinations is architecture str of sdp_bdo_multiple_destinations is
-- Reorder c_nof_ch = c_nof_ch_sel = c_nof_ch_in
constant c_nof_blocks_per_packet : natural := c_sdp_cep_nof_blocks_per_packet; -- = 4 constant c_nof_blocks_per_packet : natural := c_sdp_cep_nof_blocks_per_packet; -- = 4
constant c_nof_beamlets_per_block : natural := c_sdp_S_sub_bf; -- = 488 dual pol beamlets constant c_nof_beamlets_per_block : natural := c_sdp_S_sub_bf; -- = 488 dual pol beamlets
constant c_nof_words_per_beamlet : natural := 1; -- 1 dual pol beamlet data per 32b word constant c_nof_words_per_beamlet : natural := 1; -- 1 dual pol beamlet data per 32b word
constant c_nof_ch : natural := c_nof_blocks_per_packet * c_nof_beamlets_per_block * c_nof_words_per_beamlet; -- = 1952
-- Use c_transpose_indices and c_transpose_indices_inv for debug view in Objects window.
-- Use c_transpose_indices for func_reorder_transpose() in this sdp_bdo_multiple_destinations,
-- a tb can then use c_transpose_indices_inv to undo the transpose.
constant c_transpose_indices : t_natural_arr(0 to c_nof_ch - 1) :=
func_reorder_transpose_indices(c_nof_blocks_per_packet,
c_nof_beamlets_per_block,
c_nof_words_per_beamlet);
constant c_transpose_indices_inv : t_natural_arr(0 to c_nof_ch - 1) :=
func_reorder_transpose_indices(c_nof_beamlets_per_block,
c_nof_blocks_per_packet,
c_nof_words_per_beamlet);
-- Dynamic reorder block size control input -- Reorder c_nof_ch = c_nof_ch_sel = c_nof_ch_in
-- . The data consists of 1 word = 1 ch, because 1 word contains 1 dual pol beamlet. constant c_reorder_nof_blocks_max : natural := c_sdp_bdo_reorder_nof_blocks_max; -- = 16
-- . The input packet has nof_ch of data per packet. constant c_reorder_nof_blocks_w : natural := ceil_log2(c_reorder_nof_blocks_max + 1);
-- . The transposed output packet will have blocks with nof_blocks_per_packet constant c_reorder_nof_ch_max : natural := c_reorder_nof_blocks_max *
-- data per block and nof_beamlets_per_block blocks per packet. c_nof_beamlets_per_block *
signal nof_ch : natural := c_nof_ch; c_nof_words_per_beamlet; -- = 7808
signal nof_blocks_per_packet : natural := c_nof_blocks_per_packet;
signal nof_beamlets_per_block : natural := c_nof_beamlets_per_block; -- Look up table constants as function of N_destinations
constant c_m : natural := c_sdp_bdo_nof_destinations_max; -- 16
constant c_nof_blocks_per_packet_arr : t_natural_arr(1 to c_m) := func_sdp_bdo_nof_blocks_per_packet_look_up_table;
constant c_reorder_nof_blocks_arr : t_natural_arr(1 to c_m) := func_sdp_bdo_reorder_nof_blocks_look_up_table;
constant c_reorder_nof_ch_arr : t_natural_arr(1 to c_m) := func_sdp_bdo_reorder_nof_ch_look_up_table;
constant c_nof_beamlets_per_block_first_destination_arr : t_natural_arr(1 to c_m) := func_sdp_sdo_nof_beamlets_per_block_first_destination_look_up_table;
constant c_nof_beamlets_per_block_last_destination_arr : t_natural_arr(1 to c_m) := func_sdp_sdo_nof_beamlets_per_block_last_destination_look_up_table;
constant c_sdp_sdo_nof_ch_per_packet_first_destination_arr : t_natural_arr(1 to c_m) := func_sdp_sdo_nof_ch_per_packet_first_destination_look_up_table;
constant c_sdp_sdo_nof_ch_per_packet_last_destination_arr : t_natural_arr(1 to c_m) := func_sdp_sdo_nof_ch_per_packet_last_destination_look_up_table;
constant c_beamlet_index_per_destination_mat : t_natural_matrix(1 to c_m, 0 to c_m - 1) :=
func_sdp_sdo_beamlet_index_per_destination_look_up_matrix;
-- -- Use c_transpose_indices and c_transpose_indices_inv for debug view in Objects window.
-- -- Use c_transpose_indices for func_reorder_transpose() in this sdp_bdo_multiple_destinations,
-- -- a tb can then use c_transpose_indices_inv to undo the transpose.
-- constant c_transpose_indices : t_natural_arr(0 to c_nof_ch - 1) :=
-- func_reorder_transpose_indices(c_nof_blocks_per_packet,
-- c_nof_beamlets_per_block,
-- c_nof_words_per_beamlet);
-- constant c_transpose_indices_inv : t_natural_arr(0 to c_nof_ch - 1) :=
-- func_reorder_transpose_indices(c_nof_beamlets_per_block,
-- c_nof_blocks_per_packet,
-- c_nof_words_per_beamlet);
signal i_destinations_info : t_sdp_bdo_destinations_info;
-- Dynamic merge, reorder, unmerge packet sizes
-- . default use values for N_destinations = 1
signal nof_blocks_per_packet : natural := c_nof_blocks_per_packet_arr(1);
signal reorder_nof_blocks : natural := c_reorder_nof_blocks_arr(1);
signal reorder_nof_blocks_slv : std_logic_vector(c_reorder_nof_blocks_w - 1 downto 0);
signal reorder_nof_ch : natural := c_reorder_nof_ch_arr(1);
signal nof_beamlets_per_block_first_destination : natural := c_nof_beamlets_per_block_first_destination_arr(1);
signal nof_beamlets_per_block_last_destination : natural := c_nof_beamlets_per_block_last_destination_arr(1);
signal nof_beamlets_per_block : natural;
signal nof_ch_per_packet_first_destination : natural := c_sdp_sdo_nof_ch_per_packet_first_destination_arr(1);
signal nof_ch_per_packet_last_destination : natural := c_sdp_sdo_nof_ch_per_packet_last_destination_arr(1);
-- . default use values for N_destinations = 1 and destination index = 0
signal beamlet_index_per_destination : natural := c_beamlet_index_per_destination_mat(1, 0);
signal select_copi : t_mem_copi := c_mem_copi_rst; signal select_copi : t_mem_copi := c_mem_copi_rst;
signal select_cipo : t_mem_cipo := c_mem_cipo_rst; signal select_cipo : t_mem_cipo := c_mem_cipo_rst;
signal r_identity : t_reorder_identity; signal r_identity : t_reorder_identity;
...@@ -97,21 +132,74 @@ architecture str of sdp_bdo_multiple_destinations is ...@@ -97,21 +132,74 @@ architecture str of sdp_bdo_multiple_destinations is
signal reorder_src_out : t_dp_sosi; signal reorder_src_out : t_dp_sosi;
signal reorder_word : t_sdp_dual_pol_beamlet_in_word; signal reorder_word : t_sdp_dual_pol_beamlet_in_word;
signal reorder_busy : std_logic; signal reorder_busy : std_logic;
signal unmerge_src_out : t_dp_sosi;
signal unmerge_word : t_sdp_dual_pol_beamlet_in_word;
begin
src_out <= unmerge_src_out;
destinations_info <= i_destinations_info;
-----------------------------------------------------------------------------
-- Multiple destinations info register
-----------------------------------------------------------------------------
-- Use dynamic sizes for beamlet data output to multiple destination.
u_sdp_bdo_destinations_reg : entity work.sdp_bdo_destinations_reg
port map (
-- Clocks and reset
mm_clk => mm_clk,
mm_rst => mm_rst,
dp_clk => dp_clk,
dp_rst => dp_rst,
reg_copi => reg_destinations_copi,
reg_cipo => reg_destinations_cipo,
-- sdp info
destinations_info => i_destinations_info
);
-----------------------------------------------------------------------------
-- Multiple destinations info look up values
-----------------------------------------------------------------------------
-- Pipeline values from look up tables to ease timing closure
p_pipeline : process(dp_clk)
variable v_DN : natural; -- number of destinations
variable v_DI : natural; -- destination index
begin begin
src_out <= reorder_src_out; if rising_edge(dp_clk) then
v_DN := i_destinations_info.nof_destinations_act;
nof_blocks_per_packet <= i_destinations_info.nof_blocks_per_packet_act;
reorder_nof_blocks <= c_reorder_nof_blocks_arr(v_DN);
reorder_nof_ch <= c_reorder_nof_ch_arr(v_DN);
nof_beamlets_per_block_first_destination <= c_nof_beamlets_per_block_first_destination_arr(v_DN);
nof_beamlets_per_block_last_destination <= c_nof_beamlets_per_block_last_destination_arr(v_DN);
v_DI := 0;
beamlet_index_per_destination <= c_beamlet_index_per_destination_mat(v_DN, v_DI);
end if;
end process;
nof_beamlets_per_block <= nof_beamlets_per_block_first_destination;
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
-- dp_packet_merge -- dp_packet_merge
----------------------------------------------------------------------------- -----------------------------------------------------------------------------
-- Use slv in port map to avoid vcom-1436: Actual expression (function call
-- "TO_UVEC") of formal "nof_pkt" is not globally static.
reorder_nof_blocks_slv <= to_uvec(reorder_nof_blocks, c_reorder_nof_blocks_w);
u_dp_packet_merge : entity dp_lib.dp_packet_merge u_dp_packet_merge : entity dp_lib.dp_packet_merge
generic map( generic map(
g_use_ready => false, -- no flow control g_use_ready => false, -- no flow control
g_nof_pkt => c_nof_blocks_per_packet, g_nof_pkt => c_reorder_nof_blocks_max,
g_bsn_increment => 1 g_bsn_increment => 1
) )
port map( port map(
rst => dp_rst, rst => dp_rst,
clk => dp_clk, clk => dp_clk,
nof_pkt => reorder_nof_blocks_slv,
nof_pkt_out => open, -- Valid at src_out.sop
snk_in => snk_in, snk_in => snk_in,
src_out => merge_src_out src_out => merge_src_out
); );
...@@ -127,8 +215,8 @@ begin ...@@ -127,8 +215,8 @@ begin
u_reorder_col_select : entity reorder_lib.reorder_col_select u_reorder_col_select : entity reorder_lib.reorder_col_select
generic map ( generic map (
g_dsp_data_w => c_sdp_W_dual_pol_beamlet / c_nof_complex, -- = 32b / 2 g_dsp_data_w => c_sdp_W_dual_pol_beamlet / c_nof_complex, -- = 32b / 2
g_nof_ch_in => c_nof_ch, g_nof_ch_in => c_reorder_nof_ch_max,
g_nof_ch_sel => c_nof_ch, g_nof_ch_sel => c_reorder_nof_ch_max,
g_use_complex => false g_use_complex => false
) )
port map ( port map (
...@@ -138,8 +226,8 @@ begin ...@@ -138,8 +226,8 @@ begin
reorder_busy => reorder_busy, reorder_busy => reorder_busy,
-- Dynamic reorder block size control input -- Dynamic reorder block size control input
nof_ch_in => nof_ch, nof_ch_in => reorder_nof_ch,
nof_ch_sel => nof_ch, nof_ch_sel => reorder_nof_ch,
-- Captured reorder block size control used for output_sosi -- Captured reorder block size control used for output_sosi
output_nof_ch_in => open, output_nof_ch_in => open,
...@@ -169,12 +257,12 @@ begin ...@@ -169,12 +257,12 @@ begin
-- Pass on beamlet data in original order or in transposed order -- Pass on beamlet data in original order or in transposed order
select_copi <= r_transpose.select_copi when g_use_transpose else r_identity.select_copi; select_copi <= r_transpose.select_copi when g_use_transpose else r_identity.select_copi;
p_reorder_identity : process(dp_rst, select_cipo, nof_ch, r_identity) p_reorder_identity : process(dp_rst, select_cipo, reorder_nof_ch, r_identity)
variable v : t_reorder_identity; variable v : t_reorder_identity;
begin begin
if select_cipo.waitrequest = '0' then if select_cipo.waitrequest = '0' then
-- Read from reorder_col_select page -- Read from reorder_col_select page
v := func_reorder_identity(nof_ch, r_identity); v := func_reorder_identity(reorder_nof_ch, r_identity);
else else
-- No read, new reorder_col_select page not available yet -- No read, new reorder_col_select page not available yet
v := c_reorder_identity_rst; v := c_reorder_identity_rst;
...@@ -202,4 +290,29 @@ begin ...@@ -202,4 +290,29 @@ begin
end if; end if;
d_transpose <= v; d_transpose <= v;
end process; end process;
-----------------------------------------------------------------------------
-- dp_packet_unmerge for N_destinations
-----------------------------------------------------------------------------
u_dp_packet_unmerge : entity dp_lib.dp_packet_unmerge
generic map (
g_use_ready => false, -- no flow control
g_nof_pkt_max => c_reorder_nof_blocks_max,
g_pkt_len => 99, -- Length of the unmerged packets
g_bsn_increment => 1
)
port map (
rst => dp_rst,
clk => dp_clk,
snk_in => reorder_src_out,
src_out => unmerge_src_out
);
-- TODO:
-- . add dynamic pkt_len input port
-- . support unmerge of pkt_len and remaining last packet shorter than pkt_len.
-- Debug signals for view in Wave window
unmerge_word <= unpack_data(unmerge_src_out.data(c_sdp_W_dual_pol_beamlet - 1 downto 0));
end str; end str;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment