From d027f0237327c0fc05e0d79308a104d793da62bb Mon Sep 17 00:00:00 2001 From: Pepping <pepping> Date: Thu, 12 Feb 2015 16:39:53 +0000 Subject: [PATCH] Copy --- .../apertif_unb1_fn_beamformer.vhd | 890 ++++++++++++++++++ ...apertif_unb1_fn_beamformer_udp_offload.vhd | 177 ++++ ...tif_unb1_fn_beamformer_udp_offload_pkg.vhd | 61 ++ .../node_apertif_unb1_fn_beamformer.vhd | 240 +++++ .../apertif_unb1_fn_beamformer_pins.tcl | 8 + 5 files changed, 1376 insertions(+) create mode 100644 applications/apertif/apertif_unb1_fn_beamformer/apertif_unb1_fn_beamformer.vhd create mode 100644 applications/apertif/apertif_unb1_fn_beamformer/apertif_unb1_fn_beamformer_udp_offload.vhd create mode 100644 applications/apertif/apertif_unb1_fn_beamformer/apertif_unb1_fn_beamformer_udp_offload_pkg.vhd create mode 100644 applications/apertif/apertif_unb1_fn_beamformer/node_apertif_unb1_fn_beamformer.vhd create mode 100644 applications/apertif/apertif_unb1_fn_beamformer/quartus/apertif_unb1_fn_beamformer_pins.tcl diff --git a/applications/apertif/apertif_unb1_fn_beamformer/apertif_unb1_fn_beamformer.vhd b/applications/apertif/apertif_unb1_fn_beamformer/apertif_unb1_fn_beamformer.vhd new file mode 100644 index 0000000000..5a77baba93 --- /dev/null +++ b/applications/apertif/apertif_unb1_fn_beamformer/apertif_unb1_fn_beamformer.vhd @@ -0,0 +1,890 @@ +------------------------------------------------------------------------------ +-- +-- Copyright (C) 2013 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +------------------------------------------------------------------------------- + +LIBRARY IEEE, common_lib, unb_common_lib, dp_lib, tse_lib, bf_lib, tr_xaui_lib, tr_10GbE_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 unb_common_lib.unb_common_pkg.ALL; +USE unb_common_lib.unb_peripherals_pkg.ALL; +USE dp_lib.dp_stream_pkg.ALL; +USE tse_lib.eth_layers_pkg.ALL; +USE tse_lib.tse_pkg.ALL; +USE tse_lib.eth_pkg.ALL; +USE bf_lib.bf_pkg.ALL; +USE tr_xaui_lib.tr_xaui_pkg.ALL; +USE work.fn_beamformer_udp_offload_pkg.ALL; +USE common_lib.common_field_pkg.ALL; + +ENTITY fn_beamformer IS + GENERIC ( + -- General + g_bf : t_c_bf := c_bf; + g_sim : BOOLEAN := FALSE; + g_design_name : STRING := "fn_beamformer"; -- Set to "fn_beamformer_rev_multi_unb" by revision fn_beamformer_rev_multi + -- Stamps are passed via QIP at compile start if $UNB_COMPILE_STAMPS is set + g_stamp_date : NATURAL := 0; -- Date (YYYYMMDD) + g_stamp_time : NATURAL := 0; -- Time (HHMMSS) + g_stamp_svn : NATURAL := 0; -- SVN revision + -- Development note := "<---------max 32 chars--------->" + g_design_note : STRING := "Apertif subband beamformer"; + + g_fw_version : t_unb_fw_version := (3, 1); -- firmware version x.y + g_use_bf : BOOLEAN := TRUE; + -- Use PHY Interface + -- TYPE t_c_unb_use_phy IS RECORD + -- eth1g : NATURAL; + -- tr_front: NATURAL; + -- tr_mesh : NATURAL; + -- tr_back : NATURAL; + -- ddr3_I : NATURAL; + -- ddr3_II : NATURAL; + -- adc : NATURAL; + -- wdi : NATURAL; + -- END RECORD; + g_use_phy : t_c_unb_use_phy := (1, 1, 1, 0, 0, 0, 0, 1); + g_tr_mesh : t_c_unb_tr := c_unb_tr_mesh; + g_aux : t_c_unb_aux := c_unb_aux + ); + 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(g_aux.version_w-1 DOWNTO 0); + ID : IN STD_LOGIC_VECTOR(g_aux.id_w-1 DOWNTO 0); + TESTIO : INOUT STD_LOGIC_VECTOR(g_aux.testio_w-1 DOWNTO 0); + + -- I2C Interface to Sensors + sens_sc : INOUT STD_LOGIC; + sens_sd : INOUT STD_LOGIC; + + -- 1GbE Control Interface + ETH_clk : IN STD_LOGIC; + ETH_SGIN : IN STD_LOGIC; + ETH_SGOUT : OUT STD_LOGIC; + + -- Transceiver clocks + SA_CLK : IN STD_LOGIC := '0'; -- TR clock BN-BI (tr_back) / SI_FN (tr_front) + SB_CLK : IN STD_LOGIC := '0'; -- TR clock FN-BN (tr_mesh) + + -- Mesh Serial I/O + FN_BN_0_TX : OUT STD_LOGIC_VECTOR(g_tr_mesh.bus_w-1 DOWNTO 0); + FN_BN_0_RX : IN STD_LOGIC_VECTOR(g_tr_mesh.bus_w-1 DOWNTO 0) := (OTHERS=>'0'); + FN_BN_1_TX : OUT STD_LOGIC_VECTOR(g_tr_mesh.bus_w-1 DOWNTO 0); + FN_BN_1_RX : IN STD_LOGIC_VECTOR(g_tr_mesh.bus_w-1 DOWNTO 0) := (OTHERS=>'0'); + FN_BN_2_TX : OUT STD_LOGIC_VECTOR(g_tr_mesh.bus_w-1 DOWNTO 0); + FN_BN_2_RX : IN STD_LOGIC_VECTOR(g_tr_mesh.bus_w-1 DOWNTO 0) := (OTHERS=>'0'); + FN_BN_3_TX : OUT STD_LOGIC_VECTOR(g_tr_mesh.bus_w-1 DOWNTO 0); + FN_BN_3_RX : IN STD_LOGIC_VECTOR(g_tr_mesh.bus_w-1 DOWNTO 0) := (OTHERS=>'0'); + + -- Front Serial I/O + SI_FN_0_TX : OUT STD_LOGIC_VECTOR(c_unb_ci.tr.bus_w-1 DOWNTO 0); + SI_FN_0_RX : IN STD_LOGIC_VECTOR(c_unb_ci.tr.bus_w-1 DOWNTO 0); + SI_FN_1_TX : OUT STD_LOGIC_VECTOR(c_unb_ci.tr.bus_w-1 DOWNTO 0); + SI_FN_1_RX : IN STD_LOGIC_VECTOR(c_unb_ci.tr.bus_w-1 DOWNTO 0); + SI_FN_2_TX : OUT STD_LOGIC_VECTOR(c_unb_ci.tr.bus_w-1 DOWNTO 0); + SI_FN_2_RX : IN STD_LOGIC_VECTOR(c_unb_ci.tr.bus_w-1 DOWNTO 0); + SI_FN_3_TX : OUT STD_LOGIC_VECTOR(c_unb_ci.tr.bus_w-1 DOWNTO 0); + SI_FN_3_RX : IN STD_LOGIC_VECTOR(c_unb_ci.tr.bus_w-1 DOWNTO 0); + + SI_FN_0_CNTRL : INOUT STD_LOGIC_VECTOR(c_unb_ci.tr.cntrl_w-1 DOWNTO 0); -- (0 = LASI; 1=MDC; 2=MDIO) + SI_FN_1_CNTRL : INOUT STD_LOGIC_VECTOR(c_unb_ci.tr.cntrl_w-1 DOWNTO 0); + SI_FN_2_CNTRL : INOUT STD_LOGIC_VECTOR(c_unb_ci.tr.cntrl_w-1 DOWNTO 0); + SI_FN_3_CNTRL : INOUT STD_LOGIC_VECTOR(c_unb_ci.tr.cntrl_w-1 DOWNTO 0); + SI_FN_RSTN : OUT STD_LOGIC := '1' -- ResetN is pulled up in the Vitesse chip, but pulled down again by external 1k resistor. + -- So we need to assign a '1' to it. + ); +END fn_beamformer; + + +ARCHITECTURE str OF fn_beamformer IS + + CONSTANT c_bg_diag_wave_period : POSITIVE := 4; + + -- Actual MM address widths, the MM data width is fixed at the default c_word_w=32 + CONSTANT c_reg_diag_bg_addr_w : NATURAL := 3; + CONSTANT c_ram_diag_bg_addr_w : NATURAL := ceil_log2(c_bg_diag_wave_period) + ceil_log2(g_bf.nof_subbands*g_bf.nof_signal_paths/g_bf.nof_input_streams)+ceil_log2(g_bf.nof_input_streams); + CONSTANT c_ram_ss_ss_wide_addr_w : NATURAL := ceil_log2(c_bf_max_nof_bf_units*g_bf.nof_weights*g_bf.nof_signal_paths); + CONSTANT c_ram_bf_weights_addr_w : NATURAL := ceil_log2(c_bf_max_nof_bf_units*g_bf.nof_signal_paths*g_bf.nof_weights); + CONSTANT c_ram_st_sst_bf_addr_w : NATURAL := ceil_log2(c_bf_max_nof_bf_units*g_bf.stat_data_sz*g_bf.nof_weights*c_nof_complex); + CONSTANT c_reg_st_sst_bf_addr_w : NATURAL := ceil_log2(c_bf_max_nof_bf_units)*2; + CONSTANT c_reg_diag_db_adr_w : NATURAL := 5; + + -- 10GbE offload + CONSTANT c_reg_dp_offload_tx_adr_w : NATURAL := 1; + CONSTANT c_reg_dp_offload_tx_hdr_dat_nof_words : NATURAL := field_nof_words(c_fn_beamformer_udp_offload_hdr_field_arr, c_word_w); -- = 26 32b words + CONSTANT c_reg_dp_offload_tx_hdr_dat_adr_w : NATURAL := ceil_log2(c_reg_dp_offload_tx_hdr_dat_nof_words); -- = 5 + CONSTANT c_reg_dp_offload_tx_hdr_ovr_nof_words : NATURAL := c_fn_beamformer_udp_offload_hdr_field_arr'LENGTH; -- = 23 override bits; one for each field; each bit in its own 32b register. + CONSTANT c_reg_dp_offload_tx_hdr_ovr_adr_w : NATURAL := ceil_log2(c_reg_dp_offload_tx_hdr_ovr_nof_words); -- = 5 + + -- tr_10GbE + CONSTANT c_reg_tr_10GbE_adr_w : NATURAL := 13; + CONSTANT c_nof_mdio : NATURAL := 3; + CONSTANT c_xaui_mosi_addr_w : NATURAL := 9; --2^9 = range of 512 addresses + CONSTANT c_max_nof_xaui_inst : NATURAL := 4; + CONSTANT c_reg_tr_xaui_addr_w : NATURAL := ceil_log2(c_max_nof_xaui_inst* pow2(c_xaui_mosi_addr_w)); -- 4* 512 = 2048 addresses -> 11 address bits. + CONSTANT c_pkt_len : NATURAL := 176; -- Let tr_10GbE FIFO buffer one full packet before releasing it + + -- BF offload + CONSTANT c_hdr_nof_words : NATURAL := c_eth_total_header_nof_words; + + CONSTANT c_dp_ram_mm_nof_words : NATURAL := c_hdr_nof_words * (c_tse_data_w/c_word_w); + CONSTANT c_dp_ram_mm_adr_w : NATURAL := ceil_log2(g_bf.nof_bf_units * pow2(ceil_log2(c_dp_ram_mm_nof_words))); + + CONSTANT c_dp_reg_mm_nof_words : NATURAL := 1; + CONSTANT c_dp_reg_mm_adr_w : NATURAL := ceil_log2(g_bf.nof_bf_units * pow2(ceil_log2(c_dp_reg_mm_nof_words))); + + CONSTANT c_reg_dp_split_nof_words : NATURAL := 1; + CONSTANT c_reg_dp_split_adr_w : NATURAL := ceil_log2(g_bf.nof_bf_units * pow2(ceil_log2(c_reg_dp_split_nof_words))); + + CONSTANT c_reg_dp_pkt_merge_nof_words : NATURAL := 1; + CONSTANT c_reg_dp_pkt_merge_adr_w : NATURAL := ceil_log2(c_eth_nof_udp_ports * pow2(ceil_log2(c_reg_dp_pkt_merge_nof_words))); + + -- System + SIGNAL cs_sim : STD_LOGIC; + SIGNAL xo_clk : STD_LOGIC; + SIGNAL xo_rst_n : STD_LOGIC; + SIGNAL cal_clk : STD_LOGIC; + SIGNAL mm_clk : STD_LOGIC; + SIGNAL mm_locked : STD_LOGIC; + SIGNAL mm_rst : STD_LOGIC; + SIGNAL dp_rst : STD_LOGIC; + SIGNAL dp_clk : STD_LOGIC; + SIGNAL dp_pps : STD_LOGIC; + + SIGNAL this_chip_id : STD_LOGIC_VECTOR(c_unb_nof_chip_w-1 DOWNTO 0); -- [2:0], so range 0-3 for FN and range 4-7 BN + + -- PIOs + SIGNAL pout_debug_wave : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); + SIGNAL pout_wdi : STD_LOGIC; + SIGNAL pin_pps : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); + SIGNAL pin_intab : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0) := (OTHERS=>'0'); + SIGNAL pout_intab : STD_LOGIC_VECTOR(c_word_w-1 DOWNTO 0); + + -- eth1g UDP streaming ports + SIGNAL eth1g_udp_tx_sosi_arr : t_dp_sosi_arr(c_eth_nof_udp_ports-1 DOWNTO 0); + SIGNAL eth1g_udp_tx_siso_arr : t_dp_siso_arr(c_eth_nof_udp_ports-1 DOWNTO 0); + + -- Interface: 10GbE + CONSTANT c_nof_10GbE_offload_streams : NATURAL := 1; + + SIGNAL xaui_tx_arr : t_xaui_arr(c_nof_10GbE_offload_streams-1 DOWNTO 0); + SIGNAL xaui_rx_arr : t_xaui_arr(c_nof_10GbE_offload_streams-1 DOWNTO 0); + SIGNAL unb_xaui_tx_arr : t_unb_xaui_sl_2arr(c_nof_10GbE_offload_streams-1 DOWNTO 0); + SIGNAL unb_xaui_rx_arr : t_unb_xaui_sl_2arr(c_nof_10GbE_offload_streams-1 DOWNTO 0); + SIGNAL mdio_mdc_arr : STD_LOGIC_VECTOR(c_nof_10GbE_offload_streams-1 DOWNTO 0); + SIGNAL mdio_mdat_in_arr : STD_LOGIC_VECTOR(c_nof_10GbE_offload_streams-1 DOWNTO 0); + SIGNAL mdio_mdat_oen_arr : STD_LOGIC_VECTOR(c_nof_10GbE_offload_streams-1 DOWNTO 0); + + SIGNAL beamlets_qua_sosi_arr : t_dp_sosi_arr(g_bf.nof_bf_units-1 DOWNTO 0); -- 8b beamlets + + SIGNAL dp_offload_tx_src_out_arr : t_dp_sosi_arr(c_nof_10GbE_offload_streams-1 DOWNTO 0); + SIGNAL dp_offload_tx_src_in_arr : t_dp_siso_arr(c_nof_10GbE_offload_streams-1 DOWNTO 0); + + ----------------------------------------------------------------------------- + -- Memory Mapped interfaces + ----------------------------------------------------------------------------- + -- . WDI override + SIGNAL reg_wdi_mosi : t_mem_mosi; + SIGNAL reg_wdi_miso : t_mem_miso; + -- . UniBoard system info + SIGNAL reg_unb_system_info_mosi : t_mem_mosi; + SIGNAL reg_unb_system_info_miso : t_mem_miso; + SIGNAL rom_unb_system_info_mosi : t_mem_mosi; + SIGNAL rom_unb_system_info_miso : t_mem_miso; + -- . UniBoard I2C sens + SIGNAL reg_unb_sens_mosi : t_mem_mosi; + SIGNAL reg_unb_sens_miso : t_mem_miso; + -- . eth1g + SIGNAL eth1g_tse_clk : STD_LOGIC; + SIGNAL eth1g_mm_rst : STD_LOGIC; + SIGNAL eth1g_tse_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL eth1g_tse_miso : t_mem_miso; + SIGNAL eth1g_reg_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL eth1g_reg_miso : t_mem_miso; + SIGNAL eth1g_reg_interrupt : STD_LOGIC; + SIGNAL eth1g_ram_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL eth1g_ram_miso : t_mem_miso; + -- . tr_mesh + SIGNAL tx_serial_2arr : t_unb_mesh_sl_2arr; + SIGNAL rx_serial_2arr : t_unb_mesh_sl_2arr; + -- . tr_nonbonded with diagnostics + SIGNAL reg_tr_nonbonded_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL reg_tr_nonbonded_miso : t_mem_miso; + SIGNAL reg_diagnostics_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL reg_diagnostics_miso : t_mem_miso; + -- . diag_data_buffer + SIGNAL ram_diag_data_buf_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL ram_diag_data_buf_miso : t_mem_miso; + SIGNAL reg_diag_data_buf_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL reg_diag_data_buf_miso : t_mem_miso; + -- . bsn_monitor + SIGNAL reg_bsn_monitor_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL reg_bsn_monitor_miso : t_mem_miso; + -- . block generator + SIGNAL reg_diag_bg_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL reg_diag_bg_miso : t_mem_miso; + SIGNAL ram_diag_bg_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL ram_diag_bg_miso : t_mem_miso; + -- . beam former + SIGNAL ram_ss_ss_wide_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL ram_ss_ss_wide_miso : t_mem_miso; + SIGNAL ram_bf_weights_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL ram_bf_weights_miso : t_mem_miso; + SIGNAL ram_st_sst_bf_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL ram_st_sst_bf_miso : t_mem_miso; + SIGNAL reg_st_sst_bf_mosi : t_mem_mosi := c_mem_mosi_rst; + SIGNAL reg_st_sst_bf_miso : t_mem_miso; + -- . dp_ram_from_mm for DP offload (header insertion) + SIGNAL reg_dp_ram_from_mm_mosi : t_mem_mosi; + SIGNAL reg_dp_ram_from_mm_miso : t_mem_miso := c_mem_miso_rst; + SIGNAL ram_dp_ram_from_mm_mosi : t_mem_mosi; + SIGNAL ram_dp_ram_from_mm_miso : t_mem_miso := c_mem_miso_rst; + -- . UDP offload + SIGNAL reg_dp_split_mosi : t_mem_mosi; + SIGNAL reg_dp_split_miso : t_mem_miso := c_mem_miso_rst; + SIGNAL reg_dp_pkt_merge_mosi : t_mem_mosi; + SIGNAL reg_dp_pkt_merge_miso : t_mem_miso := c_mem_miso_rst; + -- . 10GbE offload + SIGNAL reg_dp_offload_tx_mosi : t_mem_mosi; + SIGNAL reg_dp_offload_tx_miso : t_mem_miso; + SIGNAL reg_dp_offload_tx_hdr_dat_mosi : t_mem_mosi; + SIGNAL reg_dp_offload_tx_hdr_dat_miso : t_mem_miso; + SIGNAL reg_dp_offload_tx_hdr_ovr_mosi : t_mem_mosi; + SIGNAL reg_dp_offload_tx_hdr_ovr_miso : t_mem_miso; + SIGNAL reg_tr_10GbE_mosi : t_mem_mosi; + SIGNAL reg_tr_10GbE_miso : t_mem_miso; + SIGNAL reg_tr_xaui_mosi : t_mem_mosi; + SIGNAL reg_tr_xaui_miso : t_mem_miso; + + SIGNAL reg_mdio_mosi_arr : t_mem_mosi_arr(c_nof_mdio-1 DOWNTO 0); + SIGNAL reg_mdio_miso_arr : t_mem_miso_arr(c_nof_mdio-1 DOWNTO 0); + +BEGIN + + ----------------------------------------------------------------------------- + -- Node function + ----------------------------------------------------------------------------- + u_node_fn_beamformer : ENTITY work.node_fn_beamformer + GENERIC MAP( + g_use_bf => g_use_bf + ) + PORT MAP( + -- System + mm_rst => mm_rst, + mm_clk => mm_clk, + dp_rst => dp_rst, + dp_clk => dp_clk, + dp_pps => dp_pps, + tr_mesh_clk => SB_CLK, + cal_clk => cal_clk, + + chip_id => this_chip_id, + + -- MM interface + -- . block generator + reg_diag_bg_mosi => reg_diag_bg_mosi, + reg_diag_bg_miso => reg_diag_bg_miso, + ram_diag_bg_mosi => ram_diag_bg_mosi, + ram_diag_bg_miso => ram_diag_bg_miso, + -- . beam former + ram_ss_ss_wide_mosi => ram_ss_ss_wide_mosi, + ram_ss_ss_wide_miso => ram_ss_ss_wide_miso, + ram_bf_weights_mosi => ram_bf_weights_mosi, + ram_bf_weights_miso => ram_bf_weights_miso, + ram_st_sst_bf_mosi => ram_st_sst_bf_mosi, + ram_st_sst_bf_miso => ram_st_sst_bf_miso, + reg_st_sst_bf_mosi => reg_st_sst_bf_mosi, + reg_st_sst_bf_miso => reg_st_sst_bf_miso, + + -- . hdr_insert for dp offload + reg_hdr_insert_mosi => reg_dp_ram_from_mm_mosi, + ram_hdr_insert_mosi => ram_dp_ram_from_mm_mosi, + -- . dp_split for dp offload + reg_dp_split_mosi => reg_dp_split_mosi, + reg_dp_split_miso => reg_dp_split_miso, + reg_dp_pkt_merge_mosi => reg_dp_pkt_merge_mosi, + reg_dp_pkt_merge_miso => reg_dp_pkt_merge_miso, + + -- . tr_nonbonded + reg_tr_nonbonded_mosi => reg_tr_nonbonded_mosi, + reg_tr_nonbonded_miso => reg_tr_nonbonded_miso, + reg_diagnostics_mosi => reg_diagnostics_mosi, + reg_diagnostics_miso => reg_diagnostics_miso, + -- . diag_data_buffer + ram_diag_data_buf_mosi => ram_diag_data_buf_mosi, + ram_diag_data_buf_miso => ram_diag_data_buf_miso, + reg_diag_data_buf_mosi => reg_diag_data_buf_mosi, + reg_diag_data_buf_miso => reg_diag_data_buf_miso, + -- . bsn_monitor + reg_bsn_monitor_mosi => reg_bsn_monitor_mosi, + reg_bsn_monitor_miso => reg_bsn_monitor_miso, + + -- ST interface, BF beamlets out + beamlets_bst_sosi_arr => OPEN, -- 16b beamlets; for 1GbE a selection can be offloaded via bf_out_offload_tx_sosi_arr. + beamlets_qua_sosi_arr => beamlets_qua_sosi_arr, -- 8b beamlets; for 10GbE offload + + -- 1GbE offload + bf_out_offload_tx_sosi_arr => eth1g_udp_tx_sosi_arr, + bf_out_offload_tx_siso_arr => eth1g_udp_tx_siso_arr, + + -- Mesh interface + tx_serial_2arr => tx_serial_2arr, + rx_serial_2arr => rx_serial_2arr + ); + + ----------------------------------------------------------------------------- + -- SOPC system + ----------------------------------------------------------------------------- + u_sopc : ENTITY work.sopc_fn_beamformer + PORT MAP ( + -- 1) global signals: + clk_0 => xo_clk, -- PLL reference = 25 MHz from ETH_clk pin + reset_n => xo_rst_n, + mm_clk => mm_clk, -- PLL clk[0] = 125 MHz system clock that the NIOS2 and the MM bus run on + cal_clk => cal_clk, -- PLL clk[1] = 40 MHz calibration clock for the IO reconfiguration + tse_clk => eth1g_tse_clk, -- PLL clk[2] = 125 MHz dedicated clock for the 1 Gbit Ethernet unit + + -- the_altpll_0 + areset_to_the_altpll_0 => '0', + locked_from_the_altpll_0 => mm_locked, + phasedone_from_the_altpll_0 => OPEN, + + -- the_avs_eth_0 + coe_clk_export_from_the_avs_eth_0 => OPEN, + coe_reset_export_from_the_avs_eth_0 => eth1g_mm_rst, + coe_tse_address_export_from_the_avs_eth_0 => eth1g_tse_mosi.address(c_unb_mm_reg_default.reg_tse_adr_w-1 DOWNTO 0), + coe_tse_write_export_from_the_avs_eth_0 => eth1g_tse_mosi.wr, + coe_tse_writedata_export_from_the_avs_eth_0 => eth1g_tse_mosi.wrdata(c_word_w-1 DOWNTO 0), + coe_tse_read_export_from_the_avs_eth_0 => eth1g_tse_mosi.rd, + coe_tse_readdata_export_to_the_avs_eth_0 => eth1g_tse_miso.rddata(c_word_w-1 DOWNTO 0), + coe_tse_waitrequest_export_to_the_avs_eth_0 => eth1g_tse_miso.waitrequest, + coe_reg_address_export_from_the_avs_eth_0 => eth1g_reg_mosi.address(c_unb_mm_reg_default.reg_eth_adr_w-1 DOWNTO 0), + coe_reg_write_export_from_the_avs_eth_0 => eth1g_reg_mosi.wr, + coe_reg_writedata_export_from_the_avs_eth_0 => eth1g_reg_mosi.wrdata(c_word_w-1 DOWNTO 0), + coe_reg_read_export_from_the_avs_eth_0 => eth1g_reg_mosi.rd, + coe_reg_readdata_export_to_the_avs_eth_0 => eth1g_reg_miso.rddata(c_word_w-1 DOWNTO 0), + coe_irq_export_to_the_avs_eth_0 => eth1g_reg_interrupt, + coe_ram_address_export_from_the_avs_eth_0 => eth1g_ram_mosi.address(c_unb_mm_reg_default.ram_eth_adr_w-1 DOWNTO 0), + coe_ram_write_export_from_the_avs_eth_0 => eth1g_ram_mosi.wr, + coe_ram_writedata_export_from_the_avs_eth_0 => eth1g_ram_mosi.wrdata(c_word_w-1 DOWNTO 0), + coe_ram_read_export_from_the_avs_eth_0 => eth1g_ram_mosi.rd, + coe_ram_readdata_export_to_the_avs_eth_0 => eth1g_ram_miso.rddata(c_word_w-1 DOWNTO 0), + + -- the_reg_unb_sens + coe_address_export_from_the_reg_unb_sens => reg_unb_sens_mosi.address(c_unb_mm_reg_default.reg_unb_sens_adr_w-1 DOWNTO 0), + coe_clk_export_from_the_reg_unb_sens => OPEN, + coe_read_export_from_the_reg_unb_sens => reg_unb_sens_mosi.rd, + coe_readdata_export_to_the_reg_unb_sens => reg_unb_sens_miso.rddata(c_word_w-1 DOWNTO 0), + coe_reset_export_from_the_reg_unb_sens => OPEN, + coe_write_export_from_the_reg_unb_sens => reg_unb_sens_mosi.wr, + coe_writedata_export_from_the_reg_unb_sens => reg_unb_sens_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_reg_tr_nonbonded_mesh + coe_address_export_from_the_reg_tr_nonbonded_mesh => reg_tr_nonbonded_mosi.address(c_unb_mm_reg_default.reg_tr_nonbonded_adr_w-1 DOWNTO 0), + coe_clk_export_from_the_reg_tr_nonbonded_mesh => OPEN, + coe_read_export_from_the_reg_tr_nonbonded_mesh => reg_tr_nonbonded_mosi.rd, + coe_readdata_export_to_the_reg_tr_nonbonded_mesh => reg_tr_nonbonded_miso.rddata(c_word_w-1 DOWNTO 0), + coe_reset_export_from_the_reg_tr_nonbonded_mesh => OPEN, + coe_write_export_from_the_reg_tr_nonbonded_mesh => reg_tr_nonbonded_mosi.wr, + coe_writedata_export_from_the_reg_tr_nonbonded_mesh => reg_tr_nonbonded_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_reg_diagnostics_mesh + coe_address_export_from_the_reg_diagnostics_mesh => reg_diagnostics_mosi.address(c_unb_mm_reg_default.reg_diagnostics_adr_w-1 DOWNTO 0), + coe_clk_export_from_the_reg_diagnostics_mesh => OPEN, + coe_read_export_from_the_reg_diagnostics_mesh => reg_diagnostics_mosi.rd, + coe_readdata_export_to_the_reg_diagnostics_mesh => reg_diagnostics_miso.rddata(c_word_w-1 DOWNTO 0), + coe_reset_export_from_the_reg_diagnostics_mesh => OPEN, + coe_write_export_from_the_reg_diagnostics_mesh => reg_diagnostics_mosi.wr, + coe_writedata_export_from_the_reg_diagnostics_mesh => reg_diagnostics_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_ram_diag_data_buffer + coe_address_export_from_the_ram_diag_data_buffer => ram_diag_data_buf_mosi.address(c_unb_mm_reg_default.ram_diag_db_adr_w-1 DOWNTO 0), + coe_clk_export_from_the_ram_diag_data_buffer => OPEN, + coe_read_export_from_the_ram_diag_data_buffer => ram_diag_data_buf_mosi.rd, + coe_readdata_export_to_the_ram_diag_data_buffer => ram_diag_data_buf_miso.rddata(c_word_w-1 DOWNTO 0), + coe_reset_export_from_the_ram_diag_data_buffer => OPEN, + coe_write_export_from_the_ram_diag_data_buffer => ram_diag_data_buf_mosi.wr, + coe_writedata_export_from_the_ram_diag_data_buffer => ram_diag_data_buf_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_reg_diag_data_buffer + coe_address_export_from_the_reg_diag_data_buffer => reg_diag_data_buf_mosi.address(c_reg_diag_db_adr_w-1 DOWNTO 0), + coe_clk_export_from_the_reg_diag_data_buffer => OPEN, + coe_read_export_from_the_reg_diag_data_buffer => reg_diag_data_buf_mosi.rd, + coe_readdata_export_to_the_reg_diag_data_buffer => reg_diag_data_buf_miso.rddata(c_word_w-1 DOWNTO 0), + coe_reset_export_from_the_reg_diag_data_buffer => OPEN, + coe_write_export_from_the_reg_diag_data_buffer => reg_diag_data_buf_mosi.wr, + coe_writedata_export_from_the_reg_diag_data_buffer => reg_diag_data_buf_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_reg_bsn_monitor + coe_address_export_from_the_reg_bsn_monitor => reg_bsn_monitor_mosi.address(c_unb_mm_reg_default.reg_bsn_monitor_adr_w-1 DOWNTO 0), + coe_clk_export_from_the_reg_bsn_monitor => OPEN, + coe_read_export_from_the_reg_bsn_monitor => reg_bsn_monitor_mosi.rd, + coe_readdata_export_to_the_reg_bsn_monitor => reg_bsn_monitor_miso.rddata(c_word_w-1 DOWNTO 0), + coe_reset_export_from_the_reg_bsn_monitor => OPEN, + coe_write_export_from_the_reg_bsn_monitor => reg_bsn_monitor_mosi.wr, + coe_writedata_export_from_the_reg_bsn_monitor => reg_bsn_monitor_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_pio_debug_wave + out_port_from_the_pio_debug_wave => pout_debug_wave, + + -- the_pio_pps + in_port_to_the_pio_pps => pin_pps, + + -- the_pio_system_info: actually a avs_common_mm instance + coe_clk_export_from_the_pio_system_info => OPEN, + coe_reset_export_from_the_pio_system_info => OPEN, + coe_address_export_from_the_pio_system_info => reg_unb_system_info_mosi.address(c_unb_mm_reg_default.reg_unb_system_info_adr_w-1 DOWNTO 0), + coe_read_export_from_the_pio_system_info => reg_unb_system_info_mosi.rd, + coe_readdata_export_to_the_pio_system_info => reg_unb_system_info_miso.rddata(c_word_w-1 DOWNTO 0), + coe_write_export_from_the_pio_system_info => reg_unb_system_info_mosi.wr, + coe_writedata_export_from_the_pio_system_info => reg_unb_system_info_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_rom_system_info + coe_clk_export_from_the_rom_system_info => OPEN, + coe_reset_export_from_the_rom_system_info => OPEN, + coe_address_export_from_the_rom_system_info => rom_unb_system_info_mosi.address(c_unb_mm_reg_default.rom_unb_system_info_adr_w-1 DOWNTO 0), + coe_read_export_from_the_rom_system_info => rom_unb_system_info_mosi.rd, + coe_readdata_export_to_the_rom_system_info => rom_unb_system_info_miso.rddata(c_word_w-1 DOWNTO 0), + coe_write_export_from_the_rom_system_info => rom_unb_system_info_mosi.wr, + coe_writedata_export_from_the_rom_system_info => rom_unb_system_info_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_pio_wdi + out_port_from_the_pio_wdi => pout_wdi, + + -- the_reg_wdi: Manual WDI override; causes FPGA reconfiguration if WDI is enabled (g_use_phy). + coe_clk_export_from_the_reg_wdi => OPEN, + coe_reset_export_from_the_reg_wdi => OPEN, + coe_address_export_from_the_reg_wdi => reg_wdi_mosi.address(0), + coe_read_export_from_the_reg_wdi => reg_wdi_mosi.rd, + coe_readdata_export_to_the_reg_wdi => reg_wdi_miso.rddata(c_word_w-1 DOWNTO 0), + coe_write_export_from_the_reg_wdi => reg_wdi_mosi.wr, + coe_writedata_export_from_the_reg_wdi => reg_wdi_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_ram_st_sst + coe_address_export_from_the_ram_st_sst => ram_st_sst_bf_mosi.address(c_ram_st_sst_bf_addr_w-1 DOWNTO 0), + coe_clk_export_from_the_ram_st_sst => OPEN, + coe_read_export_from_the_ram_st_sst => ram_st_sst_bf_mosi.rd, + coe_readdata_export_to_the_ram_st_sst => ram_st_sst_bf_miso.rddata(c_word_w-1 DOWNTO 0), + coe_reset_export_from_the_ram_st_sst => OPEN, + coe_write_export_from_the_ram_st_sst => ram_st_sst_bf_mosi.wr, + coe_writedata_export_from_the_ram_st_sst => ram_st_sst_bf_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_reg_st_sst + coe_address_export_from_the_reg_st_sst => reg_st_sst_bf_mosi.address(c_reg_st_sst_bf_addr_w-1 DOWNTO 0), + coe_clk_export_from_the_reg_st_sst => OPEN, + coe_read_export_from_the_reg_st_sst => reg_st_sst_bf_mosi.rd, + coe_readdata_export_to_the_reg_st_sst => reg_st_sst_bf_miso.rddata(c_word_w-1 DOWNTO 0), + coe_reset_export_from_the_reg_st_sst => OPEN, + coe_write_export_from_the_reg_st_sst => reg_st_sst_bf_mosi.wr, + coe_writedata_export_from_the_reg_st_sst => reg_st_sst_bf_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_ram_ss_ss_wide + coe_address_export_from_the_ram_ss_ss_wide => ram_ss_ss_wide_mosi.address(c_ram_ss_ss_wide_addr_w-1 DOWNTO 0), + coe_clk_export_from_the_ram_ss_ss_wide => OPEN, + coe_read_export_from_the_ram_ss_ss_wide => ram_ss_ss_wide_mosi.rd, + coe_readdata_export_to_the_ram_ss_ss_wide => ram_ss_ss_wide_miso.rddata(c_word_w-1 DOWNTO 0), + coe_reset_export_from_the_ram_ss_ss_wide => OPEN, + coe_write_export_from_the_ram_ss_ss_wide => ram_ss_ss_wide_mosi.wr, + coe_writedata_export_from_the_ram_ss_ss_wide => ram_ss_ss_wide_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_ram_bf_weights + coe_address_export_from_the_ram_bf_weights => ram_bf_weights_mosi.address(c_ram_bf_weights_addr_w-1 DOWNTO 0), + coe_clk_export_from_the_ram_bf_weights => OPEN, + coe_read_export_from_the_ram_bf_weights => ram_bf_weights_mosi.rd, + coe_readdata_export_to_the_ram_bf_weights => ram_bf_weights_miso.rddata(c_word_w-1 DOWNTO 0), + coe_reset_export_from_the_ram_bf_weights => OPEN, + coe_write_export_from_the_ram_bf_weights => ram_bf_weights_mosi.wr, + coe_writedata_export_from_the_ram_bf_weights => ram_bf_weights_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_reg_bg_diag_bg + coe_address_export_from_the_reg_diag_bg => reg_diag_bg_mosi.address(c_reg_diag_bg_addr_w-1 DOWNTO 0), + coe_clk_export_from_the_reg_diag_bg => OPEN, + coe_read_export_from_the_reg_diag_bg => reg_diag_bg_mosi.rd, + coe_readdata_export_to_the_reg_diag_bg => reg_diag_bg_miso.rddata(c_word_w-1 DOWNTO 0), + coe_reset_export_from_the_reg_diag_bg => OPEN, + coe_write_export_from_the_reg_diag_bg => reg_diag_bg_mosi.wr, + coe_writedata_export_from_the_reg_diag_bg => reg_diag_bg_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_ram_diag_bg + coe_address_export_from_the_ram_diag_bg => ram_diag_bg_mosi.address(c_ram_diag_bg_addr_w-1 DOWNTO 0), + coe_clk_export_from_the_ram_diag_bg => OPEN, + coe_read_export_from_the_ram_diag_bg => ram_diag_bg_mosi.rd, + coe_readdata_export_to_the_ram_diag_bg => ram_diag_bg_miso.rddata(c_word_w-1 DOWNTO 0), + coe_reset_export_from_the_ram_diag_bg => OPEN, + coe_write_export_from_the_ram_diag_bg => ram_diag_bg_mosi.wr, + coe_writedata_export_from_the_ram_diag_bg => ram_diag_bg_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_reg_dp_ram_from_mm + coe_clk_export_from_the_reg_dp_ram_from_mm => OPEN, + coe_reset_export_from_the_reg_dp_ram_from_mm => OPEN, + coe_address_export_from_the_reg_dp_ram_from_mm => reg_dp_ram_from_mm_mosi.address(c_dp_reg_mm_adr_w-1 DOWNTO 0), + coe_read_export_from_the_reg_dp_ram_from_mm => reg_dp_ram_from_mm_mosi.rd, + coe_readdata_export_to_the_reg_dp_ram_from_mm => reg_dp_ram_from_mm_miso.rddata(c_word_w-1 DOWNTO 0), + coe_write_export_from_the_reg_dp_ram_from_mm => reg_dp_ram_from_mm_mosi.wr, + coe_writedata_export_from_the_reg_dp_ram_from_mm => reg_dp_ram_from_mm_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_ram_dp_ram_from_mm + coe_clk_export_from_the_ram_dp_ram_from_mm => OPEN, + coe_reset_export_from_the_ram_dp_ram_from_mm => OPEN, + coe_address_export_from_the_ram_dp_ram_from_mm => ram_dp_ram_from_mm_mosi.address(c_dp_ram_mm_adr_w-1 DOWNTO 0), + coe_read_export_from_the_ram_dp_ram_from_mm => ram_dp_ram_from_mm_mosi.rd, + coe_readdata_export_to_the_ram_dp_ram_from_mm => ram_dp_ram_from_mm_miso.rddata(c_word_w-1 DOWNTO 0), + coe_write_export_from_the_ram_dp_ram_from_mm => ram_dp_ram_from_mm_mosi.wr, + coe_writedata_export_from_the_ram_dp_ram_from_mm => ram_dp_ram_from_mm_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_reg_dp_split + coe_clk_export_from_the_reg_dp_split => OPEN, + coe_reset_export_from_the_reg_dp_split => OPEN, + coe_address_export_from_the_reg_dp_split => reg_dp_split_mosi.address(c_reg_dp_split_adr_w-1 DOWNTO 0), + coe_read_export_from_the_reg_dp_split => reg_dp_split_mosi.rd, + coe_readdata_export_to_the_reg_dp_split => reg_dp_split_miso.rddata(c_word_w-1 DOWNTO 0), + coe_write_export_from_the_reg_dp_split => reg_dp_split_mosi.wr, + coe_writedata_export_from_the_reg_dp_split => reg_dp_split_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_reg_dp_pkt_merge + coe_clk_export_from_the_reg_dp_pkt_merge => OPEN, + coe_reset_export_from_the_reg_dp_pkt_merge => OPEN, + coe_address_export_from_the_reg_dp_pkt_merge => reg_dp_pkt_merge_mosi.address(c_reg_dp_pkt_merge_adr_w-1 DOWNTO 0), + coe_read_export_from_the_reg_dp_pkt_merge => reg_dp_pkt_merge_mosi.rd, + coe_readdata_export_to_the_reg_dp_pkt_merge => reg_dp_pkt_merge_miso.rddata(c_word_w-1 DOWNTO 0), + coe_write_export_from_the_reg_dp_pkt_merge => reg_dp_pkt_merge_mosi.wr, + coe_writedata_export_from_the_reg_dp_pkt_merge => reg_dp_pkt_merge_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_reg_dp_offload_tx + coe_address_export_from_the_reg_dp_offload_tx => reg_dp_offload_tx_mosi.address(0), + coe_clk_export_from_the_reg_dp_offload_tx => OPEN, + coe_read_export_from_the_reg_dp_offload_tx => reg_dp_offload_tx_mosi.rd, + coe_readdata_export_to_the_reg_dp_offload_tx => reg_dp_offload_tx_miso.rddata(c_word_w-1 DOWNTO 0), + coe_reset_export_from_the_reg_dp_offload_tx => OPEN, + coe_write_export_from_the_reg_dp_offload_tx => reg_dp_offload_tx_mosi.wr, + coe_writedata_export_from_the_reg_dp_offload_tx => reg_dp_offload_tx_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_reg_dp_offload_tx_hdr_dat + coe_address_export_from_the_reg_dp_offload_tx_hdr_dat => reg_dp_offload_tx_hdr_dat_mosi.address(c_reg_dp_offload_tx_hdr_dat_adr_w-1 DOWNTO 0), + coe_clk_export_from_the_reg_dp_offload_tx_hdr_dat => OPEN, + coe_read_export_from_the_reg_dp_offload_tx_hdr_dat => reg_dp_offload_tx_hdr_dat_mosi.rd, + coe_readdata_export_to_the_reg_dp_offload_tx_hdr_dat => reg_dp_offload_tx_hdr_dat_miso.rddata(c_word_w-1 DOWNTO 0), + coe_reset_export_from_the_reg_dp_offload_tx_hdr_dat => OPEN, + coe_write_export_from_the_reg_dp_offload_tx_hdr_dat => reg_dp_offload_tx_hdr_dat_mosi.wr, + coe_writedata_export_from_the_reg_dp_offload_tx_hdr_dat => reg_dp_offload_tx_hdr_dat_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_reg_dp_offload_tx_hdr_ovr + coe_address_export_from_the_reg_dp_offload_tx_hdr_ovr => reg_dp_offload_tx_hdr_ovr_mosi.address(c_reg_dp_offload_tx_hdr_ovr_adr_w-1 DOWNTO 0), + coe_clk_export_from_the_reg_dp_offload_tx_hdr_ovr => OPEN, + coe_read_export_from_the_reg_dp_offload_tx_hdr_ovr => reg_dp_offload_tx_hdr_ovr_mosi.rd, + coe_readdata_export_to_the_reg_dp_offload_tx_hdr_ovr => reg_dp_offload_tx_hdr_ovr_miso.rddata(c_word_w-1 DOWNTO 0), + coe_reset_export_from_the_reg_dp_offload_tx_hdr_ovr => OPEN, + coe_write_export_from_the_reg_dp_offload_tx_hdr_ovr => reg_dp_offload_tx_hdr_ovr_mosi.wr, + coe_writedata_export_from_the_reg_dp_offload_tx_hdr_ovr => reg_dp_offload_tx_hdr_ovr_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_reg_tr_10GbE + coe_clk_export_from_the_reg_tr_10GbE => OPEN, + coe_reset_export_from_the_reg_tr_10GbE => OPEN, + coe_address_export_from_the_reg_tr_10GbE => reg_tr_10GbE_mosi.address(c_reg_tr_10GbE_adr_w-1 DOWNTO 0), + coe_read_export_from_the_reg_tr_10GbE => reg_tr_10GbE_mosi.rd, + coe_readdata_export_to_the_reg_tr_10GbE => reg_tr_10GbE_miso.rddata(c_word_w-1 DOWNTO 0), + coe_waitrequest_export_to_the_reg_tr_10GbE => reg_tr_10GbE_miso.waitrequest, + coe_write_export_from_the_reg_tr_10GbE => reg_tr_10GbE_mosi.wr, + coe_writedata_export_from_the_reg_tr_10GbE => reg_tr_10GbE_mosi.wrdata(c_word_w-1 DOWNTO 0), + + -- the_reg_mdio_0 + coe_clk_export_from_the_reg_mdio_0 => OPEN, + coe_reset_export_from_the_reg_mdio_0 => OPEN, + coe_address_export_from_the_reg_mdio_0 => reg_mdio_mosi_arr(0).address(c_unb_mm_reg_default.reg_mdio_adr_w-1 DOWNTO 0), + coe_read_export_from_the_reg_mdio_0 => reg_mdio_mosi_arr(0).rd, + coe_readdata_export_to_the_reg_mdio_0 => reg_mdio_miso_arr(0).rddata(c_word_w-1 DOWNTO 0), + coe_write_export_from_the_reg_mdio_0 => reg_mdio_mosi_arr(0).wr, + coe_writedata_export_from_the_reg_mdio_0 => reg_mdio_mosi_arr(0).wrdata(c_word_w-1 DOWNTO 0), + + -- the_reg_mdio_1 + coe_clk_export_from_the_reg_mdio_1 => OPEN, + coe_reset_export_from_the_reg_mdio_1 => OPEN, + coe_address_export_from_the_reg_mdio_1 => reg_mdio_mosi_arr(1).address(c_unb_mm_reg_default.reg_mdio_adr_w-1 DOWNTO 0), + coe_read_export_from_the_reg_mdio_1 => reg_mdio_mosi_arr(1).rd, + coe_readdata_export_to_the_reg_mdio_1 => reg_mdio_miso_arr(1).rddata(c_word_w-1 DOWNTO 0), + coe_write_export_from_the_reg_mdio_1 => reg_mdio_mosi_arr(1).wr, + coe_writedata_export_from_the_reg_mdio_1 => reg_mdio_mosi_arr(1).wrdata(c_word_w-1 DOWNTO 0), + + -- the_reg_mdio_2 + coe_clk_export_from_the_reg_mdio_2 => OPEN, + coe_reset_export_from_the_reg_mdio_2 => OPEN, + coe_address_export_from_the_reg_mdio_2 => reg_mdio_mosi_arr(2).address(c_unb_mm_reg_default.reg_mdio_adr_w-1 DOWNTO 0), + coe_read_export_from_the_reg_mdio_2 => reg_mdio_mosi_arr(2).rd, + coe_readdata_export_to_the_reg_mdio_2 => reg_mdio_miso_arr(2).rddata(c_word_w-1 DOWNTO 0), + coe_write_export_from_the_reg_mdio_2 => reg_mdio_mosi_arr(2).wr, + coe_writedata_export_from_the_reg_mdio_2 => reg_mdio_mosi_arr(2).wrdata(c_word_w-1 DOWNTO 0), + + -- the_reg_tr_xaui + coe_clk_export_from_the_reg_tr_xaui => OPEN, + coe_reset_export_from_the_reg_tr_xaui => OPEN, + coe_address_export_from_the_reg_tr_xaui => reg_tr_xaui_mosi.address(c_reg_tr_xaui_addr_w-1 DOWNTO 0), + coe_read_export_from_the_reg_tr_xaui => reg_tr_xaui_mosi.rd, + coe_readdata_export_to_the_reg_tr_xaui => reg_tr_xaui_miso.rddata(c_word_w-1 DOWNTO 0), + coe_waitrequest_export_to_the_reg_tr_xaui => reg_tr_xaui_miso.waitrequest, + coe_write_export_from_the_reg_tr_xaui => reg_tr_xaui_mosi.wr, + coe_writedata_export_from_the_reg_tr_xaui => reg_tr_xaui_mosi.wrdata(c_word_w-1 DOWNTO 0) + ); + + ----------------------------------------------------------------------------- + -- General control function + ----------------------------------------------------------------------------- + u_ctrl : ENTITY unb_common_lib.ctrl_unb_common + GENERIC MAP ( + -- General + g_design_name => g_design_name, + g_stamp_date => g_stamp_date, + g_stamp_time => g_stamp_time, + g_stamp_svn => g_stamp_svn, + g_design_note => g_design_note, + g_fw_version => g_fw_version, + -- Use PHY Interface + g_use_phy => g_use_phy, + -- Auxiliary Interface + g_aux => g_aux, + -- Offload BF out(0) + g_udp_offload => TRUE + ) + PORT MAP ( + -- + -- >>> SOPC system with conduit peripheral MM bus + -- + -- System + cs_sim => cs_sim, + xo_clk => xo_clk, + xo_rst_n => xo_rst_n, + mm_clk => mm_clk, + mm_locked => mm_locked, + mm_rst => mm_rst, + + dp_rst => dp_rst, + dp_clk => dp_clk, + dp_pps => dp_pps, + dp_rst_in => dp_rst, + dp_clk_in => dp_clk, + + this_chip_id => this_chip_id, + + -- PIOs + pout_debug_wave => pout_debug_wave, + pout_wdi => pout_wdi, + pin_pps => pin_pps, + + -- System_info + reg_unb_system_info_mosi => reg_unb_system_info_mosi, + reg_unb_system_info_miso => reg_unb_system_info_miso, + rom_unb_system_info_mosi => rom_unb_system_info_mosi, + rom_unb_system_info_miso => rom_unb_system_info_miso, + + -- Manual WDI override + reg_wdi_mosi => reg_wdi_mosi, + reg_wdi_miso => reg_wdi_miso, + + -- UniBoard I2C sensors + reg_unb_sens_mosi => reg_unb_sens_mosi, + reg_unb_sens_miso => reg_unb_sens_miso, + + -- eth1g + eth1g_tse_clk => eth1g_tse_clk, + eth1g_mm_rst => eth1g_mm_rst, + eth1g_tse_mosi => eth1g_tse_mosi, + eth1g_tse_miso => eth1g_tse_miso, + eth1g_reg_mosi => eth1g_reg_mosi, + eth1g_reg_miso => eth1g_reg_miso, + eth1g_reg_interrupt => eth1g_reg_interrupt, + eth1g_ram_mosi => eth1g_ram_mosi, + eth1g_ram_miso => eth1g_ram_miso, + + -- eth1g UDP streaming ports to offload BF out + udp_tx_sosi_arr => eth1g_udp_tx_sosi_arr, + udp_tx_siso_arr => eth1g_udp_tx_siso_arr, + + -- + -- >>> Ctrl FPGA pins + -- + -- 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, + + ETH_clk => ETH_clk, + ETH_SGIN => ETH_SGIN, + ETH_SGOUT => ETH_SGOUT + ); + + ----------------------------------------------------------------------------- + -- Mesh I/O + ----------------------------------------------------------------------------- + no_tr_mesh : IF g_use_phy.tr_mesh=0 GENERATE + rx_serial_2arr <= (OTHERS=>(OTHERS=>'0')); + END GENERATE; + + gen_tr_mesh : IF g_use_phy.tr_mesh/=0 GENERATE + u_mesh_io : ENTITY unb_common_lib.unb_mesh_io + GENERIC MAP ( + g_bus_w => g_tr_mesh.bus_w + ) + PORT MAP ( + tx_serial_2arr => tx_serial_2arr, + rx_serial_2arr => rx_serial_2arr, + + -- Serial I/O + FN_BN_0_TX => FN_BN_0_TX, + FN_BN_0_RX => FN_BN_0_RX, + FN_BN_1_TX => FN_BN_1_TX, + FN_BN_1_RX => FN_BN_1_RX, + FN_BN_2_TX => FN_BN_2_TX, + FN_BN_2_RX => FN_BN_2_RX, + FN_BN_3_TX => FN_BN_3_TX, + FN_BN_3_RX => FN_BN_3_RX + ); + END GENERATE; + + ----------------------------------------------------------------------------- + -- Interface : 10GbE + ----------------------------------------------------------------------------- + u_tr_10GbE: ENTITY tr_10GbE_lib.tr_10GbE + GENERIC MAP( + g_sim => g_sim, + g_sim_level => 0, + g_nof_macs => c_nof_10GbE_offload_streams, + g_use_mdio => TRUE, + g_pkt_len => c_pkt_len + ) + PORT MAP ( + mm_rst => mm_rst, + mm_clk => mm_clk, + + tr_clk => SA_CLK, + + cal_rec_clk => mm_clk, --cal_clk, # required for XAUI + + dp_rst => dp_rst, + dp_clk => dp_clk, + + snk_out_arr => dp_offload_tx_src_in_arr, + snk_in_arr => dp_offload_tx_src_out_arr, + + reg_mac_mosi => reg_tr_10GbE_mosi, + reg_mac_miso => reg_tr_10GbE_miso, + xaui_mosi => reg_tr_xaui_mosi, + xaui_miso => reg_tr_xaui_miso, + mdio_mosi_arr => reg_mdio_mosi_arr(c_nof_10GbE_offload_streams-1 DOWNTO 0), + mdio_miso_arr => reg_mdio_miso_arr(c_nof_10GbE_offload_streams-1 DOWNTO 0), + + xaui_tx_out_arr => xaui_tx_arr, + xaui_rx_in_arr => xaui_rx_arr, + + mdio_rst => SI_FN_RSTN, + mdio_mdc_arr => mdio_mdc_arr, + mdio_mdat_in_arr => mdio_mdat_in_arr, + mdio_mdat_oen_arr => mdio_mdat_oen_arr + ); + + -- Wire together different types + gen_wires: FOR i IN 0 TO c_nof_10GbE_offload_streams-1 GENERATE + unb_xaui_tx_arr(i) <= xaui_tx_arr(i); + xaui_rx_arr(i) <= unb_xaui_rx_arr(i); + END GENERATE; + + u_front_io : ENTITY unb_common_lib.unb_front_io + GENERIC MAP ( + g_nof_xaui => c_nof_10GbE_offload_streams + ) + PORT MAP ( + xaui_tx_arr => unb_xaui_tx_arr, + xaui_rx_arr => unb_xaui_rx_arr, + + mdio_mdc_arr => mdio_mdc_arr, + mdio_mdat_in_arr => mdio_mdat_in_arr, + mdio_mdat_oen_arr => mdio_mdat_oen_arr, + + -- Serial I/O + SI_FN_0_TX => SI_FN_0_TX, + SI_FN_0_RX => SI_FN_0_RX, + SI_FN_1_TX => SI_FN_1_TX, + SI_FN_1_RX => SI_FN_1_RX, + SI_FN_2_TX => SI_FN_2_TX, + SI_FN_2_RX => SI_FN_2_RX, + + SI_FN_0_CNTRL => SI_FN_0_CNTRL, + SI_FN_1_CNTRL => SI_FN_1_CNTRL, + SI_FN_2_CNTRL => SI_FN_2_CNTRL, + SI_FN_3_CNTRL => SI_FN_3_CNTRL + ); + + ----------------------------------------------------------------------------- + -- DP offload TX : BF out -> 10GbE + ----------------------------------------------------------------------------- + u_fn_beamformer_udp_offload : ENTITY work.fn_beamformer_udp_offload + PORT MAP ( + mm_rst => mm_rst, + mm_clk => mm_clk, + + dp_rst => dp_rst, + dp_clk => dp_clk, + + snk_in_arr => beamlets_qua_sosi_arr, -- 8b beamlets + + src_out_arr => dp_offload_tx_src_out_arr, + src_in_arr => dp_offload_tx_src_in_arr, + + ID => ID, + + reg_dp_offload_tx_mosi => reg_dp_offload_tx_mosi, + reg_dp_offload_tx_miso => reg_dp_offload_tx_miso, + reg_dp_offload_tx_hdr_dat_mosi => reg_dp_offload_tx_hdr_dat_mosi, + reg_dp_offload_tx_hdr_dat_miso => reg_dp_offload_tx_hdr_dat_miso, + reg_dp_offload_tx_hdr_ovr_mosi => reg_dp_offload_tx_hdr_ovr_mosi, + reg_dp_offload_tx_hdr_ovr_miso => reg_dp_offload_tx_hdr_ovr_miso + ); + + +END; + + + + + + + + + + + + diff --git a/applications/apertif/apertif_unb1_fn_beamformer/apertif_unb1_fn_beamformer_udp_offload.vhd b/applications/apertif/apertif_unb1_fn_beamformer/apertif_unb1_fn_beamformer_udp_offload.vhd new file mode 100644 index 0000000000..5127be33e7 --- /dev/null +++ b/applications/apertif/apertif_unb1_fn_beamformer/apertif_unb1_fn_beamformer_udp_offload.vhd @@ -0,0 +1,177 @@ +------------------------------------------------------------------------------- +-- +-- Copyright (C) 2013 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +------------------------------------------------------------------------------- + +-- Purpose: +-- . Wrapper containing dp_offload_tx and header field assignments. +-- Description: +-- . The actual header field definition is located in fn_beamformer_udp_offload_pkg, +-- because the same header field definition is also used by dp_offload_rx in +-- design apertif_fn_qdcor. + +LIBRARY IEEE, common_lib, work, mm_lib, unb_common_lib, tse_lib, dp_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 dp_lib.dp_stream_pkg.ALL; +USE common_lib.common_field_pkg.ALL; +USE unb_common_lib.unb_common_pkg.ALL; +USE tse_lib.tse_pkg.ALL; +USE tse_lib.eth_layers_pkg.ALL; +USE tse_lib.eth_pkg.ALL; +USE work.fn_beamformer_udp_offload_pkg.ALL; + +ENTITY fn_beamformer_udp_offload IS + PORT ( + mm_rst : IN STD_LOGIC; + mm_clk : IN STD_LOGIC; + + dp_rst : IN STD_LOGIC; + dp_clk : IN STD_LOGIC; + + snk_in_arr : IN t_dp_sosi_arr(3 DOWNTO 0); -- 4 BF unit outputs + + src_out_arr : OUT t_dp_sosi_arr(0 DOWNTO 0); + src_in_arr : IN t_dp_siso_arr(0 DOWNTO 0) := (OTHERS=>c_dp_siso_rdy); + + ID : IN STD_LOGIC_VECTOR(c_unb_aux.id_w-1 DOWNTO 0); + + reg_dp_offload_tx_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_dp_offload_tx_miso : OUT t_mem_miso := c_mem_miso_rst; + + reg_dp_offload_tx_hdr_dat_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_dp_offload_tx_hdr_dat_miso : OUT t_mem_miso := c_mem_miso_rst; + + reg_dp_offload_tx_hdr_ovr_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_dp_offload_tx_hdr_ovr_miso : OUT t_mem_miso := c_mem_miso_rst + ); +END fn_beamformer_udp_offload; + + +ARCHITECTURE wrap OF fn_beamformer_udp_offload IS + + CONSTANT c_nof_offload_streams : NATURAL := 1; + + -- Override ('1') only the Ethernet fields so we can use MM defaults there. + CONSTANT c_hdr_field_ovr_init : STD_LOGIC_VECTOR(c_fn_beamformer_udp_offload_nof_hdr_fields-1 DOWNTO 0) := "101"&"111111111101"&"0011"&"100"; + + CONSTANT c_bf_out_compl_dat_w : NATURAL := 8; + CONSTANT c_data_w : NATURAL := 64; -- 4 BF units * 8b complex + + CONSTANT c_header_overhead_bytes : NATURAL := field_slv_out_len(c_fn_beamformer_udp_offload_hdr_field_arr) / c_byte_w; + + CONSTANT c_max_frame_len : NATURAL := 9018; + CONSTANT c_frame_nof_words : NATURAL := (c_max_frame_len * c_byte_w ) / c_data_w; + + CONSTANT c_max_udp_payload_len : NATURAL := c_max_frame_len-c_header_overhead_bytes-c_eth_crc_len; + CONSTANT c_max_udp_payload_nof_words : NATURAL := (c_max_udp_payload_len * c_byte_w) / c_data_w; + + CONSTANT c_max_nof_words_per_block : NATURAL := 256; + CONSTANT c_min_nof_words_per_block : NATURAL := 1; + CONSTANT c_max_nof_blocks_per_packet : NATURAL := c_max_udp_payload_nof_words/c_min_nof_words_per_block; + + CONSTANT c_def_nof_words_per_block : NATURAL := 176; --176+7(header words)/256 + 1 CRC word = 184/256 64b words@200MHz = 9.2Gbps user rate. Incl. inter-frame gap (96b) and preamble (64b): 9.325Gbps. + CONSTANT c_def_nof_blocks_per_packet : NATURAL := 1; + + SIGNAL hdr_fields_in_arr : t_slv_1024_arr(c_nof_offload_streams-1 DOWNTO 0); + + SIGNAL id_backplane : STD_LOGIC_VECTOR(c_byte_w-1 DOWNTO 0); + SIGNAL id_chip : STD_LOGIC_VECTOR(c_byte_w-1 DOWNTO 0); + + SIGNAL dp_offload_tx_snk_in_arr : t_dp_sosi_arr(c_nof_offload_streams-1 DOWNTO 0); + +BEGIN + + --------------------------------------------------------------------------------------- + -- 4 BF unit outputs: 2*8b complex; concatenate these into one 64b word. + --------------------------------------------------------------------------------------- + gen_bf_out_concat: FOR i IN 0 TO c_nof_offload_streams-1 GENERATE + p_connect : PROCESS(snk_in_arr(i)) + BEGIN + dp_offload_tx_snk_in_arr(i) <= snk_in_arr(0); -- Control + dp_offload_tx_snk_in_arr(i).data(c_data_w-1 DOWNTO 0) <= snk_in_arr(3).im(c_bf_out_compl_dat_w-1 DOWNTO 0) & snk_in_arr(3).re(c_bf_out_compl_dat_w-1 DOWNTO 0) & + snk_in_arr(2).im(c_bf_out_compl_dat_w-1 DOWNTO 0) & snk_in_arr(2).re(c_bf_out_compl_dat_w-1 DOWNTO 0) & + snk_in_arr(1).im(c_bf_out_compl_dat_w-1 DOWNTO 0) & snk_in_arr(1).re(c_bf_out_compl_dat_w-1 DOWNTO 0) & + snk_in_arr(0).im(c_bf_out_compl_dat_w-1 DOWNTO 0) & snk_in_arr(0).re(c_bf_out_compl_dat_w-1 DOWNTO 0); + END PROCESS; + END GENERATE; + + --------------------------------------------------------------------------------------- + -- dp_offload_tx + --------------------------------------------------------------------------------------- + u_dp_offload_tx : ENTITY dp_lib.dp_offload_tx_dev + GENERIC MAP ( + g_nof_streams => c_nof_offload_streams, + g_data_w => c_data_w, + g_use_complex => FALSE, + g_max_nof_words_per_block => c_max_nof_words_per_block, + g_def_nof_words_per_block => c_def_nof_words_per_block, + g_max_nof_blocks_per_packet => c_max_nof_blocks_per_packet, + g_def_nof_blocks_per_packet => c_def_nof_blocks_per_packet, + g_output_fifo_depth => c_frame_nof_words, + g_hdr_field_arr => c_fn_beamformer_udp_offload_hdr_field_arr, + g_hdr_field_ovr_init => c_hdr_field_ovr_init + ) + PORT MAP ( + mm_rst => mm_rst, + mm_clk => mm_clk, + + dp_rst => dp_rst, + dp_clk => dp_clk, + + reg_mosi => reg_dp_offload_tx_mosi, + reg_miso => reg_dp_offload_tx_miso, + + reg_hdr_dat_mosi => reg_dp_offload_tx_hdr_dat_mosi, + reg_hdr_dat_miso => reg_dp_offload_tx_hdr_dat_miso, + + reg_hdr_ovr_mosi => reg_dp_offload_tx_hdr_ovr_mosi, + reg_hdr_ovr_miso => reg_dp_offload_tx_hdr_ovr_miso, + + snk_in_arr => dp_offload_tx_snk_in_arr, + snk_out_arr => OPEN, + + src_out_arr => src_out_arr, + src_in_arr => src_in_arr, + + hdr_fields_in_arr => hdr_fields_in_arr + ); + + --------------------------------------------------------------------------------------- + -- Extract the chip and backplane numbers from ID + --------------------------------------------------------------------------------------- + id_backplane <= RESIZE_UVEC(ID(7 DOWNTO 3), c_byte_w); + id_chip <= RESIZE_UVEC(ID(2 DOWNTO 0), c_byte_w); + + --------------------------------------------------------------------------------------- + -- Wire the hardwired header fields to DP signals and ID + --------------------------------------------------------------------------------------- + gen_slv_hard_fields : FOR i IN 0 TO c_nof_offload_streams-1 GENERATE + hdr_fields_in_arr(i)(field_hi(c_fn_beamformer_udp_offload_hdr_field_arr, "eth_src_mac" ) DOWNTO field_lo(c_fn_beamformer_udp_offload_hdr_field_arr, "eth_src_mac" )) <= x"00228608" & id_backplane & id_chip; + hdr_fields_in_arr(i)(field_hi(c_fn_beamformer_udp_offload_hdr_field_arr, "udp_src_port" ) DOWNTO field_lo(c_fn_beamformer_udp_offload_hdr_field_arr, "udp_src_port" )) <= x"D0" & ID; + hdr_fields_in_arr(i)(field_hi(c_fn_beamformer_udp_offload_hdr_field_arr, "udp_dst_port" ) DOWNTO field_lo(c_fn_beamformer_udp_offload_hdr_field_arr, "udp_dst_port" )) <= x"D0" & ID; + hdr_fields_in_arr(i)(field_hi(c_fn_beamformer_udp_offload_hdr_field_arr, "ip_src_addr" ) DOWNTO field_lo(c_fn_beamformer_udp_offload_hdr_field_arr, "ip_src_addr" )) <= x"0A63" & id_backplane & INCR_UVEC(id_chip, 1); + + hdr_fields_in_arr(i)(field_hi(c_fn_beamformer_udp_offload_hdr_field_arr, "dp_sync" ) DOWNTO field_lo(c_fn_beamformer_udp_offload_hdr_field_arr, "dp_sync" )) <= slv(dp_offload_tx_snk_in_arr(i).sync); + hdr_fields_in_arr(i)(field_hi(c_fn_beamformer_udp_offload_hdr_field_arr, "dp_bsn" ) DOWNTO field_lo(c_fn_beamformer_udp_offload_hdr_field_arr, "dp_bsn" )) <= dp_offload_tx_snk_in_arr(i).bsn(63 DOWNTO 0); + END GENERATE; + +END wrap; diff --git a/applications/apertif/apertif_unb1_fn_beamformer/apertif_unb1_fn_beamformer_udp_offload_pkg.vhd b/applications/apertif/apertif_unb1_fn_beamformer/apertif_unb1_fn_beamformer_udp_offload_pkg.vhd new file mode 100644 index 0000000000..4317253534 --- /dev/null +++ b/applications/apertif/apertif_unb1_fn_beamformer/apertif_unb1_fn_beamformer_udp_offload_pkg.vhd @@ -0,0 +1,61 @@ +------------------------------------------------------------------------------- +-- +-- Copyright (C) 2013 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +------------------------------------------------------------------------------- + +LIBRARY IEEE, common_lib; +USE IEEE.STD_LOGIC_1164.ALL; +USE IEEE.NUMERIC_STD.ALL; +USE common_lib.common_pkg.ALL; +USE common_lib.common_field_pkg.ALL; + +PACKAGE fn_beamformer_udp_offload_pkg IS + + CONSTANT c_fn_beamformer_udp_offload_nof_hdr_fields : NATURAL := 3+12+4+3; -- 448b; 7 64b words + -- Notes: + -- . pre-calculated ip_header_checksum is valid only for UNB0, FN0 targeting IP 10.10.10.10 + -- . Default ip_total_length and udp_total_length valid for 188 beamlets * 64b + CONSTANT c_fn_beamformer_udp_offload_hdr_field_arr : t_common_field_arr(c_fn_beamformer_udp_offload_nof_hdr_fields-1 DOWNTO 0) := ( ( field_name_pad("eth_dst_mac" ), "RW", 48, field_default(x"AABBCCDDEEFF") ), + ( field_name_pad("eth_src_mac" ), "RW", 48, field_default(0) ), + ( field_name_pad("eth_type" ), "RW", 16, field_default(x"0800") ), + ( field_name_pad("ip_version" ), "RW", 4, field_default(4) ), + ( field_name_pad("ip_header_length" ), "RW", 4, field_default(5) ), + ( field_name_pad("ip_services" ), "RW", 8, field_default(0) ), + ( field_name_pad("ip_total_length" ), "RW", 16, field_default(1546) ), + ( field_name_pad("ip_identification" ), "RW", 16, field_default(0) ), + ( field_name_pad("ip_flags" ), "RW", 3, field_default(2) ), + ( field_name_pad("ip_fragment_offset" ), "RW", 13, field_default(0) ), + ( field_name_pad("ip_time_to_live" ), "RW", 8, field_default(127) ), + ( field_name_pad("ip_protocol" ), "RW", 8, field_default(17) ), + ( field_name_pad("ip_header_checksum" ), "RW", 16, field_default(55147) ), + ( field_name_pad("ip_src_addr" ), "RW", 32, field_default(0) ), + ( field_name_pad("ip_dst_addr" ), "RW", 32, field_default(x"0A0A0A0A") ), + ( field_name_pad("udp_src_port" ), "RW", 16, field_default(0) ), + ( field_name_pad("udp_dst_port" ), "RW", 16, field_default(0) ), + ( field_name_pad("udp_total_length" ), "RW", 16, field_default(1526) ), + ( field_name_pad("udp_checksum" ), "RW", 16, field_default(0) ), + ( field_name_pad("dp_reserved" ), "RW", 47, field_default(0) ), + ( field_name_pad("dp_sync" ), "RW", 1, field_default(0) ), + ( field_name_pad("dp_bsn" ), "RW", 64, field_default(0) ) ); + +END fn_beamformer_udp_offload_pkg; + +PACKAGE BODY fn_beamformer_udp_offload_pkg IS +END fn_beamformer_udp_offload_pkg; + diff --git a/applications/apertif/apertif_unb1_fn_beamformer/node_apertif_unb1_fn_beamformer.vhd b/applications/apertif/apertif_unb1_fn_beamformer/node_apertif_unb1_fn_beamformer.vhd new file mode 100644 index 0000000000..85d2097889 --- /dev/null +++ b/applications/apertif/apertif_unb1_fn_beamformer/node_apertif_unb1_fn_beamformer.vhd @@ -0,0 +1,240 @@ +------------------------------------------------------------------------------- +-- +-- Copyright (C) 2012 +-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/> +-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +------------------------------------------------------------------------------- + +LIBRARY IEEE, common_lib, dp_lib, bf_lib, unb_common_lib, tse_lib, diag_lib, fn_bf_lib, fn_terminal_db_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 dp_lib.dp_stream_pkg.ALL; +USE bf_lib.bf_pkg.ALL; +USE tse_lib.tse_pkg.ALL; +USE unb_common_lib.unb_common_pkg.ALL; +USE tse_lib.eth_layers_pkg.ALL; +USE tse_lib.eth_pkg.ALL; +b +hdl_lib_uses = common technology m +ENTITY node_fn_beamformer IS + GENERIC( + g_sim : BOOLEAN := FALSE; + g_sim_level : NATURAL := 0; + g_use_data_buf : BOOLEAN := TRUE; -- Add a data buffer parallel to the BF. Does not affect other functions. + g_use_bf_offload : BOOLEAN := TRUE; -- Offload BF out(0) datapath to 1GbE UDP TX port. Does not affect other functions. + g_use_bf : BOOLEAN := TRUE; -- FALSE does not instantiate a BF instance. + g_use_block_gen : BOOLEAN := FALSE; -- TRUE overrides terminal output and feeds BG output to the BF instead. + -- Stream properties + g_nof_streams : NATURAL := 16; +-- g_data_w : NATURAL := 32; + + g_bf : t_c_bf := c_bf; + g_bf_weights_file_name : STRING := "../../../../../dsp/bf/build/data/weights"; -- default file location for synthesis + -- Auxiliary Interface + g_aux : t_c_unb_aux := c_unb_aux + ); + PORT( + -- System + chip_id : IN STD_LOGIC_VECTOR(g_aux.chip_id_w-1 DOWNTO 0); -- [2:0] + + mm_rst : IN STD_LOGIC; + mm_clk : IN STD_LOGIC; -- 50 MHz from xo_clk PLL in SOPC system + dp_rst : IN STD_LOGIC; + dp_clk : IN STD_LOGIC; -- 200 MHz from CLK system clock + dp_pps : IN STD_LOGIC := '0'; + tr_mesh_clk : IN STD_LOGIC; -- 156.25 MHz from SA_CLK transceiver clock + cal_clk : IN STD_LOGIC; -- 40 MHz from xo_clk PLL in SOPC system + + -- MM interface + -- . block generator + reg_diag_bg_mosi : IN t_mem_mosi; + reg_diag_bg_miso : OUT t_mem_miso; + ram_diag_bg_mosi : IN t_mem_mosi; + ram_diag_bg_miso : OUT t_mem_miso; + -- . beam former + ram_ss_ss_wide_mosi : IN t_mem_mosi; + ram_ss_ss_wide_miso : OUT t_mem_miso; + ram_bf_weights_mosi : IN t_mem_mosi; + ram_bf_weights_miso : OUT t_mem_miso; + ram_st_sst_bf_mosi : IN t_mem_mosi; + ram_st_sst_bf_miso : OUT t_mem_miso; + reg_st_sst_bf_mosi : IN t_mem_mosi; + reg_st_sst_bf_miso : OUT t_mem_miso; + -- . hdr_insert for bf_out_offload + reg_hdr_insert_mosi : IN t_mem_mosi := c_mem_mosi_rst; + ram_hdr_insert_mosi : IN t_mem_mosi := c_mem_mosi_rst; + -- . dp_split for bf_out_offload + reg_dp_split_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_dp_split_miso : OUT t_mem_miso; + reg_dp_pkt_merge_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_dp_pkt_merge_miso : OUT t_mem_miso; + -- . diag_data_buffer + ram_diag_data_buf_mosi : IN t_mem_mosi := c_mem_mosi_rst; + ram_diag_data_buf_miso : OUT t_mem_miso; + reg_diag_data_buf_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_diag_data_buf_miso : OUT t_mem_miso; + -- . tr_nonbonded + reg_tr_nonbonded_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_tr_nonbonded_miso : OUT t_mem_miso; + reg_diagnostics_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_diagnostics_miso : OUT t_mem_miso; + -- . bsn_monitor + reg_bsn_monitor_mosi : IN t_mem_mosi := c_mem_mosi_rst; + reg_bsn_monitor_miso : OUT t_mem_miso; + + -- ST interface, BF beamlets out + beamlets_bst_sosi_arr : OUT t_dp_sosi_arr(g_bf.nof_bf_units-1 DOWNTO 0); -- 16b beamlets; a selection can be offloaded via bf_out_offload_tx_sosi_arr. + beamlets_qua_sosi_arr : OUT t_dp_sosi_arr(g_bf.nof_bf_units-1 DOWNTO 0); -- 8b beamlets + + -- DP offload for 1GbE + bf_out_offload_tx_sosi_arr : OUT t_dp_sosi_arr(c_eth_nof_udp_ports-1 DOWNTO 0); -- 16b beamlets + bf_out_offload_tx_siso_arr : IN t_dp_siso_arr(c_eth_nof_udp_ports-1 DOWNTO 0) := (OTHERS => c_dp_siso_rst); + + -- Mesh interface level + -- . Serial (tr_nonbonded) + tx_serial_2arr : OUT t_unb_mesh_sl_2arr; -- Tx + rx_serial_2arr : IN t_unb_mesh_sl_2arr:= (OTHERS=>(OTHERS=>'0')) -- Rx support for diagnostics + ); +END node_fn_beamformer; + +ARCHITECTURE str OF node_fn_beamformer IS + + CONSTANT c_weights_write_only : BOOLEAN := TRUE; + -- Use default RAM init files. The RAM init file for simulation lies one ../ level further way then for synthesis + CONSTANT c_bf_weights_file_name : STRING := sel_a_b(g_sim, "../", "") & "../../../../../dsp/bf/build/data/weights"; + CONSTANT c_block_gen_file_prefix : STRING := sel_a_b(g_sim, "../", "") & "../../../../../modules/Lofar/diag/src/data/bf_in_data"; + CONSTANT c_ss_wide_file_prefix : STRING := "UNUSED"; -- path_to_file + + SIGNAL node_fn_term_out_sosi_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); + SIGNAL node_fn_term_out_siso_arr : t_dp_siso_arr(g_nof_streams-1 DOWNTO 0); + SIGNAL node_bf_in_sosi_arr : t_dp_sosi_arr( g_bf.nof_input_streams-1 DOWNTO 0); + SIGNAL node_bf_in_siso_arr : t_dp_siso_arr( g_bf.nof_input_streams-1 DOWNTO 0); + +BEGIN + + ----------------------------------------------------------------------------- + -- Node function: Beam Former + BF UDP offload + block generator + ----------------------------------------------------------------------------- + u_node_fn_bf : ENTITY fn_bf_lib.node_fn_bf + GENERIC MAP( + g_bf => c_bf, + g_bf_offload => g_use_bf_offload, + g_use_bf => g_use_bf, + g_use_block_gen => g_use_block_gen, + g_bf_weights_file_name => c_bf_weights_file_name, + g_ss_wide_file_prefix => c_ss_wide_file_prefix, + g_block_gen_file_prefix => c_block_gen_file_prefix, + g_weights_write_only => c_weights_write_only + ) + PORT MAP( + -- System + mm_rst => mm_rst, + mm_clk => mm_clk, + dp_rst => dp_rst, + dp_clk => dp_clk, + -- MM interface + -- . block generator + reg_diag_bg_mosi => reg_diag_bg_mosi, + reg_diag_bg_miso => reg_diag_bg_miso, + ram_diag_bg_mosi => ram_diag_bg_mosi, + ram_diag_bg_miso => ram_diag_bg_miso, + -- . beam former + ram_ss_ss_wide_mosi => ram_ss_ss_wide_mosi, + ram_ss_ss_wide_miso => ram_ss_ss_wide_miso, + ram_bf_weights_mosi => ram_bf_weights_mosi, + ram_bf_weights_miso => ram_bf_weights_miso, + ram_st_sst_bf_mosi => ram_st_sst_bf_mosi, + ram_st_sst_bf_miso => ram_st_sst_bf_miso, + reg_st_sst_bf_mosi => reg_st_sst_bf_mosi, + reg_st_sst_bf_miso => reg_st_sst_bf_miso, + -- . hdr_insert for dp offload + reg_hdr_insert_mosi => reg_hdr_insert_mosi, + ram_hdr_insert_mosi => ram_hdr_insert_mosi, + -- . dp_split for dp offload + reg_dp_split_mosi => reg_dp_split_mosi, + reg_dp_split_miso => reg_dp_split_miso, + reg_dp_pkt_merge_mosi => reg_dp_pkt_merge_mosi, + reg_dp_pkt_merge_miso => reg_dp_pkt_merge_miso, + -- ST interface + ext_in_sosi_arr => node_bf_in_sosi_arr, + ext_in_siso_arr => node_bf_in_siso_arr, + out_bst_sosi_arr => beamlets_bst_sosi_arr, -- 16b beamlets; a selection can be offloaded via bf_out_offload_tx_sosi_arr. + out_qua_sosi_arr => beamlets_qua_sosi_arr, -- 8b beamlets + + -- DP offload for 1GbE + bf_out_offload_tx_sosi_arr => bf_out_offload_tx_sosi_arr, -- 16b beamlets + bf_out_offload_tx_siso_arr => bf_out_offload_tx_siso_arr + ); + + ----------------------------------------------------------------------------- + -- Interconnect node functions: terminal output to beamformer input + ----------------------------------------------------------------------------- + node_bf_in_sosi_arr <= node_fn_term_out_sosi_arr; + node_fn_term_out_siso_arr <= node_bf_in_siso_arr; + + ----------------------------------------------------------------------------- + -- Node function: Terminals + data buffer + ----------------------------------------------------------------------------- + u_node_fn_terminal_db : ENTITY fn_terminal_db_lib.node_fn_terminal_db + GENERIC MAP( + g_sim => g_sim, + g_sim_level => g_sim_level, + g_use_data_buf => g_use_data_buf, + -- Terminals interface + g_multi_unb => TRUE, + -- Auxiliary Interface + g_aux => c_unb_aux + ) + PORT MAP( + -- System + mm_rst => mm_rst, + mm_clk => mm_clk, + dp_rst => dp_rst, + dp_clk => dp_clk, + dp_pps => dp_pps, + tr_mesh_clk => tr_mesh_clk, + cal_clk => cal_clk, + + chip_id => chip_id, + + -- MM interface + -- . tr_nonbonded + reg_tr_nonbonded_mosi => reg_tr_nonbonded_mosi, + reg_tr_nonbonded_miso => reg_tr_nonbonded_miso, + reg_diagnostics_mosi => reg_diagnostics_mosi, + reg_diagnostics_miso => reg_diagnostics_miso, + -- . diag_data_buffer + ram_diag_data_buf_mosi => ram_diag_data_buf_mosi, + ram_diag_data_buf_miso => ram_diag_data_buf_miso, + reg_diag_data_buf_mosi => reg_diag_data_buf_mosi, + reg_diag_data_buf_miso => reg_diag_data_buf_miso, + -- . bsn_monitor + reg_bsn_monitor_mosi => reg_bsn_monitor_mosi, + reg_bsn_monitor_miso => reg_bsn_monitor_miso, + + -- Mesh interface + tx_serial_2arr => tx_serial_2arr, + rx_serial_2arr => rx_serial_2arr, + + dp_out_sosi_arr => node_fn_term_out_sosi_arr, + dp_out_siso_arr => node_fn_term_out_siso_arr + ); + +END str; + diff --git a/applications/apertif/apertif_unb1_fn_beamformer/quartus/apertif_unb1_fn_beamformer_pins.tcl b/applications/apertif/apertif_unb1_fn_beamformer/quartus/apertif_unb1_fn_beamformer_pins.tcl new file mode 100644 index 0000000000..81a06f92fb --- /dev/null +++ b/applications/apertif/apertif_unb1_fn_beamformer/quartus/apertif_unb1_fn_beamformer_pins.tcl @@ -0,0 +1,8 @@ +set_global_assignment -name SOURCE_TCL_SCRIPT_FILE ../../../../unb_common/src/tcl/COMMON_NODE_general_pins.tcl +set_global_assignment -name SOURCE_TCL_SCRIPT_FILE ../../../../unb_common/src/tcl/COMMON_NODE_other_pins.tcl +set_global_assignment -name SOURCE_TCL_SCRIPT_FILE ../../../../unb_common/src/tcl/COMMON_NODE_sensor_pins.tcl +set_global_assignment -name SOURCE_TCL_SCRIPT_FILE ../../../../unb_common/src/tcl/COMMON_NODE_1Gbe_pins.tcl +set_global_assignment -name SOURCE_TCL_SCRIPT_FILE ../../../../unb_common/src/tcl/COMMON_NODE_mesh_tr_clk_pin.tcl +set_global_assignment -name SOURCE_TCL_SCRIPT_FILE ../../../../unb_common/src/tcl/FRONT_NODE_mesh_nocmu_pins.tcl + +set_global_assignment -name SOURCE_TCL_SCRIPT_FILE $::env(UNB)/Firmware/designs/unb_common/src/tcl/pins_tr_front_pcs.tcl -- GitLab