diff --git a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd index 675928d71b20adb802983c10a889f8e7f26ce3eb..4e578e7da26853edc548e0ea26fa1247d5e1d7dc 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd @@ -54,18 +54,16 @@ ENTITY node_sdp_correlator IS mm_rst : IN STD_LOGIC; mm_clk : IN STD_LOGIC; - reg_dp_bsn_sync_scheduler_mosi : IN t_mem_mosi := c_mem_mosi_rst; - reg_dp_bsn_sync_scheduler_miso : OUT t_mem_miso; - reg_crosslets_info_mosi : IN t_mem_mosi := c_mem_mosi_rst; - reg_crosslets_info_miso : OUT t_mem_miso; - reg_bsn_scheduler_xsub_mosi : IN t_mem_mosi := c_mem_mosi_rst; - reg_bsn_scheduler_xsub_miso : OUT t_mem_miso; - ram_st_xsq_mosi : IN t_mem_mosi := c_mem_mosi_rst; - ram_st_xsq_miso : OUT t_mem_miso; - reg_stat_enable_mosi : IN t_mem_mosi := c_mem_mosi_rst; - reg_stat_enable_miso : OUT t_mem_miso; - reg_stat_hdr_dat_mosi : IN t_mem_mosi := c_mem_mosi_rst; - reg_stat_hdr_dat_miso : OUT t_mem_miso; + reg_bsn_sync_scheduler_xsub_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_bsn_sync_scheduler_xsub_miso : OUT t_mem_miso; + reg_crosslets_info_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_crosslets_info_miso : OUT t_mem_miso; + ram_st_xsq_mosi : IN t_mem_mosi := c_mem_mosi_rst; + ram_st_xsq_miso : OUT t_mem_miso; + reg_stat_enable_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_stat_enable_miso : OUT t_mem_miso; + reg_stat_hdr_dat_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_stat_hdr_dat_miso : OUT t_mem_miso; sdp_info : IN t_sdp_info; gn_id : IN STD_LOGIC_VECTOR(c_sdp_W_gn_id-1 DOWNTO 0); @@ -89,16 +87,12 @@ ARCHITECTURE str OF node_sdp_correlator IS SIGNAL master_miso_arr : t_mem_miso_arr(0 TO c_nof_masters-1) := (OTHERS=>c_mem_miso_rst); SIGNAL quant_sosi_arr : t_dp_sosi_arr(c_sdp_P_pfb-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst); - SIGNAL dp_bsn_sync_scheduler_snk_in : t_dp_sosi := c_dp_sosi_rst; SIGNAL dp_bsn_sync_scheduler_src_out : t_dp_sosi := c_dp_sosi_rst; - SIGNAL xin_sosi_arr : t_dp_sosi_arr(c_sdp_P_pfb-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst); SIGNAL xsel_sosi : t_dp_sosi := c_dp_sosi_rst; SIGNAL crosslets_sosi_arr : t_dp_sosi_arr(g_P_sq-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst); SIGNAL crosslets_mosi_arr : t_mem_mosi_arr(g_P_sq-1 DOWNTO 0) := (OTHERS => c_mem_mosi_rst); SIGNAL crosslets_miso_arr : t_mem_miso_arr(g_P_sq-1 DOWNTO 0) := (OTHERS => c_mem_miso_rst); - - SIGNAL dp_bsn_sync_scheduler_out_start : STD_LOGIC; SIGNAL crosslets_info : STD_LOGIC_VECTOR(c_sdp_crosslets_info_reg_w-1 DOWNTO 0); BEGIN --------------------------------------------------------------- @@ -126,42 +120,6 @@ BEGIN ); END GENERATE; - --------------------------------------------------------------- - -- mmp_dp_bsn_sync_scheduler - --------------------------------------------------------------- - dp_bsn_sync_scheduler_snk_in <= quant_sosi_arr(0); - p_bsn_sync : PROCESS(dp_bsn_sync_scheduler_src_out) - BEGIN - xin_sosi_arr <= quant_sosi_arr; - FOR I IN 0 TO c_sdp_P_pfb-1 LOOP - xin_sosi_arr(I).sop <= dp_bsn_sync_scheduler_src_out.sop; - xin_sosi_arr(I).eop <= dp_bsn_sync_scheduler_src_out.eop; - xin_sosi_arr(I).valid <= dp_bsn_sync_scheduler_src_out.valid; - xin_sosi_arr(I).sync <= dp_bsn_sync_scheduler_src_out.sync; - END LOOP; - END PROCESS; - - u_mmp_dp_bsn_sync_scheduler : ENTITY dp_lib.mmp_dp_bsn_sync_scheduler - GENERIC MAP ( - g_block_size => c_sdp_N_fft, - g_ctrl_interval_size_min => c_sdp_xst_nof_blk_per_sync_min - ) - PORT MAP ( - dp_rst => dp_rst, - dp_clk => dp_clk, - mm_rst => mm_rst, - mm_clk => mm_clk, - - reg_mosi => reg_dp_bsn_sync_scheduler_mosi, - reg_miso => reg_dp_bsn_sync_scheduler_miso, - - in_sosi => dp_bsn_sync_scheduler_snk_in, - out_sosi => dp_bsn_sync_scheduler_src_out, - - out_start => dp_bsn_sync_scheduler_out_start - - ); - --------------------------------------------------------------- -- Crosslet Subband Select --------------------------------------------------------------- @@ -173,7 +131,7 @@ BEGIN dp_clk => dp_clk, dp_rst => dp_rst, - in_sosi_arr => xin_sosi_arr, + in_sosi_arr => quant_sosi_arr, out_sosi => xsel_sosi, mm_rst => mm_rst, @@ -181,11 +139,10 @@ BEGIN reg_crosslets_info_mosi => reg_crosslets_info_mosi, reg_crosslets_info_miso => reg_crosslets_info_miso, - - reg_bsn_scheduler_xsub_mosi => reg_bsn_scheduler_xsub_mosi, - reg_bsn_scheduler_xsub_miso => reg_bsn_scheduler_xsub_miso, - start_trigger => dp_bsn_sync_scheduler_out_start, + reg_bsn_sync_scheduler_xsub_mosi => reg_bsn_sync_scheduler_xsub_mosi, + reg_bsn_sync_scheduler_xsub_miso => reg_bsn_sync_scheduler_xsub_miso, + out_crosslets_info => crosslets_info ); diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_crosslets_subband_select.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_crosslets_subband_select.vhd index 826d47e29b25e8ac3b2f7f6e336999536647d7de..ef1f8c9fa55915372aa0a96300df36465b723b18 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_crosslets_subband_select.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_crosslets_subband_select.vhd @@ -41,7 +41,8 @@ USE work.sdp_pkg.ALL; ENTITY sdp_crosslets_subband_select IS GENERIC ( - g_N_crosslets : NATURAL := c_sdp_N_crosslets + g_N_crosslets : NATURAL := c_sdp_N_crosslets; + g_ctrl_interval_size_min : NATURAL := c_sdp_xst_nof_blk_per_sync_min ); PORT ( dp_clk : IN STD_LOGIC; @@ -56,8 +57,8 @@ ENTITY sdp_crosslets_subband_select IS reg_crosslets_info_mosi : IN t_mem_mosi := c_mem_mosi_rst; reg_crosslets_info_miso : OUT t_mem_miso := c_mem_miso_rst; - reg_bsn_scheduler_xsub_mosi : IN t_mem_mosi := c_mem_mosi_rst; - reg_bsn_scheduler_xsub_miso : OUT t_mem_miso := c_mem_miso_rst; + reg_bsn_sync_scheduler_xsub_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_bsn_sync_scheduler_xsub_miso : OUT t_mem_miso := c_mem_miso_rst; out_crosslets_info : OUT STD_LOGIC_VECTOR(c_sdp_crosslets_info_reg_w-1 DOWNTO 0) @@ -96,6 +97,7 @@ ARCHITECTURE str OF sdp_crosslets_subband_select IS SIGNAL col_select_miso : t_mem_miso := c_mem_miso_rst; SIGNAL row_select_slv : STD_LOGIC_VECTOR(c_row_select_slv_w-1 DOWNTO 0); + SIGNAL dp_bsn_sync_scheduler_src_out_arr : t_dp_sosi_arr(c_sdp_P_pfb-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst); SIGNAL col_sosi_arr : t_dp_sosi_arr(c_sdp_P_pfb-1 DOWNTO 0); SIGNAL row_sosi : t_dp_sosi; @@ -104,27 +106,27 @@ ARCHITECTURE str OF sdp_crosslets_subband_select IS BEGIN --------------------------------------------------------------- - -- BSN scheduler + -- BSN sync scheduler --------------------------------------------------------------- - u_bsn_scheduler : ENTITY dp_lib.mms_dp_bsn_scheduler + u_mmp_dp_bsn_sync_scheduler_arr : ENTITY dp_lib.mmp_dp_bsn_sync_scheduler_arr GENERIC MAP ( - g_cross_clock_domain => TRUE, - g_bsn_w => c_dp_stream_bsn_w + g_nof_streams => c_sdp_P_pfb, + g_block_size => c_sdp_N_fft, + g_ctrl_interval_size_min => g_ctrl_interval_size_min ) PORT MAP ( - -- Memory-mapped clock domain - mm_rst => mm_rst, - mm_clk => mm_clk, + dp_rst => dp_rst, + dp_clk => dp_clk, + mm_rst => mm_rst, + mm_clk => mm_clk, - reg_mosi => reg_bsn_scheduler_xsub_mosi, - reg_miso => reg_bsn_scheduler_xsub_miso, + reg_mosi => reg_bsn_sync_scheduler_xsub_mosi, + reg_miso => reg_bsn_sync_scheduler_xsub_miso, - -- Streaming clock domain - dp_rst => dp_rst, - dp_clk => dp_clk, + in_sosi_arr => in_sosi_arr, + out_sosi_arr => dp_bsn_sync_scheduler_src_out_arr, - snk_in => in_sosi_arr(0), -- only uses eop (= block sync), bsn[] - trigger_out => start_trigger + out_start => start_trigger ); --------------------------------------------------------------- @@ -161,7 +163,7 @@ BEGIN END IF; END PROCESS; - p_comb_crosslets_control : PROCESS(r, start_trigger, crosslets_info_reg, in_sosi_arr, col_select_miso) + p_comb_crosslets_control : PROCESS(r, start_trigger, crosslets_info_reg, dp_bsn_sync_scheduler_src_out_arr, col_select_miso) VARIABLE v : t_crosslets_control_reg; -- Use extra variable to simplify col_select_mosi address selection. -- Also using v_offsets instead of v.offsets to clearly indicate we do not only use this variable on the left side but also on the right side of assignments. @@ -178,7 +180,8 @@ BEGIN v.row_index := 0; v.col_index := 0; v.sync_detected := '0'; -- set sync_detected to 0 in the case that a sync has been detected before the initial start_trigger. - -- start_trigger is active on the eop so we can immediatly reset the offsets/step such that they are used in the next packet. + + -- start_trigger is active on the sync so we can immediatly reset the offsets/step such that they are used in the next packet. -- It is up to the user to schedule the start trigger on a BSN that coincides with a sync interval if that is desired. v.step := TO_UINT(crosslets_info_reg(c_sdp_crosslets_info_reg_w-1 DOWNTO c_sdp_crosslets_info_reg_w - c_sdp_crosslets_index_w)); FOR I IN 0 TO g_N_crosslets-1 LOOP @@ -186,21 +189,18 @@ BEGIN END LOOP; END IF; - IF in_sosi_arr(0).sync = '1' THEN + -- Do not set sync_detected if start_trigger = 1 because the first sync interval after (re)start + -- already has set the indices for the first interval and we do not want to increase them with the step. + IF dp_bsn_sync_scheduler_src_out_arr(0).sync = '1' AND start_trigger = '0' THEN v.sync_detected := '1'; END IF; IF r.started = '1' THEN -- Once started r.started remains active. -- add step to offsets - IF in_sosi_arr(0).eop = '1' AND r.sync_detected = '1' THEN -- using r.sync_detected to change offsets 1 packet after the sync due to the buffered packet in reorder_col_wide_select + IF dp_bsn_sync_scheduler_src_out_arr(0).eop = '1' AND r.sync_detected = '1' THEN -- using r.sync_detected to change offsets 1 packet after the sync due to the buffered packet in reorder_col_wide_select v.sync_detected := '0'; FOR I IN 0 TO g_N_crosslets-1 LOOP - IF start_trigger = '1' THEN - -- Using the crosslets_info_reg directly instead of r.step when start trigger coincides with the current eop as step can have a new value. - v_offsets(I) := r.offsets(I) + TO_UINT(crosslets_info_reg(c_sdp_crosslets_info_reg_w-1 DOWNTO c_sdp_crosslets_info_reg_w - c_sdp_crosslets_index_w)); - ELSE - v_offsets(I) := r.offsets(I) + r.step; - END IF; + v_offsets(I) := r.offsets(I) + r.step; END LOOP; END IF; @@ -265,7 +265,7 @@ BEGIN col_select_miso => col_select_miso, -- Streaming - input_sosi_arr => in_sosi_arr, + input_sosi_arr => dp_bsn_sync_scheduler_src_out_arr, output_sosi_arr => col_sosi_arr ); diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd index 15b936c1d5495941c4748df81b6ab6e6d649c810..539d746a1009a53a7ae7dfbcf07e5b2e11ac2ce8 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd @@ -170,21 +170,17 @@ ENTITY sdp_station IS ---------------------------------------------- -- XSUB ---------------------------------------------- - -- dp_sync_insert_v2 - reg_dp_sync_insert_v2_mosi : IN t_mem_mosi := c_mem_mosi_rst; - reg_dp_sync_insert_v2_miso : OUT t_mem_miso := c_mem_miso_rst; - -- crosslets_info - reg_crosslets_info_mosi : IN t_mem_mosi := c_mem_mosi_rst; - reg_crosslets_info_miso : OUT t_mem_miso := c_mem_miso_rst; + reg_crosslets_info_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_crosslets_info_miso : OUT t_mem_miso := c_mem_miso_rst; -- bsn_scheduler_xsub - reg_bsn_scheduler_xsub_mosi : IN t_mem_mosi := c_mem_mosi_rst; - reg_bsn_scheduler_xsub_miso : OUT t_mem_miso := c_mem_miso_rst; + reg_bsn_sync_scheduler_xsub_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_bsn_sync_scheduler_xsub_miso : OUT t_mem_miso := c_mem_miso_rst; -- st_xsq - ram_st_xsq_mosi : IN t_mem_mosi := c_mem_mosi_rst; - ram_st_xsq_miso : OUT t_mem_miso := c_mem_miso_rst; + ram_st_xsq_mosi : IN t_mem_mosi := c_mem_mosi_rst; + ram_st_xsq_miso : OUT t_mem_miso := c_mem_miso_rst; ---------------------------------------------- -- BF @@ -506,36 +502,34 @@ BEGIN g_P_sq => g_P_sq ) PORT MAP( - dp_clk => dp_clk, - dp_rst => dp_rst, - - in_sosi_arr => fsub_sosi_arr, - - xst_udp_sosi => udp_tx_sosi_arr(1), - xst_udp_siso => udp_tx_siso_arr(1), - - mm_rst => mm_rst, - mm_clk => mm_clk, - - reg_dp_sync_insert_v2_mosi => reg_dp_sync_insert_v2_mosi, - reg_dp_sync_insert_v2_miso => reg_dp_sync_insert_v2_miso, - reg_crosslets_info_mosi => reg_crosslets_info_mosi, - reg_crosslets_info_miso => reg_crosslets_info_miso, - reg_bsn_scheduler_xsub_mosi => reg_bsn_scheduler_xsub_mosi, - reg_bsn_scheduler_xsub_miso => reg_bsn_scheduler_xsub_miso, - ram_st_xsq_mosi => ram_st_xsq_mosi, - ram_st_xsq_miso => ram_st_xsq_miso, - - reg_stat_enable_mosi => reg_stat_enable_xst_mosi, - reg_stat_enable_miso => reg_stat_enable_xst_miso, - reg_stat_hdr_dat_mosi => reg_stat_hdr_dat_xst_mosi, - reg_stat_hdr_dat_miso => reg_stat_hdr_dat_xst_miso, + dp_clk => dp_clk, + dp_rst => dp_rst, + + in_sosi_arr => fsub_sosi_arr, + + xst_udp_sosi => udp_tx_sosi_arr(1), + xst_udp_siso => udp_tx_siso_arr(1), + + mm_rst => mm_rst, + mm_clk => mm_clk, + + reg_crosslets_info_mosi => reg_crosslets_info_mosi, + reg_crosslets_info_miso => reg_crosslets_info_miso, + reg_bsn_sync_scheduler_xsub_mosi => reg_bsn_sync_scheduler_xsub_mosi, + reg_bsn_sync_scheduler_xsub_miso => reg_bsn_sync_scheduler_xsub_miso, + ram_st_xsq_mosi => ram_st_xsq_mosi, + ram_st_xsq_miso => ram_st_xsq_miso, + + reg_stat_enable_mosi => reg_stat_enable_xst_mosi, + reg_stat_enable_miso => reg_stat_enable_xst_miso, + reg_stat_hdr_dat_mosi => reg_stat_hdr_dat_xst_mosi, + reg_stat_hdr_dat_miso => reg_stat_hdr_dat_xst_miso, - sdp_info => sdp_info, - gn_id => gn_id, - stat_eth_src_mac => stat_eth_src_mac, - stat_ip_src_addr => stat_ip_src_addr, - stat_udp_src_port => xst_udp_src_port + sdp_info => sdp_info, + gn_id => gn_id, + stat_eth_src_mac => stat_eth_src_mac, + stat_ip_src_addr => stat_ip_src_addr, + stat_udp_src_port => xst_udp_src_port ); END GENERATE; diff --git a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_crosslets_subband_select.vhd b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_crosslets_subband_select.vhd index 127f1499fa098add9f4dadca0f90ce6c0071c054..7c77ebee3ecb18b9bede4a495e1fa4540781b9e6 100644 --- a/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_crosslets_subband_select.vhd +++ b/applications/lofar2/libraries/sdp/tb/vhdl/tb_sdp_crosslets_subband_select.vhd @@ -65,7 +65,9 @@ ARCHITECTURE tb OF tb_sdp_crosslets_subband_select IS CONSTANT c_ch_sel_step : NATURAL := 3; -- offset step size to increase per sync interval CONSTANT c_nof_ch_sel : NATURAL := c_N_crosslets*c_nof_ch_sel_col*c_nof_ch_sel_row; - CONSTANT scheduled_bsn : NATURAL := 11; + CONSTANT c_ctrl_interval_size : NATURAL := c_nof_block_per_sync * c_nof_ch_in; + CONSTANT c_scheduled_bsn : NATURAL := 11; + CONSTANT c_nof_block_dly : NATURAL := c_nof_block_per_sync; SIGNAL rst : STD_LOGIC; SIGNAL clk : STD_LOGIC := '1'; @@ -83,7 +85,7 @@ ARCHITECTURE tb OF tb_sdp_crosslets_subband_select IS SIGNAL st_sosi_arr : t_dp_sosi_arr(c_sdp_P_pfb-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst); SIGNAL exp_sosi : t_dp_sosi := c_dp_sosi_rst; - SIGNAL bsn : NATURAL := scheduled_bsn-1; + SIGNAL bsn : NATURAL := c_scheduled_bsn - c_nof_block_dly; SIGNAL in_sosi_arr : t_dp_sosi_arr(c_sdp_P_pfb-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst); @@ -105,8 +107,11 @@ BEGIN proc_common_wait_until_low(mm_clk, rst); proc_common_wait_some_cycles(mm_clk, 50); -- Give dut some time to start -- BSN Scheduler - proc_mem_mm_bus_wr(0, scheduled_bsn, mm_clk, mm_trigger_miso, mm_trigger_mosi); - proc_mem_mm_bus_wr(1, 0, mm_clk, mm_trigger_miso, mm_trigger_mosi); + proc_mem_mm_bus_wr(1, c_ctrl_interval_size, mm_clk, mm_trigger_miso, mm_trigger_mosi); + proc_mem_mm_bus_wr(2, c_scheduled_bsn, mm_clk, mm_trigger_miso, mm_trigger_mosi); + proc_mem_mm_bus_wr(3, 0, mm_clk, mm_trigger_miso, mm_trigger_mosi); + proc_mem_mm_bus_wr(0, 1, mm_clk, mm_trigger_miso, mm_trigger_mosi); --enable + -- crosslet info FOR I IN 0 TO c_N_crosslets-1 LOOP @@ -198,8 +203,8 @@ BEGIN exp_sosi.eop <= '1'; END IF; - exp_sosi.re <= TO_DP_DSP_DATA( I * c_nof_ch_in + v_k + c_nof_ch_sel_col*c_ch_sel_offsets(v_offset) + v_col + v_row*2**5); - exp_sosi.im <= TO_DP_DSP_DATA(1+ I * c_nof_ch_in + v_k + c_nof_ch_sel_col*c_ch_sel_offsets(v_offset) + v_col + v_row*2**5); + exp_sosi.re <= TO_DP_DSP_DATA( (I + c_nof_block_dly) * c_nof_ch_in + v_k + c_nof_ch_sel_col*c_ch_sel_offsets(v_offset) + v_col + v_row*2**5); + exp_sosi.im <= TO_DP_DSP_DATA(1+ (I + c_nof_block_dly) * c_nof_ch_in + v_k + c_nof_ch_sel_col*c_ch_sel_offsets(v_offset) + v_col + v_row*2**5); proc_common_wait_some_cycles(clk, 1); END LOOP; @@ -225,7 +230,8 @@ BEGIN u_dut : ENTITY work.sdp_crosslets_subband_select GENERIC MAP ( - g_N_crosslets => c_N_crosslets + g_N_crosslets => c_N_crosslets, + g_ctrl_interval_size_min => 1 ) PORT MAP ( dp_rst => rst, @@ -237,8 +243,8 @@ BEGIN reg_crosslets_info_mosi => mm_mosi, reg_crosslets_info_miso => mm_miso, - reg_bsn_scheduler_xsub_mosi => mm_trigger_mosi, - reg_bsn_scheduler_xsub_miso => mm_trigger_miso, + reg_bsn_sync_scheduler_xsub_mosi => mm_trigger_mosi, + reg_bsn_sync_scheduler_xsub_miso => mm_trigger_miso, -- Streaming in_sosi_arr => in_sosi_arr, diff --git a/libraries/base/dp/hdllib.cfg b/libraries/base/dp/hdllib.cfg index 9cc984efdde5e083ce57a73815e6cb4d062c570b..d073bc7656d3f1d807df2b3a5661317f7fd26f45 100644 --- a/libraries/base/dp/hdllib.cfg +++ b/libraries/base/dp/hdllib.cfg @@ -93,6 +93,7 @@ synth_files = src/vhdl/mms_dp_bsn_scheduler.vhd src/vhdl/dp_bsn_sync_scheduler.vhd src/vhdl/mmp_dp_bsn_sync_scheduler.vhd + src/vhdl/mmp_dp_bsn_sync_scheduler_arr.vhd src/vhdl/dp_bsn_delay.vhd src/vhdl/dp_bsn_align.vhd src/vhdl/dp_bsn_align_reg.vhd diff --git a/libraries/base/dp/src/vhdl/mmp_dp_bsn_sync_scheduler.vhd b/libraries/base/dp/src/vhdl/mmp_dp_bsn_sync_scheduler.vhd index f6d791cbd082ace1b76eb2d7022e3e1b889a596c..75b42316d077b32591da03f6a12aff7ee6da26d9 100644 --- a/libraries/base/dp/src/vhdl/mmp_dp_bsn_sync_scheduler.vhd +++ b/libraries/base/dp/src/vhdl/mmp_dp_bsn_sync_scheduler.vhd @@ -64,7 +64,7 @@ ENTITY mmp_dp_bsn_sync_scheduler IS GENERIC ( g_bsn_w : NATURAL := c_dp_stream_bsn_w; g_block_size : NATURAL := 256; -- = number of data valid per BSN block, must be >= 2 - g_ctrl_interval_size_min : NATURAL := 19530 -- Minimum interval size to use if MM write interval size is set too small. + g_ctrl_interval_size_min : NATURAL := 1 -- Minimum interval size to use if MM write interval size is set too small. ); PORT ( -- Clocks and reset diff --git a/libraries/base/dp/src/vhdl/mmp_dp_bsn_sync_scheduler_arr.vhd b/libraries/base/dp/src/vhdl/mmp_dp_bsn_sync_scheduler_arr.vhd new file mode 100644 index 0000000000000000000000000000000000000000..38a473d061ab50d2a974dc5bc071b5a8d8f9225f --- /dev/null +++ b/libraries/base/dp/src/vhdl/mmp_dp_bsn_sync_scheduler_arr.vhd @@ -0,0 +1,117 @@ +-- -------------------------------------------------------------------------- +-- Copyright 2021 +-- 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. vd Walle +-- Purpose : Array wrapper for mmp_dp_bsn_sync_scheduler.vhd +-- Description: This component is wrapper that uses mmp_dp_bsn_sync_scheduler.vhd +-- with input 0 to determine the streaming control (sync, sop, eop, valid). So +-- it is assumed that all inputs in in_sosi_arr have identical control signals. +-- +-- Remarks: See mmp_dp_bsn_sync_scheduler.vhd + +LIBRARY IEEE, common_lib; +USE IEEE.STD_LOGIC_1164.ALL; +USE common_lib.common_pkg.ALL; +USE common_lib.common_mem_pkg.ALL; +USE work.dp_stream_pkg.ALL; + + +ENTITY mmp_dp_bsn_sync_scheduler_arr IS + GENERIC ( + g_nof_streams : POSITIVE := 1; + g_bsn_w : NATURAL := c_dp_stream_bsn_w; + g_block_size : NATURAL := 256; -- = number of data valid per BSN block, must be >= 2 + g_ctrl_interval_size_min : NATURAL := 1 -- Minimum interval size to use if MM write interval size is set too small. + ); + PORT ( + -- Clocks and reset + mm_rst : IN STD_LOGIC; + mm_clk : IN STD_LOGIC; + dp_rst : IN STD_LOGIC; + dp_clk : IN STD_LOGIC; + + -- MM control + reg_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_miso : OUT t_mem_miso; + + -- Streaming + in_sosi_arr : IN t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); + out_sosi_arr : OUT t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); + out_start : OUT STD_LOGIC; + out_enable : OUT STD_LOGIC + ); +END mmp_dp_bsn_sync_scheduler_arr; + +ARCHITECTURE str OF mmp_dp_bsn_sync_scheduler_arr IS + CONSTANT c_pipeline : NATURAL := 1; + + SIGNAL single_src_out : t_dp_sosi; + + SIGNAL in_sosi_arr_piped : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); +BEGIN + + -- dp_bsn_sync_scheduler + u_mmp_dp_bsn_sync_scheduler : ENTITY work.mmp_dp_bsn_sync_scheduler + GENERIC MAP ( + g_bsn_w => g_bsn_w, + g_block_size => g_block_size, + g_ctrl_interval_size_min => g_ctrl_interval_size_min + ) + PORT MAP ( + dp_rst => dp_rst, + dp_clk => dp_clk, + mm_rst => mm_rst, + mm_clk => mm_clk, + + reg_mosi => reg_mosi, + reg_miso => reg_miso, + + in_sosi => in_sosi_arr(0), + out_sosi => single_src_out, + + out_start => out_start, + out_enable => out_enable + ); + + -- Pipeline in_sosi_arr to compensate for the latency in mmp_dp_bsn_sync_scheduler + u_dp_pipeline_arr : ENTITY work.dp_pipeline_arr + GENERIC MAP ( + g_nof_streams => g_nof_streams, + g_pipeline => c_pipeline + ) + PORT MAP ( + rst => dp_rst, + clk => dp_clk, + -- ST sink + snk_in_arr => in_sosi_arr, + -- ST source + src_out_arr => in_sosi_arr_piped + ); + + p_streams : PROCESS(in_sosi_arr_piped, single_src_out) + BEGIN + out_sosi_arr <= in_sosi_arr_piped; + FOR I IN 0 TO g_nof_streams-1 LOOP + out_sosi_arr(I).sop <= single_src_out.sop; + out_sosi_arr(I).eop <= single_src_out.eop; + out_sosi_arr(I).valid <= single_src_out.valid; + out_sosi_arr(I).sync <= single_src_out.sync; + END LOOP; + END PROCESS; + +END str;