diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/hdllib.cfg b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/hdllib.cfg new file mode 100644 index 0000000000000000000000000000000000000000..5fbed189707c6bc4de62fa1af3b00b176dfb1bc5 --- /dev/null +++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/hdllib.cfg @@ -0,0 +1,104 @@ +hdl_lib_name = lofar2_unb2b_sdp_station_xsub_one +hdl_library_clause_name = lofar2_unb2b_sdp_station_xsub_one_lib +hdl_lib_uses_synth = common mm technology unb2b_board lofar2_unb2b_sdp_station +hdl_lib_uses_sim = eth +hdl_lib_technology = ip_arria10_e1sg + + synth_files = + lofar2_unb2b_sdp_station_xsub_one.vhd + +test_bench_files = + tb_lofar2_unb2b_sdp_station_xsub_one.vhd + +regression_test_vhdl = + tb_lofar2_unb2b_sdp_station_xsub_one.vhd + + +[modelsim_project_file] +modelsim_copy_files = + ../../src/data data + $RADIOHDL_WORK/libraries/dsp/filter/src/hex data # FIR filter coefficients + +[quartus_project_file] +synth_top_level_entity = + +quartus_copy_files = + # Note: path $RADIOHDL_WORK is equivalent to relative path ../../../../../../ + ../../quartus . + ../../src/data data + $RADIOHDL_WORK/libraries/dsp/filter/src/hex data # FIR filter coefficients + +quartus_qsf_files = + $RADIOHDL_WORK/boards/uniboard2b/libraries/unb2b_board/quartus/unb2b_board.qsf + +# use lofar2_unb2b_sdp_station.sdc instead because BCK_REF_CLK is 200MHz, not 644.33MHz. +quartus_sdc_files = + ../../quartus/lofar2_unb2b_sdp_station.sdc + #$RADIOHDL_WORK/boards/uniboard2b/libraries/unb2b_board/quartus/unb2b_board.sdc + +quartus_tcl_files = + ../../quartus/lofar2_unb2b_sdp_station_pins.tcl + +quartus_vhdl_files = + +quartus_qip_files = + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station_xsub_one/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station.qip + +quartus_ip_files = + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_avs_common_mm_0.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_avs_common_mm_1.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_avs_eth_0.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_clk_0.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_cpu_0.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_jesd204b.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_jtag_uart_0.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_onchip_memory2_0.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_pio_jesd_ctrl.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_pio_pps.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_pio_system_info.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_pio_wdi.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_ram_bf_weights.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_ram_diag_data_buffer_bsn.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_ram_equalizer_gains.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_ram_fil_coefs.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_ram_scrap.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_ram_ss_ss_wide.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_ram_st_bst.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_ram_st_sst.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_ram_wg.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_aduh_monitor.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_bf_scale.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_bsn_monitor_input.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_bsn_scheduler.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_bsn_source_v2.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_diag_data_buffer_bsn.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_dpmm_ctrl.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_dpmm_data.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_dp_selector.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_dp_shiftram.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_dp_xonoff.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_epcs.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_fpga_temp_sens.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_fpga_voltage_sens.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_hdr_dat.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_mmdp_ctrl.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_mmdp_data.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_nw_10gbe_eth10g.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_nw_10gbe_mac.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_remu.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_sdp_info.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_si.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_stat_enable_bst_0.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_stat_enable_bst_1.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_stat_enable_sst.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_stat_hdr_dat_bst_0.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_stat_hdr_dat_bst_1.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_stat_hdr_dat_sst.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_unb_pmbus.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_unb_sens.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_wdi.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_reg_wg.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_rom_system_info.ip + $RADIOHDL_BUILD_DIR/unb2b/quartus/lofar2_unb2b_sdp_station/ip/qsys_lofar2_unb2b_sdp_station/qsys_lofar2_unb2b_sdp_station_timer_0.ip + +nios2_app_userflags = -DCOMPILE_FOR_GEN2_UNB2 diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/lofar2_unb2b_sdp_station_xsub_one.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/lofar2_unb2b_sdp_station_xsub_one.vhd new file mode 100644 index 0000000000000000000000000000000000000000..409aaeb380a0b8e09fcd0b72c0248590fd7a9320 --- /dev/null +++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/lofar2_unb2b_sdp_station_xsub_one.vhd @@ -0,0 +1,162 @@ +------------------------------------------------------------------------------- +-- +-- 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. van der Walle +-- Purpose: +-- Wrapper for Lofar2 SDP Station filterbank design +-- Description: +-- Unb2b version for lab testing +-- Contains complete AIT input stage with 12 ADC streams and FSUB + + +LIBRARY IEEE, common_lib, unb2b_board_lib, technology_lib, diag_lib, dp_lib, tech_jesd204b_lib, lofar2_unb2b_sdp_station_lib; +USE IEEE.STD_LOGIC_1164.ALL; +USE IEEE.NUMERIC_STD.ALL; +USE common_lib.common_pkg.ALL; +USE common_lib.common_mem_pkg.ALL; +USE technology_lib.technology_pkg.ALL; +USE unb2b_board_lib.unb2b_board_pkg.ALL; +USE diag_lib.diag_pkg.ALL; +USE dp_lib.dp_stream_pkg.ALL; + +ENTITY lofar2_unb2b_sdp_station_xsub_one IS + GENERIC ( + g_design_name : STRING := "lofar2_unb2b_sdp_station_xsub_one"; + g_design_note : STRING := "Lofar2 SDP station filterbank design"; + g_sim : BOOLEAN := FALSE; --Overridden by TB + g_sim_unb_nr : NATURAL := 0; + g_sim_node_nr : NATURAL := 0; + g_stamp_date : NATURAL := 0; -- Date (YYYYMMDD) -- set by QSF + g_stamp_time : NATURAL := 0; -- Time (HHMMSS) -- set by QSF + g_revision_id : STRING := "" -- revision ID -- set by QSF + ); + PORT ( + -- GENERAL + CLK : IN STD_LOGIC; -- System Clock + PPS : IN STD_LOGIC; -- System Sync + WDI : OUT STD_LOGIC; -- Watchdog Clear + INTA : INOUT STD_LOGIC; -- FPGA interconnect line + INTB : INOUT STD_LOGIC; -- FPGA interconnect line + + -- Others + VERSION : IN STD_LOGIC_VECTOR(c_unb2b_board_aux.version_w-1 DOWNTO 0); + ID : IN STD_LOGIC_VECTOR(c_unb2b_board_aux.id_w-1 DOWNTO 0); + TESTIO : INOUT STD_LOGIC_VECTOR(c_unb2b_board_aux.testio_w-1 DOWNTO 0); + + -- I2C Interface to Sensors + SENS_SC : INOUT STD_LOGIC; + SENS_SD : INOUT STD_LOGIC; + + PMBUS_SC : INOUT STD_LOGIC; + PMBUS_SD : INOUT STD_LOGIC; + PMBUS_ALERT : IN STD_LOGIC := '0'; + + -- 1GbE Control Interface + ETH_CLK : IN STD_LOGIC; + ETH_SGIN : IN STD_LOGIC_VECTOR(c_unb2b_board_nof_eth-1 DOWNTO 0); + ETH_SGOUT : OUT STD_LOGIC_VECTOR(c_unb2b_board_nof_eth-1 DOWNTO 0); + + -- LEDs + QSFP_LED : OUT STD_LOGIC_VECTOR(c_unb2b_board_tr_qsfp_nof_leds-1 DOWNTO 0); + + -- back transceivers (note only 6 are used in unb2b) + BCK_RX : IN STD_LOGIC_VECTOR(c_unb2b_board_nof_tr_jesd204b + c_unb2b_board_start_tr_jesd204b-1 downto c_unb2b_board_nof_tr_jesd204b); + BCK_REF_CLK : IN STD_LOGIC; -- Use as JESD204B_REFCLK + + -- jesd204b syncronization signals (2 syncs) + JESD204B_SYSREF : IN STD_LOGIC; + JESD204B_SYNC_N : OUT STD_LOGIC_VECTOR(c_unb2b_board_nof_sync_jesd204b-1 DOWNTO 0) + ); +END lofar2_unb2b_sdp_station_xsub_one; + +ARCHITECTURE str OF lofar2_unb2b_sdp_station_xsub_one IS + + SIGNAL JESD204B_SERIAL_DATA : STD_LOGIC_VECTOR((c_unb2b_board_tr_jesd204b.bus_w*c_unb2b_board_tr_jesd204b.nof_bus)-1 downto 0); + SIGNAL jesd204b_sync_n_arr : STD_LOGIC_VECTOR((c_unb2b_board_tr_jesd204b.bus_w*c_unb2b_board_tr_jesd204b.nof_bus)-1 downto 0); + SIGNAL JESD204B_REFCLK : STD_LOGIC; + +BEGIN + + -- Mapping between JESD signal names and UNB2B pin/schematic names + JESD204B_REFCLK <= BCK_REF_CLK; + JESD204B_SERIAL_DATA(0) <= BCK_RX(42); + JESD204B_SERIAL_DATA(1) <= BCK_RX(43); + JESD204B_SERIAL_DATA(2) <= BCK_RX(44); + JESD204B_SERIAL_DATA(3) <= BCK_RX(45); + JESD204B_SERIAL_DATA(4) <= BCK_RX(46); + JESD204B_SERIAL_DATA(5) <= BCK_RX(47); + JESD204B_SERIAL_DATA(6) <= '0'; + JESD204B_SERIAL_DATA(7) <= '0'; + JESD204B_SERIAL_DATA(8) <= '0'; + JESD204B_SERIAL_DATA(9) <= '0'; + JESD204B_SERIAL_DATA(10) <= '0'; + JESD204B_SERIAL_DATA(11) <= '0'; + JESD204B_SYNC_N(c_unb2b_board_nof_sync_jesd204b-1 DOWNTO 0) <= jesd204b_sync_n_arr(c_unb2b_board_nof_sync_jesd204b-1 DOWNTO 0); + + + u_revision : ENTITY lofar2_unb2b_sdp_station_lib.lofar2_unb2b_sdp_station + GENERIC MAP ( + g_design_name => g_design_name, + g_design_note => g_design_note, + g_sim => g_sim, + g_sim_unb_nr => g_sim_unb_nr, + g_sim_node_nr => g_sim_node_nr, + g_stamp_date => g_stamp_date, + g_stamp_time => g_stamp_time, + g_revision_id => g_revision_id + ) + PORT MAP ( + -- GENERAL + CLK => CLK, + PPS => PPS, + WDI => WDI, + INTA => INTA, + INTB => INTB, + + -- Others + VERSION => VERSION, + ID => ID, + TESTIO => TESTIO, + + -- I2C Interface to Sensors + SENS_SC => SENS_SC, + SENS_SD => SENS_SD, + + PMBUS_SC => PMBUS_SC, + PMBUS_SD => PMBUS_SD, + PMBUS_ALERT => PMBUS_ALERT, + + -- 1GbE Control Interface + ETH_clk => ETH_clk, + ETH_SGIN => ETH_SGIN, + ETH_SGOUT => ETH_SGOUT, + + -- LEDs + QSFP_LED => QSFP_LED, + + -- back transceivers + JESD204B_SERIAL_DATA => JESD204B_SERIAL_DATA, + JESD204B_REFCLK => JESD204B_REFCLK, + + -- jesd204b syncronization signals + JESD204B_SYSREF => JESD204B_SYSREF, + JESD204B_SYNC_N => jesd204b_sync_n_arr + ); +END str; diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/tb_lofar2_unb2b_sdp_station_xsub_one.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/tb_lofar2_unb2b_sdp_station_xsub_one.vhd new file mode 100644 index 0000000000000000000000000000000000000000..54c38eeba048167511998e269bb29cabfa1ad421 --- /dev/null +++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/revisions/lofar2_unb2b_sdp_station_xsub_one/tb_lofar2_unb2b_sdp_station_xsub_one.vhd @@ -0,0 +1,371 @@ +------------------------------------------------------------------------------- +-- +-- Copyright 2020 +-- 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. van der Walle +-- Purpose: Self-checking testbench for simulating lofar2_unb2b_sdp_station_xsub_one using WG data. +-- +-- Description: +-- MM control actions: +-- +-- 1) Enable calc mode for WG via reg_diag_wg with: +-- freq = 19.921875MHz +-- ampl = 0.5 * 2**13 +-- +-- 2) Read current BSN from reg_bsn_scheduler_wg and write reg_bsn_scheduler_wg +-- to trigger start of WG at BSN. +-- +-- 3) Read subband statistics (SST) via ram_st_sst and verify with +-- c_exp_subband_power_sp_0 at c_subband_sp_0. +-- View sp_subband_power_0 in Wave window +-- +-- +-- Usage: +-- > as 7 # default +-- > as 12 # for detailed debugging +-- > run -a +-- +------------------------------------------------------------------------------- +LIBRARY IEEE, common_lib, unb2b_board_lib, i2c_lib, mm_lib, dp_lib, diag_lib, lofar2_sdp_lib, wpfb_lib, lofar2_unb2b_sdp_station_lib; +USE IEEE.std_logic_1164.ALL; +USE IEEE.numeric_std.ALL; +USE IEEE.MATH_REAL.ALL; +USE common_lib.common_pkg.ALL; +USE unb2b_board_lib.unb2b_board_pkg.ALL; +USE common_lib.tb_common_pkg.ALL; +USE common_lib.common_str_pkg.ALL; +USE mm_lib.mm_file_pkg.ALL; +USE dp_lib.dp_stream_pkg.ALL; +USE mm_lib.mm_file_unb_pkg.ALL; +USE diag_lib.diag_pkg.ALL; +USE wpfb_lib.wpfb_pkg.ALL; +USE lofar2_sdp_lib.sdp_pkg.ALL; + +ENTITY tb_lofar2_unb2b_sdp_station_xsub_one IS +END tb_lofar2_unb2b_sdp_station_xsub_one; + +ARCHITECTURE tb OF tb_lofar2_unb2b_sdp_station_xsub_one IS + + CONSTANT c_sim : BOOLEAN := TRUE; + CONSTANT c_unb_nr : NATURAL := 0; -- UniBoard 0 + CONSTANT c_node_nr : NATURAL := 0; + CONSTANT c_id : STD_LOGIC_VECTOR(7 DOWNTO 0) := "00000000"; + CONSTANT c_version : STD_LOGIC_VECTOR(1 DOWNTO 0) := "00"; + CONSTANT c_fw_version : t_unb2b_board_fw_version := (1, 0); + + CONSTANT c_eth_clk_period : TIME := 8 ns; -- 125 MHz XO on UniBoard + CONSTANT c_ext_clk_period : TIME := 5 ns; + CONSTANT c_bck_ref_clk_period : TIME := 5 ns; + + CONSTANT c_tb_clk_period : TIME := 100 ps; -- use fast tb_clk to speed up M&C + + CONSTANT c_nof_block_per_sync : NATURAL := 32; + CONSTANT c_nof_clk_per_sync : NATURAL := c_nof_block_per_sync*c_sdp_N_fft; + CONSTANT c_pps_period : NATURAL := c_nof_clk_per_sync; + CONSTANT c_wpfb_sim : t_wpfb := func_wpfb_set_nof_block_per_sync(c_sdp_wpfb_subbands, c_nof_block_per_sync); + + CONSTANT c_percentage : REAL := 0.05; -- percentage that actual value may differ from expected value + CONSTANT c_lo_factor : REAL := 1.0 - c_percentage; -- lower boundary + CONSTANT c_hi_factor : REAL := 1.0 + c_percentage; -- higher boundary + + -- WG + CONSTANT c_full_scale_ampl : REAL := REAL(2**(14-1)-1); -- = full scale of WG + CONSTANT c_bsn_start_wg : NATURAL := 2; -- start WG at this BSN to instead of some BSN, to avoid mismatches in exact expected data values + CONSTANT c_ampl_sp_0 : NATURAL := 2**(c_sdp_W_adc-1)/2; -- in number of lsb + CONSTANT c_wg_subband_freq_unit : REAL := c_diag_wg_freq_unit/REAL(c_sdp_N_fft); -- subband freq = Fs/1024 = 200 MSps/1024 = 195312.5 Hz sinus + CONSTANT c_wg_freq_offset : REAL := 0.0/11.0; -- in freq_unit + CONSTANT c_subband_sp_0 : REAL := 102.0; -- Select subband at index 102 = 102/1024 * 200MHz = 19.921875 MHz + CONSTANT c_wg_ampl_lsb : REAL := c_diag_wg_ampl_unit / c_full_scale_ampl; -- amplitude in number of LSbit resolution steps + CONSTANT c_exp_wg_power_sp_0 : REAL := REAL(c_ampl_sp_0**2)/2.0 * REAL(c_nof_clk_per_sync); + + -- WPFB + CONSTANT c_nof_pfb : NATURAL := 1; -- Verifying 1 of c_sdp_P_pfb = 6 pfb to speed up simulation. + CONSTANT c_wb_leakage_bin : NATURAL := c_wpfb_sim.nof_points / c_wpfb_sim.wb_factor; -- = 256, leakage will occur in this bin if FIR wb_factor is reversed + CONSTANT c_exp_sp_subband_power_ratio : REAL := 1.0/8.0; -- depends on internal WPFB quantization and FIR coefficients + CONSTANT c_exp_sp_subband_power_sum_ratio : REAL := c_exp_sp_subband_power_ratio; -- because all sinus power is expected in one subband + CONSTANT c_exp_subband_power_sp_0 : REAL := c_exp_wg_power_sp_0 * c_exp_sp_subband_power_ratio; + + TYPE t_real_arr IS ARRAY (INTEGER RANGE <>) OF REAL; + + -- MM + CONSTANT c_mm_file_reg_bsn_source_v2 : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_BSN_SOURCE_V2"; + CONSTANT c_mm_file_reg_bsn_scheduler_wg : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_BSN_SCHEDULER"; + CONSTANT c_mm_file_reg_diag_wg : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_WG"; + CONSTANT c_mm_file_ram_st_sst : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "RAM_ST_SST"; + CONSTANT c_mm_file_reg_crosslets_info : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_CROSSLETS_INFO"; + CONSTANT c_mm_file_reg_bsn_scheduler_xsub : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "REG_BSN_SCHEDULER_XSUB"; + CONSTANT c_mm_file_ram_st_xsq : STRING := mmf_unb_file_prefix(c_unb_nr, c_node_nr) & "RAM_ST_XSQ"; + + -- Tb + SIGNAL tb_end : STD_LOGIC := '0'; + SIGNAL sim_done : STD_LOGIC := '0'; + SIGNAL tb_clk : STD_LOGIC := '0'; + SIGNAL rd_data : STD_LOGIC_VECTOR(c_32-1 DOWNTO 0) := (OTHERS => '0'); + + -- WG + SIGNAL current_bsn_wg : STD_LOGIC_VECTOR(c_dp_stream_bsn_w-1 DOWNTO 0); + + -- WPFB + SIGNAL xsub_stats_arr : t_slv_64_arr(0 TO c_nof_complex * c_sdp_S_pn**2 -1); + + + -- DUT + SIGNAL ext_clk : STD_LOGIC := '0'; + SIGNAL pps : STD_LOGIC := '0'; + SIGNAL ext_pps : STD_LOGIC := '0'; + SIGNAL pps_rst : STD_LOGIC := '0'; + + SIGNAL WDI : STD_LOGIC; + SIGNAL INTA : STD_LOGIC; + SIGNAL INTB : STD_LOGIC; + + SIGNAL eth_clk : STD_LOGIC := '0'; + SIGNAL eth_txp : STD_LOGIC_VECTOR(c_unb2b_board_nof_eth-1 downto 0) := (OTHERS => '0'); + SIGNAL eth_rxp : STD_LOGIC_VECTOR(c_unb2b_board_nof_eth-1 downto 0) := (OTHERS => '0'); + + SIGNAL sens_scl : STD_LOGIC; + SIGNAL sens_sda : STD_LOGIC; + SIGNAL pmbus_scl : STD_LOGIC; + SIGNAL pmbus_sda : STD_LOGIC; + + -- back transceivers + SIGNAL JESD204B_SERIAL_DATA : STD_LOGIC_VECTOR((c_unb2b_board_tr_jesd204b.bus_w * c_unb2b_board_tr_jesd204b.nof_bus)-1 downto 0); + SIGNAL JESD204B_REFCLK : STD_LOGIC := '1'; + + -- jesd204b syncronization signals + SIGNAL jesd204b_sysref : STD_LOGIC; + SIGNAL jesd204b_sync_n : STD_LOGIC_VECTOR((c_unb2b_board_tr_jesd204b.nof_bus * c_unb2b_board_tr_jesd204b.bus_w)-1 DOWNTO 0); + +BEGIN + + ---------------------------------------------------------------------------- + -- System setup + ---------------------------------------------------------------------------- + ext_clk <= NOT ext_clk AFTER c_ext_clk_period/2; -- External clock (200 MHz) + JESD204B_REFCLK <= NOT JESD204B_REFCLK AFTER c_bck_ref_clk_period/2; -- JESD sample clock (200MHz) + + INTA <= 'H'; -- pull up + INTB <= 'H'; -- pull up + + sens_scl <= 'H'; -- pull up + sens_sda <= 'H'; -- pull up + pmbus_scl <= 'H'; -- pull up + pmbus_sda <= 'H'; -- pull up + + ------------------------------------------------------------------------------ + -- External PPS + ------------------------------------------------------------------------------ + proc_common_gen_pulse(5, c_pps_period, '1', pps_rst, ext_clk, pps); + jesd204b_sysref <= pps; + ext_pps <= pps; + + ------------------------------------------------------------------------------ + -- DUT + ------------------------------------------------------------------------------ + u_lofar_unb2b_sdp_station_xsub_one : ENTITY lofar2_unb2b_sdp_station_lib.lofar2_unb2b_sdp_station + GENERIC MAP ( + g_design_name => "lofar2_unb2b_sdp_station_xsub_one", + g_design_note => "", + g_sim => c_sim, + g_sim_unb_nr => c_unb_nr, + g_sim_node_nr => c_node_nr, + g_wpfb => c_wpfb_sim, + g_bsn_nof_clk_per_sync => c_nof_clk_per_sync, + g_scope_selected_subband => NATURAL(c_subband_sp_0) + ) + PORT MAP ( + -- GENERAL + CLK => ext_clk, + PPS => pps, + WDI => WDI, + INTA => INTA, + INTB => INTB, + + -- Others + VERSION => c_version, + ID => c_id, + TESTIO => open, + + -- I2C Interface to Sensors + SENS_SC => sens_scl, + SENS_SD => sens_sda, + + PMBUS_SC => pmbus_scl, + PMBUS_SD => pmbus_sda, + PMBUS_ALERT => open, + + -- 1GbE Control Interface + ETH_CLK => eth_clk, + ETH_SGIN => eth_rxp, + ETH_SGOUT => eth_txp, + + -- LEDs + QSFP_LED => open, + + -- back transceivers + JESD204B_SERIAL_DATA => JESD204B_SERIAL_DATA, + JESD204B_REFCLK => JESD204B_REFCLK, + + -- jesd204b syncronization signals + JESD204B_SYSREF => jesd204b_sysref, + JESD204B_SYNC_N => jesd204b_sync_n + ); + + ------------------------------------------------------------------------------ + -- MM slave accesses via file IO + ------------------------------------------------------------------------------ + tb_clk <= NOT tb_clk AFTER c_tb_clk_period/2; -- Testbench MM clock + + p_mm_stimuli : PROCESS + VARIABLE v_bsn : NATURAL; + VARIABLE v_sp_subband_power : REAL; + VARIABLE v_W, v_C, v_A, v_X, v_B, v_A_even, v_B_even : NATURAL; -- array indicies + BEGIN + -- Wait for DUT power up after reset + WAIT FOR 1 us; + + -- wait for pps + proc_common_wait_until_hi_lo(ext_clk, ext_pps); + + ---------------------------------------------------------------------------- + -- Enable BSN + ---------------------------------------------------------------------------- + mmf_mm_bus_wr(c_mm_file_reg_bsn_source_v2, 3, 0, tb_clk); + mmf_mm_bus_wr(c_mm_file_reg_bsn_source_v2, 2, 0, tb_clk); -- Init BSN = 0 + mmf_mm_bus_wr(c_mm_file_reg_bsn_source_v2, 1, c_nof_clk_per_sync, tb_clk); -- nof_block_per_sync + mmf_mm_bus_wr(c_mm_file_reg_bsn_source_v2, 0, 16#00000003#, tb_clk); -- Enable BSN at PPS + + ---------------------------------------------------------------------------- + -- Crosslets Info + ---------------------------------------------------------------------------- + mmf_mm_bus_wr(c_mm_file_reg_crosslets_info, 0, INTEGER(c_subband_sp_0), tb_clk); -- offset + mmf_mm_bus_wr(c_mm_file_reg_crosslets_info, 15, 0 , tb_clk); -- stepsize + + ---------------------------------------------------------------------------- + -- Enable WG + ---------------------------------------------------------------------------- + -- 0 : mode[7:0] --> off=0, calc=1, repeat=2, single=3) + -- nof_samples[31:16] --> <= c_ram_wg_size=1024 + -- 1 : phase[15:0] + -- 2 : freq[30:0] + -- 3 : ampl[16:0] + FOR I IN 0 TO c_sdp_S_pn-1 LOOP + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 0, 1024*2**16 + 1, tb_clk); -- nof_samples, mode calc + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 1, INTEGER( 0.0 * c_diag_wg_phase_unit), tb_clk); -- phase offset in degrees + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 2, INTEGER((c_subband_sp_0+c_wg_freq_offset) * c_wg_subband_freq_unit), tb_clk); -- freq + mmf_mm_bus_wr(c_mm_file_reg_diag_wg, I*4 + 3, INTEGER(REAL(c_ampl_sp_0) * c_wg_ampl_lsb), tb_clk); -- ampl + END LOOP; + + -- Read current BSN + mmf_mm_bus_rd(c_mm_file_reg_bsn_scheduler_wg, 0, current_bsn_wg(31 DOWNTO 0), tb_clk); + mmf_mm_bus_rd(c_mm_file_reg_bsn_scheduler_wg, 1, current_bsn_wg(63 DOWNTO 32), tb_clk); + proc_common_wait_some_cycles(tb_clk, 1); + + -- Write scheduler BSN to trigger start of WG at next block + v_bsn := TO_UINT(current_bsn_wg) + 2; + ASSERT v_bsn <= c_bsn_start_wg REPORT "Too late to start WG: " & int_to_str(v_bsn) & " > " & int_to_str(c_bsn_start_wg) SEVERITY ERROR; + mmf_mm_bus_wr(c_mm_file_reg_bsn_scheduler_wg, 0, c_bsn_start_wg, tb_clk); -- first write low then high part + mmf_mm_bus_wr(c_mm_file_reg_bsn_scheduler_wg, 1, 0, tb_clk); -- assume v_bsn < 2**31-1 + -- bsn_scheduler_xsub + mmf_mm_bus_wr(c_mm_file_reg_bsn_scheduler_xsub, 0, c_bsn_start_wg, tb_clk); -- first write low then high part + mmf_mm_bus_wr(c_mm_file_reg_bsn_scheduler_xsub, 1, 0, tb_clk); -- assume v_bsn < 2**31-1 + + -- Wait for enough WG data and start of sync interval + + mmf_mm_wait_until_value(c_mm_file_reg_bsn_scheduler_wg, 0, -- read BSN low + "UNSIGNED", rd_data, ">=", c_nof_block_per_sync * 3, -- this is the wait until condition + c_sdp_T_sub, tb_clk); + + --------------------------------------------------------------------------- + -- Read crosslet statistics + --------------------------------------------------------------------------- + FOR I IN 0 TO c_nof_complex * 144 * 2 -1 LOOP + v_W := I MOD 2; + v_B := I / 2; + IF v_W=0 THEN + -- low part + mmf_mm_bus_rd(c_mm_file_ram_st_xsq, I, rd_data, tb_clk); + xsub_stats_arr(v_B)(31 DOWNTO 0) <= rd_data; + ELSE + -- high part + mmf_mm_bus_rd(c_mm_file_ram_st_xsq, I, rd_data, tb_clk); + xsub_stats_arr(v_B)(63 DOWNTO 32) <= rd_data; + END IF; + END LOOP; + + + proc_common_wait_some_cycles(tb_clk, 1); + + --------------------------------------------------------------------------- + -- Verify crosslet statistics + --------------------------------------------------------------------------- + -- With all WGs having the same input all crosslets should be identical. Due to the filterbank + -- the two signals in the output pairs per P_pfb differ slightly, therefore 3 slightly different + -- correlation values are expected. 1 for each correlation between even indexed signals, 1 for + -- odd indexed signals and 1 for correlations between even and odd indexed signals. This is verified by + -- checking if these values are the same. + FOR I IN 0 TO c_nof_complex * c_sdp_S_pn **2 -1 LOOP + v_C := I MOD 2; + v_X := I /c_nof_complex; + v_A := v_X MOD c_sdp_S_pn; + v_B := v_X / c_sdp_S_pn; + v_A_even := v_A MOD 2; + v_B_even := v_B MOD 2; + + -- Check real values of even indices + IF v_C=0 AND v_A_even=0 AND v_B_even=0 THEN + ASSERT SIGNED(xsub_stats_arr(I)) = SIGNED(xsub_stats_arr(0)) REPORT "correlation between even indexed signals (re) is wrong at I = " & int_to_str(I) SEVERITY ERROR; END IF; + + -- Check real values of odd indices + IF v_C=0 AND v_A_even=1 AND v_B_even=1 THEN + ASSERT SIGNED(xsub_stats_arr(I)) = SIGNED(xsub_stats_arr((c_sdp_S_pn + 1) * c_nof_complex)) REPORT "correlation between odd indexed signals (re) is wrong at I = " & int_to_str(I) SEVERITY ERROR; END IF; + + -- Check real values of even correlated with odd indices + IF v_C=0 AND (v_A_even=0 XOR v_B_even=0) THEN + ASSERT SIGNED(xsub_stats_arr(I)) = SIGNED(xsub_stats_arr(1 * c_nof_complex)) REPORT "correlation between even indexed signals (re) is wrong at I = " & int_to_str(I) SEVERITY ERROR; END IF; + + -- Using absolute value of the imaginary part (force positive) as the sign can be opposite when comparing A to B vs B to A. + -- Check im values of even indices + IF v_C=1 AND v_A_even=0 AND v_B_even=0 THEN + ASSERT ABS(SIGNED(xsub_stats_arr(I))) = ABS(SIGNED(xsub_stats_arr(1))) REPORT "correlation between even indexed signals (im) is wrong at I = " & int_to_str(I) SEVERITY ERROR; END IF; + + -- Check im values of odd indices + IF v_C=1 AND v_A_even=1 AND v_B_even=1 THEN + ASSERT ABS(SIGNED(xsub_stats_arr(I))) = ABS(SIGNED(xsub_stats_arr((c_sdp_S_pn + 1) * c_nof_complex + 1))) REPORT "correlation between odd indexed signals (im) is wrong at I = " & int_to_str(I) SEVERITY ERROR; END IF; + + -- Check im values of even correlated with odd indices + IF v_C=1 AND (v_A_even=0 XOR v_B_even=0) THEN + ASSERT ABS(SIGNED(xsub_stats_arr(I))) = ABS(SIGNED(xsub_stats_arr(1 * c_nof_complex + 1))) REPORT "correlation between even/odd indexed signals (im) is wrong at I = " & int_to_str(I) SEVERITY ERROR; END IF; + + -- Check if values are > 0 + IF v_C=0 THEN ASSERT (SIGNED(xsub_stats_arr(I)) > TO_SIGNED(0, c_longword_w)) REPORT "correlation is 0 which is unexpected! at I = " & int_to_str(I) SEVERITY ERROR; END IF; + END LOOP; + + --------------------------------------------------------------------------- + -- End Simulation + --------------------------------------------------------------------------- + sim_done <= '1'; + proc_common_wait_some_cycles(ext_clk, 100); + proc_common_stop_simulation(TRUE, ext_clk, sim_done, tb_end); + WAIT; + END PROCESS; + +END tb; 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 1793c7e65cbf4ca8dd410329816b608b2f1e520f..55d56fe1992e4da559138d298c64ed381341b902 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 @@ -266,7 +266,7 @@ ARCHITECTURE str OF lofar2_unb2b_sdp_station IS SIGNAL reg_aduh_monitor_miso : t_mem_miso := c_mem_miso_rst; ---------------------------------------------- - -- FUSB + -- FSUB ---------------------------------------------- -- Subband statistics SIGNAL ram_st_sst_mosi : t_mem_mosi := c_mem_mosi_rst; @@ -294,6 +294,25 @@ ARCHITECTURE str OF lofar2_unb2b_sdp_station IS SIGNAL reg_sdp_info_mosi : t_mem_mosi := c_mem_mosi_rst; SIGNAL reg_sdp_info_miso : t_mem_miso := c_mem_miso_rst; + ---------------------------------------------- + -- XSUB + ---------------------------------------------- + -- dp_sync_insert_v2 + SIGNAL reg_dp_sync_insert_v2_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL reg_dp_sync_insert_v2_miso : t_mem_miso := c_mem_miso_rst; + + -- crosslets_info + SIGNAL reg_crosslets_info_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL reg_crosslets_info_miso : t_mem_miso := c_mem_miso_rst; + + -- bsn_scheduler_xsub + SIGNAL reg_bsn_scheduler_xsub_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL reg_bsn_scheduler_xsub_miso : t_mem_miso := c_mem_miso_rst; + + -- st_xsq + SIGNAL ram_st_xsq_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL ram_st_xsq_miso : t_mem_miso := c_mem_miso_rst; + ---------------------------------------------- -- BF ---------------------------------------------- @@ -379,6 +398,8 @@ ARCHITECTURE str OF lofar2_unb2b_sdp_station IS SIGNAL bf_udp_siso_arr : t_dp_siso_arr(c_sdp_N_beamsets-1 DOWNTO 0); SIGNAL bf_10GbE_hdr_fields_out_arr : t_slv_1024_arr(c_sdp_N_beamsets-1 DOWNTO 0); + SIGNAL out_crosslets_info : STD_LOGIC_VECTOR(c_sdp_crosslets_info_reg_w-1 DOWNTO 0); + -- 10GbE SIGNAL tr_ref_clk_312 : STD_LOGIC; SIGNAL tr_ref_clk_156 : STD_LOGIC; @@ -675,7 +696,15 @@ BEGIN reg_stat_enable_bst_1_mosi => reg_stat_enable_bst_mosi_arr(1), reg_stat_enable_bst_1_miso => reg_stat_enable_bst_miso_arr(1), reg_stat_hdr_dat_bst_1_mosi => reg_stat_hdr_dat_bst_mosi_arr(1), - reg_stat_hdr_dat_bst_1_miso => reg_stat_hdr_dat_bst_miso_arr(1) + reg_stat_hdr_dat_bst_1_miso => reg_stat_hdr_dat_bst_miso_arr(1), + 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 ); ----------------------------------------------------------------------------- @@ -814,6 +843,39 @@ BEGIN ); END GENERATE; + + ----------------------------------------------------------------------------- + -- node_sdp_correlator (XSUB) + ----------------------------------------------------------------------------- + gen_use_xsub : IF c_revision_select.use_xsub GENERATE + u_xsub : ENTITY lofar2_sdp_lib.node_sdp_correlator + GENERIC MAP( + g_sim => g_sim, + g_P_sq => c_revision_select.P_sq + ) + PORT MAP( + dp_clk => dp_clk, + dp_rst => dp_rst, + + in_sosi_arr => fsub_sosi_arr, + + 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, + + out_crosslets_info => out_crosslets_info + + ); + END GENERATE; + ----------------------------------------------------------------------------- -- nof beamsets node_sdp_beamformers (BF) ----------------------------------------------------------------------------- diff --git a/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station_pkg.vhd b/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station_pkg.vhd index 339ec50a03a9f8a7ce3fb4089d80ed6e44971fa1..a51d1ab304fcdd594f6938950980950ec68e180c 100644 --- a/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station_pkg.vhd +++ b/applications/lofar2/designs/lofar2_unb2b_sdp_station/src/vhdl/lofar2_unb2b_sdp_station_pkg.vhd @@ -35,12 +35,15 @@ PACKAGE lofar2_unb2b_sdp_station_pkg IS no_jesd : BOOLEAN; use_fsub : BOOLEAN; use_bf : BOOLEAN; + use_xsub : BOOLEAN; + P_sq : NATURAL; END RECORD; - CONSTANT c_ait : t_lofar2_unb2b_sdp_station_config := (FALSE, FALSE, FALSE); - CONSTANT c_fsub : t_lofar2_unb2b_sdp_station_config := (FALSE, TRUE, FALSE); - CONSTANT c_bf : t_lofar2_unb2b_sdp_station_config := (FALSE, TRUE, TRUE); - CONSTANT c_full : t_lofar2_unb2b_sdp_station_config := (FALSE, TRUE, TRUE); + CONSTANT c_ait : t_lofar2_unb2b_sdp_station_config := (FALSE, FALSE, FALSE, FALSE, 0); + CONSTANT c_fsub : t_lofar2_unb2b_sdp_station_config := (FALSE, TRUE, FALSE, FALSE, 0); + CONSTANT c_bf : t_lofar2_unb2b_sdp_station_config := (FALSE, TRUE, TRUE, FALSE, 0); + CONSTANT c_xsub_one : t_lofar2_unb2b_sdp_station_config := (FALSE, TRUE, FALSE, TRUE, 1); + CONSTANT c_full : t_lofar2_unb2b_sdp_station_config := (FALSE, TRUE, TRUE, TRUE, 1); -- Function to select the revision configuration. FUNCTION func_sel_revision_rec(g_design_name : STRING) RETURN t_lofar2_unb2b_sdp_station_config; @@ -53,9 +56,10 @@ PACKAGE BODY lofar2_unb2b_sdp_station_pkg IS FUNCTION func_sel_revision_rec(g_design_name : STRING) RETURN t_lofar2_unb2b_sdp_station_config IS BEGIN - IF g_design_name = "lofar2_unb2b_sdp_station_adc" THEN RETURN c_ait; - ELSIF g_design_name = "lofar2_unb2b_sdp_station_fsub" THEN RETURN c_fsub; - ELSIF g_design_name = "lofar2_unb2b_sdp_station_bf" THEN RETURN c_bf; + IF g_design_name = "lofar2_unb2b_sdp_station_adc" THEN RETURN c_ait; + ELSIF g_design_name = "lofar2_unb2b_sdp_station_fsub" THEN RETURN c_fsub; + ELSIF g_design_name = "lofar2_unb2b_sdp_station_bf" THEN RETURN c_bf; + ELSIF g_design_name = "lofar2_unb2b_sdp_station_xsub_one" THEN RETURN c_xsub_one; ELSE RETURN c_full; END IF; END; 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 1021899a027b7b34c3f577bc7a70f2c46a1db693..d6824efd58137577733eaea074e5f183eaad01e7 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 @@ -206,6 +206,22 @@ ENTITY mmm_lofar2_unb2b_sdp_station IS reg_stat_hdr_dat_bst_1_mosi : OUT t_mem_mosi; reg_stat_hdr_dat_bst_1_miso : IN t_mem_miso; + -- dp_sync_insert_v2 + reg_dp_sync_insert_v2_mosi : OUT t_mem_mosi; + reg_dp_sync_insert_v2_miso : IN t_mem_miso; + + -- crosslets_info + reg_crosslets_info_mosi : OUT t_mem_mosi; + reg_crosslets_info_miso : IN t_mem_miso; + + -- bsn_scheduler_xsub + reg_bsn_scheduler_xsub_mosi : OUT t_mem_mosi; + reg_bsn_scheduler_xsub_miso : IN t_mem_miso; + + -- st_xsq (XST) + ram_st_xsq_mosi : OUT t_mem_mosi; + ram_st_xsq_miso : IN t_mem_miso; + -- 10 GbE mac reg_nw_10GbE_mac_mosi : OUT t_mem_mosi; reg_nw_10GbE_mac_miso : IN t_mem_miso; @@ -349,6 +365,18 @@ BEGIN u_mm_file_reg_stat_hdr_info_bst_1 : mm_file GENERIC MAP(mmf_unb_file_prefix(g_sim_unb_nr, c_sim_node_nr, c_sim_node_type) & "REG_STAT_HDR_DAT_BST_1") PORT MAP(mm_rst, mm_clk, reg_stat_hdr_dat_bst_1_mosi, reg_stat_hdr_dat_bst_1_miso); + u_mm_file_reg_dp_sync_insert_v2 : mm_file GENERIC MAP(mmf_unb_file_prefix(g_sim_unb_nr, c_sim_node_nr, c_sim_node_type) & "REG_DP_SYNC_INSERT_V2") + PORT MAP(mm_rst, mm_clk, reg_dp_sync_insert_v2_mosi, reg_dp_sync_insert_v2_miso); + + u_mm_file_reg_crosslets_info : mm_file GENERIC MAP(mmf_unb_file_prefix(g_sim_unb_nr, c_sim_node_nr, c_sim_node_type) & "REG_CROSSLETS_INFO") + PORT MAP(mm_rst, mm_clk, reg_crosslets_info_mosi, reg_crosslets_info_miso); + + u_mm_file_reg_bsn_scheduler_xsub : mm_file GENERIC MAP(mmf_unb_file_prefix(g_sim_unb_nr, c_sim_node_nr, c_sim_node_type) & "REG_BSN_SCHEDULER_XSUB") + PORT MAP(mm_rst, mm_clk, reg_bsn_scheduler_xsub_mosi, reg_bsn_scheduler_xsub_miso); + + u_mm_file_ram_st_xsq : mm_file GENERIC MAP(mmf_unb_file_prefix(g_sim_unb_nr, c_sim_node_nr, c_sim_node_type) & "RAM_ST_XSQ") + PORT MAP(mm_rst, mm_clk, ram_st_xsq_mosi, ram_st_xsq_miso); + u_mm_file_reg_nw_10GbE_mac : mm_file GENERIC MAP(mmf_unb_file_prefix(g_sim_unb_nr, c_sim_node_nr, c_sim_node_type) & "REG_NW_10GBE_MAC") PORT MAP(mm_rst, mm_clk, reg_nw_10GbE_mac_mosi, reg_nw_10GbE_mac_miso ); @@ -749,6 +777,38 @@ BEGIN reg_stat_hdr_dat_bst_1_read_export => reg_stat_hdr_dat_bst_1_mosi.rd, reg_stat_hdr_dat_bst_1_readdata_export => reg_stat_hdr_dat_bst_1_miso.rddata(c_word_w-1 DOWNTO 0), + reg_dp_sync_insert_v2_clk_export => OPEN, + reg_dp_sync_insert_v2_reset_export => OPEN, + reg_dp_sync_insert_v2_address_export => reg_dp_sync_insert_v2_mosi.address(c_sdp_reg_dp_sync_insert_v2_addr_w-1 DOWNTO 0), + reg_dp_sync_insert_v2_write_export => reg_dp_sync_insert_v2_mosi.wr, + reg_dp_sync_insert_v2_writedata_export => reg_dp_sync_insert_v2_mosi.wrdata(c_word_w-1 DOWNTO 0), + reg_dp_sync_insert_v2_read_export => reg_dp_sync_insert_v2_mosi.rd, + reg_dp_sync_insert_v2_readdata_export => reg_dp_sync_insert_v2_miso.rddata(c_word_w-1 DOWNTO 0), + + reg_crosslets_info_clk_export => OPEN, + reg_crosslets_info_reset_export => OPEN, + reg_crosslets_info_address_export => reg_crosslets_info_mosi.address(c_sdp_reg_crosslets_info_addr_w-1 DOWNTO 0), + reg_crosslets_info_write_export => reg_crosslets_info_mosi.wr, + reg_crosslets_info_writedata_export => reg_crosslets_info_mosi.wrdata(c_word_w-1 DOWNTO 0), + reg_crosslets_info_read_export => reg_crosslets_info_mosi.rd, + reg_crosslets_info_readdata_export => reg_crosslets_info_miso.rddata(c_word_w-1 DOWNTO 0), + + reg_bsn_scheduler_xsub_clk_export => OPEN, + reg_bsn_scheduler_xsub_reset_export => OPEN, + reg_bsn_scheduler_xsub_address_export => reg_bsn_scheduler_xsub_mosi.address(c_sdp_reg_bsn_scheduler_xsub_addr_w-1 DOWNTO 0), + reg_bsn_scheduler_xsub_write_export => reg_bsn_scheduler_xsub_mosi.wr, + reg_bsn_scheduler_xsub_writedata_export => reg_bsn_scheduler_xsub_mosi.wrdata(c_word_w-1 DOWNTO 0), + reg_bsn_scheduler_xsub_read_export => reg_bsn_scheduler_xsub_mosi.rd, + reg_bsn_scheduler_xsub_readdata_export => reg_bsn_scheduler_xsub_miso.rddata(c_word_w-1 DOWNTO 0), + + ram_st_xsq_clk_export => OPEN, + ram_st_xsq_reset_export => OPEN, + ram_st_xsq_address_export => ram_st_xsq_mosi.address(c_sdp_ram_st_xsq_addr_w-1 DOWNTO 0), + ram_st_xsq_write_export => ram_st_xsq_mosi.wr, + ram_st_xsq_writedata_export => ram_st_xsq_mosi.wrdata(c_word_w-1 DOWNTO 0), + ram_st_xsq_read_export => ram_st_xsq_mosi.rd, + ram_st_xsq_readdata_export => ram_st_xsq_miso.rddata(c_word_w-1 DOWNTO 0), + reg_nw_10GbE_mac_clk_export => OPEN, reg_nw_10GbE_mac_reset_export => OPEN, reg_nw_10GbE_mac_address_export => reg_nw_10GbE_mac_mosi.address(c_sdp_reg_nw_10GbE_mac_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 f4f915592f2f5676e97b63d237e533e52fab2c98..0a35a58be6f9fa1c4c6aea50c36021a2ada706e3 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 @@ -329,6 +329,34 @@ PACKAGE qsys_lofar2_unb2b_sdp_station_pkg IS reg_stat_hdr_dat_bst_1_reset_export : out std_logic; -- export reg_stat_hdr_dat_bst_1_write_export : out std_logic; -- export reg_stat_hdr_dat_bst_1_writedata_export : out std_logic_vector(31 downto 0); -- export + reg_dp_sync_insert_v2_address_export : out std_logic_vector(0 downto 0); -- export + reg_dp_sync_insert_v2_clk_export : out std_logic; -- export + reg_dp_sync_insert_v2_read_export : out std_logic; -- export + reg_dp_sync_insert_v2_readdata_export : in std_logic_vector(31 downto 0) := (others => 'X'); -- export + reg_dp_sync_insert_v2_reset_export : out std_logic; -- export + reg_dp_sync_insert_v2_write_export : out std_logic; -- export + reg_dp_sync_insert_v2_writedata_export : out std_logic_vector(31 downto 0); -- export + reg_crosslets_info_address_export : out std_logic_vector(3 downto 0); -- export + reg_crosslets_info_clk_export : out std_logic; -- export + reg_crosslets_info_read_export : out std_logic; -- export + reg_crosslets_info_readdata_export : in std_logic_vector(31 downto 0) := (others => 'X'); -- export + reg_crosslets_info_reset_export : out std_logic; -- export + reg_crosslets_info_write_export : out std_logic; -- export + reg_crosslets_info_writedata_export : out std_logic_vector(31 downto 0); -- export + reg_bsn_scheduler_xsub_address_export : out std_logic_vector(0 downto 0); -- export + reg_bsn_scheduler_xsub_clk_export : out std_logic; -- export + reg_bsn_scheduler_xsub_read_export : out std_logic; -- export + reg_bsn_scheduler_xsub_readdata_export : in std_logic_vector(31 downto 0) := (others => 'X'); -- export + reg_bsn_scheduler_xsub_reset_export : out std_logic; -- export + reg_bsn_scheduler_xsub_write_export : out std_logic; -- export + reg_bsn_scheduler_xsub_writedata_export : out std_logic_vector(31 downto 0); -- export + ram_st_xsq_address_export : out std_logic_vector(12 downto 0); -- export + ram_st_xsq_clk_export : out std_logic; -- export + ram_st_xsq_read_export : out std_logic; -- export + ram_st_xsq_readdata_export : in std_logic_vector(31 downto 0) := (others => 'X'); -- export + ram_st_xsq_reset_export : out std_logic; -- export + ram_st_xsq_write_export : out std_logic; -- export + ram_st_xsq_writedata_export : out std_logic_vector(31 downto 0); -- export reg_si_address_export : out std_logic_vector(0 downto 0); -- export reg_si_clk_export : out std_logic; -- export reg_si_read_export : out std_logic; -- export 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 1a28839eecb89d4fec64d3176b3d0bed61bb06d9..cdeb290bef11bc5446e7225bc071794d900562f3 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/node_sdp_correlator.vhd @@ -60,8 +60,8 @@ ENTITY node_sdp_correlator IS 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; + ram_st_xsq_mosi : IN t_mem_mosi := c_mem_mosi_rst; + ram_st_xsq_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); @@ -126,8 +126,8 @@ BEGIN u_dp_sync_insert_v2 : ENTITY dp_lib.dp_sync_insert_v2 GENERIC MAP ( g_nof_streams => c_sdp_P_pfb, - g_nof_blk_per_sync => 200000, - g_nof_blk_per_sync_min => 19530 + g_nof_blk_per_sync => c_sdp_dp_sync_insert_nof_blk_per_sync, + g_nof_blk_per_sync_min => c_sdp_dp_sync_insert_nof_blk_per_sync_min ) PORT MAP ( dp_rst => dp_rst, diff --git a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd index 00b4b5ed89099bea08523565cf334bf162088f70..44d3cdf688ecd7b598e57f5f5d6bea4ebd9bc31a 100644 --- a/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd +++ b/applications/lofar2/libraries/sdp/src/vhdl/sdp_pkg.vhd @@ -186,6 +186,14 @@ PACKAGE sdp_pkg is init_sl => '0'); CONSTANT c_sdp_crosslets_info_reg_w : NATURAL := c_sdp_mm_reg_crosslets_info.nof_dat*c_sdp_mm_reg_crosslets_info.dat_w; + CONSTANT c_sdp_dp_sync_insert_nof_blk_per_sync : NATURAL := 200000; + CONSTANT c_sdp_dp_sync_insert_nof_blk_per_sync_min : NATURAL := 19530; + + -- XSUB MM adderss widths + CONSTANT c_sdp_reg_dp_sync_insert_v2_addr_w : NATURAL := 1; + CONSTANT c_sdp_reg_crosslets_info_addr_w : NATURAL := c_sdp_mm_reg_crosslets_info.adr_w; + CONSTANT c_sdp_reg_bsn_scheduler_xsub_addr_w : NATURAL := 1; + CONSTANT c_sdp_ram_st_xsq_addr_w : NATURAL := ceil_log2(c_sdp_P_sq) + ceil_log2(c_sdp_N_crosslets * c_sdp_S_pn**2 * 2); -- 10GbE offload (cep = central processor) CONSTANT c_sdp_cep_eth_src_mac_47_16 : STD_LOGIC_VECTOR(31 DOWNTO 0) := x"00228608"; -- 47:16, 15:8 = backplane, 7:0 = node diff --git a/libraries/base/dp/src/vhdl/dp_block_to_mm.vhd b/libraries/base/dp/src/vhdl/dp_block_to_mm.vhd index 7f2fd8aed81aba0ee3dd2924874cd8fb3afe0fc0..2520c398666f8fa545c8e61c4cb38b375f29aee6 100644 --- a/libraries/base/dp/src/vhdl/dp_block_to_mm.vhd +++ b/libraries/base/dp/src/vhdl/dp_block_to_mm.vhd @@ -68,7 +68,7 @@ BEGIN address <= start_address + r.word_index + r.step_index; mm_mosi.address <= TO_MEM_ADDRESS(address); mm_mosi.wrdata <= RESIZE_MEM_DATA(in_sosi.data); - mm_mosi.wr <= r.wr; + mm_mosi.wr <= d.wr; p_reg : PROCESS(rst, clk) BEGIN @@ -104,4 +104,4 @@ BEGIN END IF; END PROCESS; -END rtl; \ No newline at end of file +END rtl; diff --git a/libraries/base/dp/src/vhdl/mms_dp_gain_serial_arr.vhd b/libraries/base/dp/src/vhdl/mms_dp_gain_serial_arr.vhd index 6e001091967a2795a22b90992d61109e0418a1af..b924263f39b412d409da0a0dadcbec09d2ee2926 100644 --- a/libraries/base/dp/src/vhdl/mms_dp_gain_serial_arr.vhd +++ b/libraries/base/dp/src/vhdl/mms_dp_gain_serial_arr.vhd @@ -248,6 +248,7 @@ BEGIN out_sosi_arr(I).sop <= in_sosi_arr_pipe_ctrl(I).sop; out_sosi_arr(I).eop <= in_sosi_arr_pipe_ctrl(I).eop; out_sosi_arr(I).sync <= in_sosi_arr_pipe_ctrl(I).sync; + out_sosi_arr(I).bsn <= in_sosi_arr_pipe_ctrl(I).bsn; END PROCESS; END GENERATE gen_real_multiply; @@ -301,6 +302,7 @@ BEGIN out_sosi_arr(I).sop <= in_sosi_arr_pipe_ctrl(I).sop; out_sosi_arr(I).eop <= in_sosi_arr_pipe_ctrl(I).eop; out_sosi_arr(I).sync <= in_sosi_arr_pipe_ctrl(I).sync; + out_sosi_arr(I).bsn <= in_sosi_arr_pipe_ctrl(I).bsn; END PROCESS; END GENERATE gen_complex_multiply; diff --git a/libraries/dsp/st/src/vhdl/st_xsq_dp_to_mm.vhd b/libraries/dsp/st/src/vhdl/st_xsq_dp_to_mm.vhd index c12b28090198fd721d9e5f2610f28b6db06b378e..7b67d8e2083c598fa3645c48d5ddc7032bb9869c 100644 --- a/libraries/dsp/st/src/vhdl/st_xsq_dp_to_mm.vhd +++ b/libraries/dsp/st/src/vhdl/st_xsq_dp_to_mm.vhd @@ -60,14 +60,15 @@ ARCHITECTURE rtl OF st_xsq_dp_to_mm IS SIGNAL reg_sosi_info : t_dp_sosi := c_dp_sosi_rst; SIGNAL in_sosi_rewired : t_dp_sosi := c_dp_sosi_rst; + SIGNAL next_page : STD_LOGIC; BEGIN p_in_sosi : PROCESS(in_sosi) BEGIN in_sosi_rewired <= in_sosi; - in_sosi_rewired.data( g_dsp_data_w -1 DOWNTO 0) <= in_sosi.re(g_dsp_data_w-1 DOWNTO 0); - in_sosi_rewired.data(c_nof_complex * g_dsp_data_w -1 DOWNTO 0) <= in_sosi.im(g_dsp_data_w-1 DOWNTO 0); + in_sosi_rewired.data( g_dsp_data_w -1 DOWNTO 0) <= in_sosi.re(g_dsp_data_w-1 DOWNTO 0); + in_sosi_rewired.data(c_nof_complex * g_dsp_data_w -1 DOWNTO g_dsp_data_w) <= in_sosi.im(g_dsp_data_w-1 DOWNTO 0); END PROCESS; u_dp_block_to_mm : ENTITY dp_lib.dp_block_to_mm @@ -111,16 +112,19 @@ BEGIN IF rst='1' THEN out_sosi_info <= c_dp_sosi_rst; reg_sosi_info <= c_dp_sosi_rst; + next_page <= '0'; ELSIF rising_edge(clk) THEN IF in_sosi.sop = '1' THEN reg_sosi_info <= in_sosi; END IF; IF in_sosi.eop = '1' THEN + next_page <= '1'; out_sosi_info <= reg_sosi_info; out_sosi_info.eop <= '1'; out_sosi_info.err <= in_sosi.err; ELSE out_sosi_info <= c_dp_sosi_rst; + next_page <= '0'; END IF; END IF; END PROCESS;