diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/lofar2_unb2b_sdp_station.fpga.yaml b/applications/lofar2/designs/lofar2_unb2b_sdp_station/lofar2_unb2b_sdp_station.fpga.yaml index 049d49e757afc23cc41cd45851f0291976895032..696629eeab95d5fb2b1c99da91dcbd4c97b9f431 100644 --- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/lofar2_unb2b_sdp_station.fpga.yaml +++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/lofar2_unb2b_sdp_station.fpga.yaml @@ -21,7 +21,7 @@ parameters: - { name: c_N_taps, value: 16 } - { name: c_W_adc_jesd, value: 16 } - { name: c_W_adc, value: 14 } - - { name: c_R_os, value: 2 } + - { name: c_R_os, value: 2 } - { name: c_V_sample_delay, value: 4096 } - { name: c_V_si_db_large, value: 131072 } - { name: c_V_si_db, value: 1024 } @@ -222,7 +222,8 @@ peripherals: - { name: P_pfb, value: c_R_os * c_P_pfb} # DISTURB uses 2x oversample so 2 X P_pfb mm_port_names: - RAM_EQUALIZER_GAINS - + - RAM_EQUALIZER_GAINS_CROSS + - peripheral_name: dp/dp_selector mm_port_names: - REG_DP_SELECTOR # input_select = 0 for weighted subbands, input_select = 1 for raw subbands diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station.vhd index 3bbe9c203ef9726a41b99ea2576ebdebda0813be..52404f9735568534d163cbb0f803266f06215680 100644 --- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station.vhd +++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station.vhd @@ -273,6 +273,8 @@ ARCHITECTURE str OF lofar2_unb2b_sdp_station IS -- Equalizer gains SIGNAL ram_equalizer_gains_copi : t_mem_copi := c_mem_copi_rst; SIGNAL ram_equalizer_gains_cipo : t_mem_cipo := c_mem_cipo_rst; + SIGNAL ram_equalizer_gains_cross_copi : t_mem_copi := c_mem_copi_rst; + SIGNAL ram_equalizer_gains_cross_cipo : t_mem_cipo := c_mem_cipo_rst; -- DP Selector SIGNAL reg_dp_selector_copi : t_mem_copi := c_mem_copi_rst; @@ -707,7 +709,9 @@ BEGIN reg_si_cipo => reg_si_cipo, ram_equalizer_gains_copi => ram_equalizer_gains_copi, ram_equalizer_gains_cipo => ram_equalizer_gains_cipo, - reg_dp_selector_copi => reg_dp_selector_copi, + ram_equalizer_gains_cross_copi => ram_equalizer_gains_cross_copi, + ram_equalizer_gains_cross_cipo => ram_equalizer_gains_cross_cipo, + reg_dp_selector_copi => reg_dp_selector_copi, reg_dp_selector_cipo => reg_dp_selector_cipo, reg_sdp_info_copi => reg_sdp_info_copi, reg_sdp_info_cipo => reg_sdp_info_cipo, @@ -885,6 +889,8 @@ BEGIN ram_fil_coefs_cipo => ram_fil_coefs_cipo, ram_equalizer_gains_copi => ram_equalizer_gains_copi, ram_equalizer_gains_cipo => ram_equalizer_gains_cipo, + ram_equalizer_gains_cross_copi => ram_equalizer_gains_cross_copi, + ram_equalizer_gains_cross_cipo => ram_equalizer_gains_cross_cipo, reg_dp_selector_copi => reg_dp_selector_copi, reg_dp_selector_cipo => reg_dp_selector_cipo, diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/mmm_lofar2_unb2b_sdp_station.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/mmm_lofar2_unb2b_sdp_station.vhd index cb7a197ecec74c7e8ca28de2c24cba95f84afb87..92ee9e4b79968d6fb2498ae2c342c646d29ebcff 100644 --- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/mmm_lofar2_unb2b_sdp_station.vhd +++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/mmm_lofar2_unb2b_sdp_station.vhd @@ -153,6 +153,8 @@ ENTITY mmm_lofar2_unb2b_sdp_station IS -- Equalizer gains ram_equalizer_gains_copi : OUT t_mem_copi; ram_equalizer_gains_cipo : IN t_mem_cipo; + ram_equalizer_gains_cross_copi : OUT t_mem_copi; + ram_equalizer_gains_cross_cipo : IN t_mem_cipo; -- DP Selector reg_dp_selector_copi : OUT t_mem_copi; @@ -421,6 +423,8 @@ BEGIN u_mm_file_ram_equalizer_gains : mm_file GENERIC MAP(mmf_unb_file_prefix(g_sim_unb_nr, c_sim_node_nr, c_sim_node_type) & "RAM_EQUALIZER_GAINS") PORT MAP(mm_rst, mm_clk, ram_equalizer_gains_copi, ram_equalizer_gains_cipo ); + u_mm_file_ram_equalizer_gains_cross : mm_file GENERIC MAP(mmf_unb_file_prefix(g_sim_unb_nr, c_sim_node_nr, c_sim_node_type) & "RAM_EQUALIZER_GAINS_CROSS") + PORT MAP(mm_rst, mm_clk, ram_equalizer_gains_cross_copi, ram_equalizer_gains_cross_cipo ); u_mm_file_reg_dp_selector : mm_file GENERIC MAP(mmf_unb_file_prefix(g_sim_unb_nr, c_sim_node_nr, c_sim_node_type) & "REG_DP_SELECTOR") PORT MAP(mm_rst, mm_clk, reg_dp_selector_copi, reg_dp_selector_cipo ); @@ -838,6 +842,14 @@ BEGIN ram_equalizer_gains_read_export => ram_equalizer_gains_copi.rd, ram_equalizer_gains_readdata_export => ram_equalizer_gains_cipo.rddata(c_word_w-1 DOWNTO 0), + ram_equalizer_gains_cross_clk_export => OPEN, + ram_equalizer_gains_cross_reset_export => OPEN, + ram_equalizer_gains_cross_address_export => ram_equalizer_gains_cross_copi.address(c_sdp_ram_equalizer_gains_addr_w-1 DOWNTO 0), + ram_equalizer_gains_cross_write_export => ram_equalizer_gains_cross_copi.wr, + ram_equalizer_gains_cross_writedata_export => ram_equalizer_gains_cross_copi.wrdata(c_word_w-1 DOWNTO 0), + ram_equalizer_gains_cross_read_export => ram_equalizer_gains_cross_copi.rd, + ram_equalizer_gains_cross_readdata_export => ram_equalizer_gains_cross_cipo.rddata(c_word_w-1 DOWNTO 0), + reg_dp_selector_clk_export => OPEN, reg_dp_selector_reset_export => OPEN, reg_dp_selector_address_export => reg_dp_selector_copi.address(c_sdp_reg_dp_selector_addr_w-1 DOWNTO 0), diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/qsys_lofar2_unb2b_sdp_station_pkg.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/qsys_lofar2_unb2b_sdp_station_pkg.vhd index b156b4c6a05e253dd1b19676589277f604fa6b53..1bed8e386bc1c3cf89891d0a0ed37a1f9923f389 100644 --- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/qsys_lofar2_unb2b_sdp_station_pkg.vhd +++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/qsys_lofar2_unb2b_sdp_station_pkg.vhd @@ -98,6 +98,13 @@ PACKAGE qsys_lofar2_unb2b_sdp_station_pkg IS ram_equalizer_gains_reset_export : out std_logic; -- export ram_equalizer_gains_write_export : out std_logic; -- export ram_equalizer_gains_writedata_export : out std_logic_vector(31 downto 0); -- export + ram_equalizer_gains_cross_address_export : out std_logic_vector(13 downto 0); -- export + ram_equalizer_gains_cross_clk_export : out std_logic; -- export + ram_equalizer_gains_cross_read_export : out std_logic; -- export + ram_equalizer_gains_cross_readdata_export : in std_logic_vector(31 downto 0) := (others => 'X'); -- export + ram_equalizer_gains_cross_reset_export : out std_logic; -- export + ram_equalizer_gains_cross_write_export : out std_logic; -- export + ram_equalizer_gains_cross_writedata_export : out std_logic_vector(31 downto 0); -- export ram_fil_coefs_address_export : out std_logic_vector(14 downto 0); -- export ram_fil_coefs_clk_export : out std_logic; -- export ram_fil_coefs_read_export : out std_logic; -- export diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/lofar2_unb2c_sdp_station.fpga.yaml b/applications/lofar2/designs/lofar2_unb2c_sdp_station/lofar2_unb2c_sdp_station.fpga.yaml index b350714e1ecfbd8ff5c857721530b21153f03412..094c157891d89105d8b296d010c6e380ad3933ac 100644 --- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/lofar2_unb2c_sdp_station.fpga.yaml +++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/lofar2_unb2c_sdp_station.fpga.yaml @@ -222,7 +222,8 @@ peripherals: - { name: P_pfb, value: c_R_os * c_P_pfb} # DISTURB uses 2x oversample so 2 X P_pfb mm_port_names: - RAM_EQUALIZER_GAINS - + - RAM_EQUALIZER_GAINS_CROSS + - peripheral_name: dp/dp_selector mm_port_names: - REG_DP_SELECTOR # input_select = 0 for weighted subbands, input_select = 1 for raw subbands diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/lofar2_unb2c_sdp_station.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/lofar2_unb2c_sdp_station.vhd index 032a29e62fdffac0ad0b4bed69e0a9599d4aee7d..d419d5eb41e225dc7eb53e2d3789b391e93de56b 100644 --- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/lofar2_unb2c_sdp_station.vhd +++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/lofar2_unb2c_sdp_station.vhd @@ -257,6 +257,8 @@ ARCHITECTURE str OF lofar2_unb2c_sdp_station IS -- Equalizer gains SIGNAL ram_equalizer_gains_copi : t_mem_copi := c_mem_copi_rst; SIGNAL ram_equalizer_gains_cipo : t_mem_cipo := c_mem_cipo_rst; + SIGNAL ram_equalizer_gains_cross_copi : t_mem_copi := c_mem_copi_rst; + SIGNAL ram_equalizer_gains_cross_cipo : t_mem_cipo := c_mem_cipo_rst; -- DP Selector SIGNAL reg_dp_selector_copi : t_mem_copi := c_mem_copi_rst; @@ -673,7 +675,9 @@ BEGIN reg_si_cipo => reg_si_cipo, ram_equalizer_gains_copi => ram_equalizer_gains_copi, ram_equalizer_gains_cipo => ram_equalizer_gains_cipo, - reg_dp_selector_copi => reg_dp_selector_copi, + ram_equalizer_gains_cross_copi => ram_equalizer_gains_cross_copi, + ram_equalizer_gains_cross_cipo => ram_equalizer_gains_cross_cipo, + reg_dp_selector_copi => reg_dp_selector_copi, reg_dp_selector_cipo => reg_dp_selector_cipo, reg_sdp_info_copi => reg_sdp_info_copi, reg_sdp_info_cipo => reg_sdp_info_cipo, @@ -849,6 +853,8 @@ BEGIN ram_fil_coefs_cipo => ram_fil_coefs_cipo, ram_equalizer_gains_copi => ram_equalizer_gains_copi, ram_equalizer_gains_cipo => ram_equalizer_gains_cipo, + ram_equalizer_gains_cross_copi => ram_equalizer_gains_cross_copi, + ram_equalizer_gains_cross_cipo => ram_equalizer_gains_cross_cipo, reg_dp_selector_copi => reg_dp_selector_copi, reg_dp_selector_cipo => reg_dp_selector_cipo, diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/mmm_lofar2_unb2c_sdp_station.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/mmm_lofar2_unb2c_sdp_station.vhd index e00b83112f2f0664da42844f6f7231ba8733bccc..e45477e43043854d0f0db267964378df9dd5f915 100644 --- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/mmm_lofar2_unb2c_sdp_station.vhd +++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/mmm_lofar2_unb2c_sdp_station.vhd @@ -146,6 +146,8 @@ ENTITY mmm_lofar2_unb2c_sdp_station IS -- Equalizer gains ram_equalizer_gains_copi : OUT t_mem_copi; ram_equalizer_gains_cipo : IN t_mem_cipo; + ram_equalizer_gains_cross_copi : OUT t_mem_copi; + ram_equalizer_gains_cross_cipo : IN t_mem_cipo; -- DP Selector reg_dp_selector_copi : OUT t_mem_copi; @@ -408,6 +410,8 @@ BEGIN u_mm_file_ram_equalizer_gains : mm_file GENERIC MAP(mmf_unb_file_prefix(g_sim_unb_nr, c_sim_node_nr, c_sim_node_type) & "RAM_EQUALIZER_GAINS") PORT MAP(mm_rst, mm_clk, ram_equalizer_gains_copi, ram_equalizer_gains_cipo ); + u_mm_file_ram_equalizer_gains_cross : mm_file GENERIC MAP(mmf_unb_file_prefix(g_sim_unb_nr, c_sim_node_nr, c_sim_node_type) & "RAM_EQUALIZER_GAINS_CROSS") + PORT MAP(mm_rst, mm_clk, ram_equalizer_gains_cross_copi, ram_equalizer_gains_cross_cipo ); u_mm_file_reg_dp_selector : mm_file GENERIC MAP(mmf_unb_file_prefix(g_sim_unb_nr, c_sim_node_nr, c_sim_node_type) & "REG_DP_SELECTOR") PORT MAP(mm_rst, mm_clk, reg_dp_selector_copi, reg_dp_selector_cipo ); @@ -809,6 +813,14 @@ BEGIN ram_equalizer_gains_read_export => ram_equalizer_gains_copi.rd, ram_equalizer_gains_readdata_export => ram_equalizer_gains_cipo.rddata(c_word_w-1 DOWNTO 0), + ram_equalizer_gains_cross_clk_export => OPEN, + ram_equalizer_gains_cross_reset_export => OPEN, + ram_equalizer_gains_cross_address_export => ram_equalizer_gains_cross_copi.address(c_sdp_ram_equalizer_gains_addr_w-1 DOWNTO 0), + ram_equalizer_gains_cross_write_export => ram_equalizer_gains_cross_copi.wr, + ram_equalizer_gains_cross_writedata_export => ram_equalizer_gains_cross_copi.wrdata(c_word_w-1 DOWNTO 0), + ram_equalizer_gains_cross_read_export => ram_equalizer_gains_cross_copi.rd, + ram_equalizer_gains_cross_readdata_export => ram_equalizer_gains_cross_cipo.rddata(c_word_w-1 DOWNTO 0), + reg_dp_selector_clk_export => OPEN, reg_dp_selector_reset_export => OPEN, reg_dp_selector_address_export => reg_dp_selector_copi.address(c_sdp_reg_dp_selector_addr_w-1 DOWNTO 0), diff --git a/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/qsys_lofar2_unb2c_sdp_station_pkg.vhd b/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/qsys_lofar2_unb2c_sdp_station_pkg.vhd index c8f7511c6e9e19f71e91ec67d526c2f11eecb18a..9617f9ba57b5dbc9a64cf9cc0f74184b7883b369 100644 --- a/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/qsys_lofar2_unb2c_sdp_station_pkg.vhd +++ b/applications/lofar2/designs/lofar2_unb2c_sdp_station/src/vhdl/qsys_lofar2_unb2c_sdp_station_pkg.vhd @@ -99,6 +99,13 @@ PACKAGE qsys_lofar2_unb2c_sdp_station_pkg IS ram_equalizer_gains_reset_export : out std_logic; -- export ram_equalizer_gains_write_export : out std_logic; -- export ram_equalizer_gains_writedata_export : out std_logic_vector(31 downto 0); -- export + ram_equalizer_gains_cross_address_export : out std_logic_vector(13 downto 0); -- export + ram_equalizer_gains_cross_clk_export : out std_logic; -- export + ram_equalizer_gains_cross_read_export : out std_logic; -- export + ram_equalizer_gains_cross_readdata_export : in std_logic_vector(31 downto 0) := (others => 'X'); -- export + ram_equalizer_gains_cross_reset_export : out std_logic; -- export + ram_equalizer_gains_cross_write_export : out std_logic; -- export + ram_equalizer_gains_cross_writedata_export : out std_logic_vector(31 downto 0); -- export ram_fil_coefs_address_export : out std_logic_vector(14 downto 0); -- export ram_fil_coefs_clk_export : out std_logic; -- export ram_fil_coefs_read_export : out std_logic; -- export diff --git a/applications/lofar2/libraries/sdp/sdp.peripheral.yaml b/applications/lofar2/libraries/sdp/sdp.peripheral.yaml index 17ecf33f68ea58c091536657741177c6ea315f25..3e7c08ebe5df00af900ae232a8be65ddea673054 100644 --- a/applications/lofar2/libraries/sdp/sdp.peripheral.yaml +++ b/applications/lofar2/libraries/sdp/sdp.peripheral.yaml @@ -80,8 +80,24 @@ peripherals: fields: - - field_name: coef field_description: | - "Complex coefficient to calibrate the gain and phase per subband. Packed as imaginary in high part, - real in low part of mm_width = N_complex * W_sub_weight = 2 * 16 = 32 bit." + "Complex coefficient to calibrate the co-polarization gain and phase per subband. + Packed as imaginary in high part, real in low part of mm_width = + N_complex * W_sub_weight = 2 * 16 = 32 bit." + number_of_fields: Q_fft * N_sub # = 1024 = 2 signal inputs * 512 subbands + address_offset: 0x0 + mm_width: 32 # = N_complex * W_sub_weight + radix: cint16_ir + - mm_port_name: RAM_EQUALIZER_GAINS_CROSS + mm_port_type: RAM + mm_port_span: ceil_pow2(Q_fft * N_sub) * MM_BUS_SIZE + mm_port_description: | + "Idem as RAM_EQUALIZER_GAINS, but for cross polarization." + number_of_mm_ports: P_pfb + fields: + - - field_name: coef + field_description: | + "Complex coefficient to calibrate the cross-polarization gain and phase per subband. + Packed idem as RAM_EQUALIZER_GAINS." number_of_fields: Q_fft * N_sub # = 1024 = 2 signal inputs * 512 subbands address_offset: 0x0 mm_width: 32 # = N_complex * W_sub_weight diff --git a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_filterbank.vhd b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_filterbank.vhd index ee1504f8af13ccc6c7e19fb2212ee6e9aabc2fa2..fb33891a243a3bf0afb3ef243ec5717234e858d8 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_filterbank.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_filterbank.vhd @@ -95,6 +95,8 @@ ENTITY node_sdp_filterbank IS ram_fil_coefs_miso : OUT t_mem_miso; ram_gains_mosi : IN t_mem_mosi := c_mem_mosi_rst; ram_gains_miso : OUT t_mem_miso; + ram_gains_cross_mosi : IN t_mem_mosi := c_mem_mosi_rst; + ram_gains_cross_miso : OUT t_mem_miso; reg_selector_mosi : IN t_mem_mosi := c_mem_mosi_rst; reg_selector_miso : OUT t_mem_miso; reg_enable_mosi : IN t_mem_mosi := c_mem_mosi_rst; @@ -269,8 +271,10 @@ BEGIN mm_rst => mm_rst, mm_clk => mm_clk, - ram_gains_mosi => ram_gains_mosi, - ram_gains_miso => ram_gains_miso + ram_gains_mosi => ram_gains_mosi, + ram_gains_miso => ram_gains_miso, + ram_gains_cross_mosi => ram_gains_cross_mosi, + ram_gains_cross_miso => ram_gains_cross_miso ); -- Output fsub streams diff --git a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_oversampled_filterbank.vhd b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_oversampled_filterbank.vhd index 49932ca1ecab1e776d8c41ca53574746e4992d1e..c5e3babf49bcb77568dc796923ab222233061423 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_oversampled_filterbank.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_oversampled_filterbank.vhd @@ -79,6 +79,8 @@ ENTITY node_sdp_oversampled_filterbank IS ram_fil_coefs_miso : OUT t_mem_miso; ram_gains_mosi : IN t_mem_mosi := c_mem_mosi_rst; ram_gains_miso : OUT t_mem_miso; + ram_gains_cross_mosi : IN t_mem_mosi := c_mem_mosi_rst; + ram_gains_cross_miso : OUT t_mem_miso; reg_selector_mosi : IN t_mem_mosi := c_mem_mosi_rst; reg_selector_miso : OUT t_mem_miso; reg_enable_mosi : IN t_mem_mosi := c_mem_mosi_rst; @@ -557,8 +559,10 @@ BEGIN mm_rst => mm_rst, mm_clk => mm_clk, - ram_gains_mosi => ram_gains_mosi, - ram_gains_miso => ram_gains_miso + ram_gains_mosi => ram_gains_mosi, + ram_gains_miso => ram_gains_miso, + ram_gains_cross_mosi => ram_gains_cross_mosi, + ram_gains_cross_miso => ram_gains_cross_miso ); -- Output fsub streams diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd index 10852948b277c0f473de373c932034c7ca30027d..63edbd9b6185ffb6ffb728d8fba75d823e2ccf3d 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd @@ -232,7 +232,7 @@ PACKAGE sdp_pkg is ----------------------------------------------------------------------------- -- Subband Equalizer ----------------------------------------------------------------------------- - CONSTANT c_sdp_subband_equalizer_latency : NATURAL := 7; + CONSTANT c_sdp_subband_equalizer_latency : NATURAL := 11; ----------------------------------------------------------------------------- -- Statistics offload diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd index 08ede03ff0d1dd72d00546aba4555cdc750a1234..699b97ea192af7d23dd7ae9d0bfcc25790144c84 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_station.vhd @@ -167,6 +167,8 @@ ENTITY sdp_station IS -- Equalizer gains ram_equalizer_gains_copi : IN t_mem_copi := c_mem_copi_rst; ram_equalizer_gains_cipo : OUT t_mem_cipo := c_mem_cipo_rst; + ram_equalizer_gains_cross_copi : IN t_mem_copi := c_mem_copi_rst; + ram_equalizer_gains_cross_cipo : OUT t_mem_cipo := c_mem_cipo_rst; -- DP Selector reg_dp_selector_copi : IN t_mem_copi := c_mem_copi_rst; @@ -747,7 +749,9 @@ BEGIN ram_fil_coefs_miso => ram_fil_coefs_cipo, ram_gains_mosi => ram_equalizer_gains_copi, ram_gains_miso => ram_equalizer_gains_cipo, - reg_selector_mosi => reg_dp_selector_copi, + ram_gains_cross_mosi => ram_equalizer_gains_cross_copi, + ram_gains_cross_miso => ram_equalizer_gains_cross_cipo, + reg_selector_mosi => reg_dp_selector_copi, reg_selector_miso => reg_dp_selector_cipo, reg_enable_mosi => reg_stat_enable_sst_copi, @@ -806,7 +810,9 @@ BEGIN ram_fil_coefs_miso => ram_fil_coefs_cipo, ram_gains_mosi => ram_equalizer_gains_copi, ram_gains_miso => ram_equalizer_gains_cipo, - reg_selector_mosi => reg_dp_selector_copi, + ram_gains_cross_mosi => ram_equalizer_gains_cross_copi, + ram_gains_cross_miso => ram_equalizer_gains_cross_cipo, + reg_selector_mosi => reg_dp_selector_copi, reg_selector_miso => reg_dp_selector_cipo, reg_enable_mosi => reg_stat_enable_sst_copi, diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_subband_equalizer.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_subband_equalizer.vhd index 69f6daea5876037e6e19ee2b6be75c98bf1c20da..0d1486c0ae3b67cd1f2d5d09edffbc1f0417d925 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_subband_equalizer.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_subband_equalizer.vhd @@ -25,13 +25,26 @@ -- . Implements the functionality of the subband equalizer in the subband -- filterbank (Fsub) of the LOFAR2 SDPFW design. -- Description: +-- . Block diagram: +-- +-- in_raw ----> pipeline --> * co-pol weights --+-----> Q --> out_raw +-- \-> reverse pol --> * cross-pol weights --/ \--> Q --> out_quant +-- -- . The sdp_subband_equalizer.vhd consists of mms_dp_gain_serial_arr.vhd and -- some address counter logic to select the address of the subband weight -- and a dp_requantize.vhd component. +-- . The subband equalizer can calibrate for co-polarization using only the +-- co-polarization weights from ram_gains_mosi. Or it can do full Jones +-- matrix calibration using also the cross polarization weights from +-- ram_gains_cross_mosi. +-- . Default the co-polarization weights are read from g_gains_file_name and +-- default the cross polarization weights are 0. -- . Subband widths: -- - raw_sosi : g_raw_dat_w bits -- - quant_sosi : c_quant_dat_w = g_raw_dat_w - g_raw_fraction_w bits -- Remark: +-- . If the latency of sdp_subband_equalizer.vhd is changed, then +-- c_sdp_subband_equalizer_latency in sdp_pkg.vhd needs to be updated. -- ------------------------------------------------------------------------------- @@ -44,7 +57,7 @@ USE work.sdp_pkg.ALL; ENTITY sdp_subband_equalizer IS GENERIC ( - g_gains_file_name : STRING := "UNUSED"; + g_gains_file_name : STRING := "UNUSED"; -- for co-polarization g_nof_streams : NATURAL := c_sdp_P_pfb; -- Use no default raw width, to force instance to set it g_raw_dat_w : NATURAL; -- default: c_sdp_W_subband; @@ -62,7 +75,10 @@ ENTITY sdp_subband_equalizer IS mm_clk : IN STD_LOGIC; ram_gains_mosi : IN t_mem_mosi := c_mem_mosi_rst; - ram_gains_miso : OUT t_mem_miso + ram_gains_miso : OUT t_mem_miso; + + ram_gains_cross_mosi : IN t_mem_mosi := c_mem_mosi_rst; + ram_gains_cross_miso : OUT t_mem_miso ); END sdp_subband_equalizer; @@ -75,95 +91,128 @@ ARCHITECTURE str OF sdp_subband_equalizer IS CONSTANT c_quant_dat_w : NATURAL := g_raw_dat_w - g_raw_fraction_w; - -- Pipeline requantization to easy timing closure + -- Pipeline to easy timing closure CONSTANT c_pipeline_remove_lsb : NATURAL := 1; CONSTANT c_pipeline_remove_msb : NATURAL := 1; - SIGNAL in_sosi : t_dp_sosi; - SIGNAL cnt : NATURAL RANGE 0 TO c_sdp_Q_fft * c_sdp_N_sub-1; - SIGNAL gains_rd_address : STD_LOGIC_VECTOR(c_gain_addr_w-1 DOWNTO 0); - SIGNAL weighted_raw_sosi_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); + SIGNAL in_pipe_raw_sosi_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); + SIGNAL in_cross_raw_sosi_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); + SIGNAL in_raw_sosi_2arr_2 : t_dp_sosi_2arr_2(g_nof_streams-1 DOWNTO 0); -BEGIN + SIGNAL weighted_raw_sosi_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); + SIGNAL weighted_cross_raw_sosi_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); - in_sosi <= in_raw_sosi_arr(0); -- use ctrl from input [0] + SIGNAL sum_raw_sosi_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); + +BEGIN ----------------------------------------------------------------------------- - -- Counter + -- Prepare co and cross input ----------------------------------------------------------------------------- - -- The subband weigths per PN are stored as - -- (cint16)subband_weights[S_pn/Q_fft]_[Q_fft][N_sub], but have - -- to be applied according the subband data order - -- fsub[S_pn/Q_fft]_[N_sub][Q_fft]. Therefore the counter in - -- sdp_subband_equalizer.vhd has to account for this difference in order. - p_cnt : PROCESS(dp_clk, dp_rst) - -- Use short index variables v_Q, v_SUB names in capitals, to ease - -- recognizing them as (loop) indices. - VARIABLE v_Q, v_SUB : NATURAL; - BEGIN - IF dp_rst = '1' THEN - cnt <= 0; - v_Q := 0; - v_SUB := 0; - ELSIF rising_edge(dp_clk) THEN - IF in_sosi.valid = '1' THEN - IF in_sosi.eop = '1' THEN - v_Q := 0; - v_SUB := 0; - ELSE - IF v_Q >= c_sdp_Q_fft-1 THEN - v_Q := 0; - IF v_SUB >= c_sdp_N_sub-1 THEN - v_SUB := 0; - ELSE - v_SUB := v_SUB + 1; - END IF; - ELSE - v_Q := v_Q + 1; - END IF; - END IF; - cnt <= v_Q * c_sdp_N_sub + v_SUB; - END IF; - END IF; - END PROCESS; - gains_rd_address <= TO_UVEC(cnt, c_gain_addr_w); + + -- Total pipeline of u_reverse_pol is: + -- g_pipeline_demux_in + g_pipeline_demux_out + + -- g_reverse_len - 1 + + -- g_pipeline_mux_in + g_pipeline_mux_out = 1 + 0 + 2-1 + 0 + 1 = 3 + u_pipeline_co_pol : ENTITY dp_lib.dp_pipeline_arr + GENERIC MAP ( + g_nof_streams => g_nof_streams, + g_pipeline => 3 + ) + PORT MAP ( + rst => dp_rst, + clk => dp_clk, + -- ST sink + snk_in_arr => in_raw_sosi_arr, + -- ST source + src_out_arr => in_pipe_raw_sosi_arr + ); + + -- The input subband data order is fsub[S_pn/Q_fft]_[N_sub][Q_fft] and + -- the [Q_fft] = [N_pol] index contains the X and Y polarizations. + -- Reverse the serial [N_pol] input polarizations to have the cross + -- polarization aligned with the co polarizations in + -- in_pipeline_raw_sosi_arr. + gen_cross_pol : FOR I IN 0 TO g_nof_streams-1 GENERATE + u_cross_pol : ENTITY dp_lib.dp_reverse_n_data + GENERIC MAP ( + g_pipeline_demux_in => 1, -- serial to parallel section + g_pipeline_demux_out => 0, + g_pipeline_mux_in => 0, -- parallel to serial section + g_pipeline_mux_out => 1, + g_reverse_len => c_sdp_N_pol, -- = 2 + g_data_w => 16, + g_signed => TRUE + ) + PORT MAP ( + rst => dp_rst, + clk => dp_clk, + + snk_in => in_raw_sosi_arr(I), + src_out => in_cross_raw_sosi_arr(I) + ); + END GENERATE; ----------------------------------------------------------------------------- - -- Gain + -- Apply co and cross weights ----------------------------------------------------------------------------- - u_mms_dp_gain_serial_arr : ENTITY dp_lib.mms_dp_gain_serial_arr + -- Total pipeline of sdp_subband_weights is: 5 + u_sdp_subband_weigths : ENTITY work.sdp_subband_weights GENERIC MAP ( + g_gains_file_name => g_gains_file_name, -- for co polarization g_nof_streams => g_nof_streams, - g_nof_gains => c_sdp_Q_fft * c_sdp_N_sub, - g_complex_data => TRUE, - g_complex_gain => TRUE, - g_gain_w => c_sdp_W_sub_weight, - g_in_dat_w => g_raw_dat_w, - g_out_dat_w => c_gain_out_dat_w, - g_gains_file_name => g_gains_file_name + g_raw_dat_w => g_raw_dat_w ) PORT MAP ( - -- System - mm_rst => mm_rst, - mm_clk => mm_clk, - dp_rst => dp_rst, - dp_clk => dp_clk, - - -- MM interface - ram_gains_mosi => ram_gains_mosi, - ram_gains_miso => ram_gains_miso, - - -- ST interface - gains_rd_address => gains_rd_address, - - in_sosi_arr => in_raw_sosi_arr, - out_sosi_arr => weighted_raw_sosi_arr + dp_clk => dp_clk, + dp_rst => dp_rst, + + in_raw_sosi_arr => in_pipe_raw_sosi_arr, + in_cross_raw_sosi_arr => in_cross_raw_sosi_arr, + + weighted_raw_sosi_arr => weighted_raw_sosi_arr, + weighted_cross_raw_sosi_arr => weighted_cross_raw_sosi_arr, + + mm_rst => mm_rst, + mm_clk => mm_clk, + + ram_gains_mosi => ram_gains_mosi, + ram_gains_miso => ram_gains_miso, + + ram_gains_cross_mosi => ram_gains_cross_mosi, + ram_gains_cross_miso => ram_gains_cross_miso ); + ----------------------------------------------------------------------------- + -- Sum co + cross + ----------------------------------------------------------------------------- + -- Total pipeline of u_dp_complex_add is: 1 + + gen_dp_complex_add : FOR I IN 0 TO g_nof_streams-1 GENERATE + in_raw_sosi_2arr_2(I)(0) <= weighted_raw_sosi_arr(I); + in_raw_sosi_2arr_2(I)(1) <= weighted_cross_raw_sosi_arr(I); + + u_dp_complex_add : ENTITY dp_lib.dp_complex_add + GENERIC MAP( + g_nof_inputs => c_sdp_N_pol, + g_data_w => g_raw_dat_w + ) + PORT MAP( + rst => dp_rst, + clk => dp_clk, + + snk_in_arr => in_raw_sosi_2arr_2(I), + src_out => sum_raw_sosi_arr(I) + ); + END GENERATE; + ----------------------------------------------------------------------------- -- Requantize ----------------------------------------------------------------------------- + -- Total pipeline of requantize is: + -- c_pipeline_remove_lsb + c_pipeline_remove_lsb = 1 + 1 = 2 + gen_dp_requantize : FOR I IN 0 TO g_nof_streams-1 GENERATE -- For raw output only round the c_sdp_W_sub_weight_fraction, and keep the -- g_raw_fraction_w, so that the output width remains the same as the input @@ -186,7 +235,7 @@ BEGIN rst => dp_rst, clk => dp_clk, -- ST sink - snk_in => weighted_raw_sosi_arr(I), + snk_in => sum_raw_sosi_arr(I), -- ST source src_out => out_raw_sosi_arr(I) ); @@ -211,7 +260,7 @@ BEGIN rst => dp_rst, clk => dp_clk, -- ST sink - snk_in => weighted_raw_sosi_arr(I), + snk_in => sum_raw_sosi_arr(I), -- ST source src_out => out_quant_sosi_arr(I) );