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

Add g_use_transpose reorder functionality.

parent 34745bfd
No related branches found
No related tags found
1 merge request!348Use use_bdo_transpose = true in c_bf revision. Test use_bdo_transpose = false...
Pipeline #55914 passed
......@@ -30,7 +30,7 @@
--
-------------------------------------------------------------------------------
library IEEE, common_lib, dp_lib, tr_10GbE_lib;
library IEEE, common_lib, dp_lib, reorder_lib, tr_10GbE_lib;
use IEEE.std_logic_1164.all;
use IEEE.numeric_std.all;
use common_lib.common_pkg.all;
......@@ -38,11 +38,13 @@ use common_lib.common_field_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 reorder_lib.reorder_pkg.all;
use work.sdp_pkg.all;
entity sdp_beamformer_output is
generic (
g_beamset_id : natural := 0
g_beamset_id : natural := 0;
g_use_transpose : boolean := false
);
port (
dp_clk : in std_logic;
......@@ -88,9 +90,29 @@ architecture str of sdp_beamformer_output is
constant c_fifo_fill : natural := c_sdp_cep_payload_nof_longwords; -- 976
constant c_fifo_size : natural := true_log_pow2(c_sdp_cep_payload_nof_longwords) * c_sdp_N_beamsets; -- 2048
-- Reorder c_nof_ch = c_nof_ch_sel = c_nof_ch_in
constant c_nof_ch : natural := c_sdp_S_sub_bf * c_sdp_cep_nof_blocks_per_packet;
-- Dynamic reorder block size control input
-- . The input packet has nof_ch = nof_data_per_block * nof_blocks_per_packet
-- of data per packet.
-- . The transposed output packet will have blocks with nof_blocks_per_packet
-- data per block and nof_data_per_block blocks per packet.
signal nof_ch : natural := c_nof_ch;
signal nof_data_per_block : natural := c_sdp_S_sub_bf;
signal nof_blocks_per_packet : natural := c_sdp_cep_nof_blocks_per_packet;
signal select_copi : t_mem_copi := c_mem_copi_rst;
signal select_cipo : t_mem_cipo := c_mem_cipo_rst;
signal r_identity : t_reorder_identity;
signal d_identity : t_reorder_identity;
signal r_transpose : t_reorder_transpose;
signal d_transpose : t_reorder_transpose;
signal snk_in_concat : t_dp_sosi;
signal dp_repack_beamlet_src_out : t_dp_sosi;
signal dp_packet_merge_src_out : t_dp_sosi;
signal dp_packet_reorder_src_out : t_dp_sosi;
signal reorder_busy : std_logic;
signal dp_repack_longword_src_out : t_dp_sosi;
signal dp_fifo_fill_eop_src_out : t_dp_sosi;
signal dp_fifo_fill_eop_src_in : t_dp_siso;
......@@ -197,6 +219,92 @@ begin
src_out => dp_packet_merge_src_out
);
-------------------------------------------------------------------------------
-- reorder_col_select
-- . Reorder beamlet data from:
-- int8[t] [N_blocks_per_packet][S_sub_bf] [N_pol_bf][N_complex]
-- to:
-- int8[t] [S_sub_bf][N_blocks_per_packet] [N_pol_bf][N_complex]
--
-- See tb_reorder_col_select_all.vhd for how to control col_select_copi/cipo.
-------------------------------------------------------------------------------
u_reorder_col_select : entity reorder_lib.reorder_col_select
generic map (
g_dsp_data_w => c_sdp_W_dual_pol_beamlet, -- = 32b
g_nof_ch_in => c_nof_ch,
g_nof_ch_sel => c_nof_ch,
g_use_complex => false
)
port map (
dp_rst => dp_rst,
dp_clk => dp_clk,
reorder_busy => reorder_busy,
-- Dynamic reorder block size control input
nof_ch_in => nof_ch,
nof_ch_sel => nof_ch,
-- Captured reorder block size control used for output_sosi
output_nof_ch_in => open,
output_nof_ch_sel => open,
-- Memory Mapped
col_select_mosi => select_copi,
col_select_miso => select_cipo,
-- Streaming
input_sosi => dp_packet_merge_src_out,
output_sosi => dp_packet_reorder_src_out
);
-- Use synchronous reset in d signals
p_dp_clk_synchronous : process(dp_clk)
begin
if rising_edge(dp_clk) then
r_identity <= d_identity;
r_transpose <= d_transpose;
end if;
end process;
-- 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;
p_reorder_identity : process(dp_rst, select_cipo, nof_ch, r_identity)
variable v : t_reorder_identity;
begin
if select_cipo.waitrequest = '0' then
-- Read from reorder_col_select page
v := func_reorder_identity(nof_ch, r_identity);
else
-- No read, new reorder_col_select page not available yet
v := c_reorder_identity_rst;
end if;
-- Synchronous reset
if dp_rst = '1' then
v := c_reorder_identity_rst;
end if;
d_identity <= v;
end process;
p_reorder_transpose : process(dp_rst, select_cipo,
nof_data_per_block, nof_blocks_per_packet, r_transpose)
variable v : t_reorder_transpose;
begin
if select_cipo.waitrequest = '0' then
-- Read from reorder_col_select page
v := func_reorder_transpose(nof_data_per_block, nof_blocks_per_packet, r_transpose);
else
-- No read, new reorder_col_select page not available yet
v := c_reorder_transpose_rst;
end if;
-- Synchronous reset
if dp_rst = '1' then
v := c_reorder_transpose_rst;
end if;
d_transpose <= v;
end process;
-------------------------------------------------------------------------------
-- dp_repack_data
-- . Repack 32b -> 64b, to get 64b longwords for network packet data
......@@ -213,7 +321,7 @@ begin
clk => dp_clk,
rst => dp_rst,
snk_in => dp_packet_merge_src_out,
snk_in => dp_packet_reorder_src_out,
snk_out => OPEN,
src_out => dp_repack_longword_src_out,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment