diff --git a/applications/arts/designs/arts_unb1_sc1_3dish_1pol/src/vhdl/arts_unb1_sc1_3dish_1pol.vhd b/applications/arts/designs/arts_unb1_sc1_3dish_1pol/src/vhdl/arts_unb1_sc1_3dish_1pol.vhd index 9d6ee26936ae6f3def69fe4275fa2c25d51abe8b..9467175b13b7eeb75cbf2338d387850bd3b907a7 100644 --- a/applications/arts/designs/arts_unb1_sc1_3dish_1pol/src/vhdl/arts_unb1_sc1_3dish_1pol.vhd +++ b/applications/arts/designs/arts_unb1_sc1_3dish_1pol/src/vhdl/arts_unb1_sc1_3dish_1pol.vhd @@ -95,8 +95,10 @@ ARCHITECTURE str OF arts_unb1_sc1_3dish_1pol IS ------------------------------------------------------------------------------- -- ARTS SC1 ------------------------------------------------------------------------------- - CONSTANT c_channel_compl_dat_w : NATURAL := 8; - CONSTANT c_channel_dat_w : NATURAL := 2*c_channel_compl_dat_w; + CONSTANT c_channel_compl_dat_w : NATURAL := 8; + CONSTANT c_channel_dat_w : NATURAL := 2*c_channel_compl_dat_w; + CONSTANT c_nof_apertif_bf_units : NATURAL := 4; -- 4 bf_units per Apertif FN + CONSTANT c_nof_beamlets : NATURAL := 88; --88 beamlets per node, 704 in total ------------------------------------------------------------------------------- -- 10GbE input stage @@ -150,17 +152,21 @@ ARCHITECTURE str OF arts_unb1_sc1_3dish_1pol IS SIGNAL dp_bsn_align_src_out_arr : t_dp_sosi_arr(c_nof_10GbE_streams-1 DOWNTO 0); ------------------------------------------------------------------------------- - -- DP split, Repack + -- Beamlet selection ------------------------------------------------------------------------------- - CONSTANT c_nof_sc1_symbols : NATURAL := 24; + CONSTANT c_nof_sc1_symbols : NATURAL := 24; - SIGNAL dp_split_src_in_2arr_2 : t_dp_siso_2arr_2(c_nof_10GbE_streams-1 DOWNTO 0); - SIGNAL dp_split_src_out_2arr_2 : t_dp_sosi_2arr_2(c_nof_10GbE_streams-1 DOWNTO 0); - SIGNAL dp_split_src_in_arr : t_dp_siso_arr(c_nof_10GbE_streams-1 DOWNTO 0) := (OTHERS=> c_dp_siso_rdy); - SIGNAL dp_split_src_out_arr : t_dp_sosi_arr(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL dp_deinterleave_snk_in_arr : t_dp_sosi_arr(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL dp_deinterleave_src_out_2arr_2 : t_dp_sosi_2arr_2(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL dp_deinterleave_src_out_arr : t_dp_sosi_arr(c_nof_10GbE_streams-1 DOWNTO 0); - SIGNAL dp_repack_data_src_in_arr : t_dp_siso_arr(c_nof_10GbE_streams-1 DOWNTO 0) := (OTHERS=> c_dp_siso_rdy); - SIGNAL dp_repack_data_src_out_arr : t_dp_sosi_arr(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL dp_fifo_sc_src_out_arr : t_dp_sosi_arr(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL dp_fifo_sc_src_in_arr : t_dp_siso_arr(c_nof_10GbE_streams-1 DOWNTO 0); + + SIGNAL dp_split_src_in_2arr_2 : t_dp_siso_2arr_2(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL dp_split_src_out_2arr_2 : t_dp_sosi_2arr_2(c_nof_10GbE_streams-1 DOWNTO 0); + SIGNAL dp_split_src_in_arr : t_dp_siso_arr(c_nof_10GbE_streams-1 DOWNTO 0) := (OTHERS=> c_dp_siso_rdy); + SIGNAL dp_split_src_out_arr : t_dp_sosi_arr(c_nof_10GbE_streams-1 DOWNTO 0); ------------------------------------------------------------------------------- -- BF Unit @@ -448,24 +454,96 @@ BEGIN src_out_arr => dp_bsn_align_src_out_arr ); + gen_bsn_align_src_in_arr: FOR i IN 0 TO c_nof_10GbE_streams-1 GENERATE + dp_bsn_align_src_in_arr(i) <= c_dp_siso_rdy; + END GENERATE; + + ------------------------------------------------------------------------------- + -- 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 (Selected) + -- . BF Stream 1 ) 256,257 , .. 431 (discarded) + -- . BF Stream 2 ) 512,513 , .. 687 (discarded) + -- . BF Stream 3 ) 768,769 , .. 943 (discarded) + ------------------------------------------------------------------------------- + gen_dp_stream_deconcat : FOR i IN 0 TO c_nof_10GbE_streams-1 GENERATE + dp_deinterleave_snk_in_arr(i) <= func_dp_stream_deconcat(dp_bsn_align_src_out_arr(i), c_nof_apertif_bf_units, c_channel_dat_w)(0); --Only use bf_unit stream 0 + END GENERATE; + + ------------------------------------------------------------------------------- + -- Deinterleave 3 streams into 3*2 streams + ------------------------------------------------------------------------------- + gen_deinterleave : FOR i IN 0 TO c_nof_10GbE_streams-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_arr(i), + src_out_arr => dp_deinterleave_src_out_2arr_2(i) + ); + END GENERATE; + + ------------------------------------------------------------------------------- + -- Rewire 3*2 streams into 3 streams (discard odd beamlets) + ------------------------------------------------------------------------------- + gen_rewire : FOR i IN 0 TO c_nof_10GbE_streams-1 GENERATE + dp_deinterleave_src_out_arr(i) <= dp_deinterleave_src_out_2arr_2(i)(0); -- Beamlet 0, 2, 4, .. 174 + -- dp_deinterleave_src_out_2arr_2(i)(1); -- Beamlet 1, 3, 5, .. 175 + END GENERATE; + + ------------------------------------------------------------------------------- + -- bf_unit needs flow control + ------------------------------------------------------------------------------- + gen_dp_fifo_sc: FOR i IN 0 TO c_nof_10GbE_streams-1 GENERATE + u_dp_fifo_sc : ENTITY dp_lib.dp_fifo_sc + GENERIC MAP( + g_data_w => c_channel_dat_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 => dp_deinterleave_src_out_arr(i), + + src_in => dp_fifo_sc_src_in_arr(i), + src_out => dp_fifo_sc_src_out_arr(i) + ); + END GENERATE; + ------------------------------------------------------------------------------- - -- Forward only the first 24 64b words - -- . This will forward 4 sets (bf_units) of 24 beamlets. We'll discard - -- substreams 1..3 later and only use substream 0 (beamlets 0..23). + -- Forward only the first 24 beamlets: 0,2,4, .. 46. ------------------------------------------------------------------------------- gen_dp_split: FOR i IN 0 TO c_nof_10GbE_streams-1 GENERATE u_dp_split : ENTITY dp_lib.dp_split GENERIC MAP ( - g_data_w => c_xgmii_data_w, - g_symbol_w => c_xgmii_data_w, + g_data_w => c_channel_dat_w, + g_symbol_w => c_channel_dat_w, g_nof_symbols => c_nof_sc1_symbols ) PORT MAP ( rst => dp_rst, clk => dp_clk, - snk_out => dp_bsn_align_src_in_arr(i), - snk_in => dp_bsn_align_src_out_arr(i), + snk_in => dp_fifo_sc_src_out_arr(i), + snk_out => dp_fifo_sc_src_in_arr(i), src_in_arr => dp_split_src_in_2arr_2(i), src_out_arr => dp_split_src_out_2arr_2(i)