Skip to content
Snippets Groups Projects
Commit aa679d79 authored by Pepping's avatar Pepping
Browse files

Initial commits

parent e27b44ae
Branches
No related tags found
No related merge requests found
-------------------------------------------------------------------------------
--
-- Copyright (C) 2014
-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
-- JIVE (Joint Institute for VLBI in Europe) <http://www.jive.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, unb1_board_lib, correlator_lib, filter_lib, fft_lib, rTwoSDF_lib, diag_lib, dp_lib, eth_lib, tech_tse_lib, tr_10GbE_lib, apertif_lib, wpfb_lib, bf_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 common_lib.common_field_pkg.ALL;
USE common_lib.common_network_layers_pkg.ALL;
USE common_lib.common_interface_layers_pkg.ALL;
USE common_lib.common_network_total_header_pkg.ALL;
USE unb1_board_lib.unb1_board_pkg.ALL;
USE filter_lib.fil_pkg.ALL;
USE fft_lib.fft_pkg.ALL;
USE rTwoSDF_lib.rTwoSDFPkg.ALL;
USE diag_lib.diag_pkg.ALL;
USE dp_lib.dp_stream_pkg.ALL;
USE eth_lib.eth_pkg.ALL;
USE tech_tse_lib.tech_tse_pkg.ALL;
USE tech_tse_lib.tb_tech_tse_pkg.ALL;
USE apertif_lib.apertif_udp_offload_pkg.ALL;
USE wpfb_lib.wpfb_pkg.ALL;
USE bf_lib.bf_pkg.ALL;
USE work.apertif_unb1_correlator_pkg.ALL;
-- Purpose:
-- . Calculate all cross- and autocorrelations of the incoming beamlets
-- Description:
-- . The incpoming beamlets (3x 10GbE from fn_beamformer) are distributed among the 8 FPGAs per board; each FPGA correlates
-- 1/8th of the beamlets.
-- Remarks:
-- . The BG version (g_use_bg=TRUE) functionally works.
-- . The 10G-input version (no BG) needs the DDR3 transpose in fn_beamformer to be in place.
-- . fn_beamformer now outputs 176/256 beamlets but this might be increased to 192/256 (9.6Gbps) again as its 10G issue is solved.
-- . URGENT:
-- . We need 9b filter coefficients before we can synthesize including the mesh terminals! --FIXME
-- . Note: the 18b coeffieciens *do* fit and meet timing with only BG (without 10G RX stage).
-- . Other:
-- . Synthesis incl. mesh terminals went OK but used 96% of the logic resources.
-- . Keep an eye on the FIXME marks.
ENTITY apertif_unb1_correlator_nodes IS
GENERIC (
g_design_name : STRING := "apertif_unb1_correlator";
g_design_note : STRING := "revision info";
g_use_bg : BOOLEAN := FALSE; -- Overridden (TRUE) by TB but still a valid synthesis option; this replaces the 10GbE input stage with block gens.
g_sim : BOOLEAN := FALSE; -- Overridden by TB
g_sim_level : NATURAL := 0;
g_sim_fast : BOOLEAN := TRUE; -- TRUE = fast accumulator model and no inter-channel delay in the correlator output stream.
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_stamp_svn : NATURAL := 0; -- SVN revision -- set by QSF
g_use_dumb_mesh_terminals : BOOLEAN := FALSE -- Add dumb mesh terminals to the design. Non-functional, for synthesis results only.
);
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_unb1_board_aux.version_w-1 DOWNTO 0);
ID : IN STD_LOGIC_VECTOR(c_unb1_board_aux.id_w-1 DOWNTO 0);
TESTIO : INOUT STD_LOGIC_VECTOR(c_unb1_board_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'; -- SerDes Clock BN-BI / SI_FN
SB_CLK : IN STD_LOGIC := '0'; -- SerDes clock FN-BN (tr_mesh)
-- Mesh Serial I/O
FN_BN_0_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0);
FN_BN_0_RX : IN STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0);
FN_BN_1_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0);
FN_BN_1_RX : IN STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0);
FN_BN_2_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0);
FN_BN_2_RX : IN STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0);
FN_BN_3_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0);
FN_BN_3_RX : IN STD_LOGIC_VECTOR(c_unb1_board_tr_mesh.bus_w-1 DOWNTO 0);
-- Serial I/O: 10GbE receivers
SI_FN_0_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0);
SI_FN_0_RX : IN STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0);
SI_FN_1_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0);
SI_FN_1_RX : IN STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0);
SI_FN_2_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0);
SI_FN_2_RX : IN STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0);
SI_FN_3_TX : OUT STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0);
SI_FN_3_RX : IN STD_LOGIC_VECTOR(c_unb1_board_ci.tr.bus_w-1 DOWNTO 0);
SI_FN_0_CNTRL : INOUT STD_LOGIC_VECTOR(c_unb1_board_ci.tr.cntrl_w-1 DOWNTO 0);
SI_FN_1_CNTRL : INOUT STD_LOGIC_VECTOR(c_unb1_board_ci.tr.cntrl_w-1 DOWNTO 0);
SI_FN_2_CNTRL : INOUT STD_LOGIC_VECTOR(c_unb1_board_ci.tr.cntrl_w-1 DOWNTO 0);
SI_FN_3_CNTRL : INOUT STD_LOGIC_VECTOR(c_unb1_board_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 apertif_unb1_correlator_nodes;
ARCHITECTURE str OF apertif_unb1_correlator_nodes IS
-- Firmware version x.y
CONSTANT c_fw_version : t_unb1_board_fw_version := (0, 5);
-- Enable block generators
CONSTANT c_use_phy : t_c_unb1_board_use_phy := (1, sel_a_b(g_use_bg, 0, 1), 0, 0, 0, 0, 0, 1);
CONSTANT c_nof_nodes : NATURAL := 8;
CONSTANT c_nof_10GbE_streams : NATURAL := 3; -- The number of 10G input streams
CONSTANT c_nof_bf_modules : NATURAL := c_bf.nof_bf_units; -- We have 4 BF modules here because each sending fn_beamformer design has 4 bf units.
CONSTANT c_compl_dat_w : NATURAL := 8;
CONSTANT c_use_input_node : BOOLEAN := func_rev_selector(g_design_name, "c_use_input_node");
CONSTANT c_use_mesh_node : BOOLEAN := func_rev_selector(g_design_name, "c_use_mesh_node");
CONSTANT c_use_processing_node : BOOLEAN := func_rev_selector(g_design_name, "c_use_processing_node");
CONSTANT c_use_bg_input : BOOLEAN := func_rev_selector(g_design_name, "c_use_bg_input");
CONSTANT c_use_db_input : BOOLEAN := func_rev_selector(g_design_name, "c_use_db_input");
CONSTANT c_use_bg_mesh : BOOLEAN := func_rev_selector(g_design_name, "c_use_bg_mesh");
CONSTANT c_use_db_mesh : BOOLEAN := func_rev_selector(g_design_name, "c_use_db_mesh");
CONSTANT c_use_interleave : BOOLEAN := func_rev_selector(g_design_name, "c_use_interleave");
CONSTANT c_use_wpfb : BOOLEAN := func_rev_selector(g_design_name, "c_use_wpfb");
CONSTANT c_use_repack : BOOLEAN := func_rev_selector(g_design_name, "c_use_repack");
CONSTANT c_mesh_data_w : NATURAL := sel_a_b(g_design_name = "apertif_unb1_correlator_mesh_ref", 16, 48);
CONSTANT c_usr_data_w : NATURAL := 16;
CONSTANT c_bg_file_name_prefix : STRING := "hex/composite_signals";
-- BSN Alignern + FIFO's
CONSTANT c_block_period : NATURAL := 186; --256; --FIXME: first block size was 176/256. Now 128/186,18 (non-integer...), assuming 186 is OK.
CONSTANT c_block_size : NATURAL := 128; --176
CONSTANT c_bsn_align_latency : NATURAL := 3;
CONSTANT c_bsn_align_sop_timeout : NATURAL := (c_bsn_align_latency + 1) * c_block_period; -- wait somewhat more than c_bsn_align_latency periods
CONSTANT c_bsn_align_xoff_timeout : NATURAL := c_bsn_align_latency * 2 * c_block_period; -- flush factor 2 longer than needed
CONSTANT c_dp_fifo_size : NATURAL := (c_bsn_align_latency + 5) * c_block_size; -- be able to fit blocks for as long as sop time out;
CONSTANT c_dp_fifo_fill : NATURAL := c_block_size;
CONSTANT c_nof_blocks_per_sync : NATURAL := 800000;
CONSTANT c_bsn_sync_time_out : NATURAL := (c_block_period * c_nof_blocks_per_sync * 10)/8; --*10/8 as margin
-- Re- and Deinterleaver
CONSTANT c_use_complex : BOOLEAN := TRUE;
-- Correlator
CONSTANT c_nof_visibility_streams : NATURAL := 1;
-- System
SIGNAL cs_sim : STD_LOGIC;
SIGNAL xo_clk : STD_LOGIC;
SIGNAL xo_rst : STD_LOGIC;
SIGNAL xo_rst_n : STD_LOGIC;
SIGNAL mm_clk : STD_LOGIC;
SIGNAL mm_locked : STD_LOGIC;
SIGNAL mm_rst : STD_LOGIC;
SIGNAL cal_clk : STD_LOGIC;
SIGNAL epcs_clk : STD_LOGIC;
SIGNAL dp_rst : STD_LOGIC;
SIGNAL dp_clk : STD_LOGIC;
SIGNAL dp_pps : STD_LOGIC;
SIGNAL sa_rst : STD_LOGIC;
SIGNAL this_chip_id : STD_LOGIC_VECTOR(c_unb1_board_nof_chip_w-1 DOWNTO 0); -- [2:0], so range 0-3 for FN and range 4-7 BN
-- PIOs
SIGNAL pout_wdi : STD_LOGIC;
SIGNAL eth1g_tse_clk : STD_LOGIC;
SIGNAL eth1g_mm_rst : STD_LOGIC;
SIGNAL eth1g_reg_interrupt : STD_LOGIC; -- Interrupt
-- MM Register interfaces
SIGNAL reg_wdi_mosi : t_mem_mosi;
SIGNAL reg_wdi_miso : t_mem_miso;
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;
SIGNAL reg_unb_sens_mosi : t_mem_mosi;
SIGNAL reg_unb_sens_miso : t_mem_miso;
SIGNAL reg_ppsh_mosi : t_mem_mosi;
SIGNAL reg_ppsh_miso : t_mem_miso;
SIGNAL eth1g_ram_mosi : t_mem_mosi;
SIGNAL eth1g_ram_miso : t_mem_miso;
SIGNAL eth1g_reg_mosi : t_mem_mosi;
SIGNAL eth1g_reg_miso : t_mem_miso;
SIGNAL eth1g_tse_mosi : t_mem_mosi;
SIGNAL eth1g_tse_miso : t_mem_miso;
SIGNAL reg_diag_bg_input_mosi : t_mem_mosi;
SIGNAL reg_diag_bg_input_miso : t_mem_miso;
SIGNAL reg_diag_bg_mesh_mosi : t_mem_mosi;
SIGNAL reg_diag_bg_mesh_miso : t_mem_miso;
SIGNAL ram_diag_bg_mesh_mosi : t_mem_mosi;
SIGNAL ram_diag_bg_mesh_miso : t_mem_miso;
SIGNAL reg_diagnostics_mosi : t_mem_mosi;
SIGNAL reg_diagnostics_miso : t_mem_miso;
SIGNAL reg_tr_nonbonded_mosi : t_mem_mosi;
SIGNAL reg_tr_nonbonded_miso : t_mem_miso;
SIGNAL reg_diag_data_buf_input_mosi : t_mem_mosi;
SIGNAL reg_diag_data_buf_input_miso : t_mem_miso;
SIGNAL ram_diag_data_buf_input_mosi : t_mem_mosi;
SIGNAL ram_diag_data_buf_input_miso : t_mem_miso;
SIGNAL reg_diag_data_buf_mesh_mosi : t_mem_mosi;
SIGNAL reg_diag_data_buf_mesh_miso : t_mem_miso;
SIGNAL ram_diag_data_buf_mesh_mosi : t_mem_mosi;
SIGNAL ram_diag_data_buf_mesh_miso : t_mem_miso;
SIGNAL ram_fil_coefs_mosi : t_mem_mosi;
SIGNAL ram_fil_coefs_miso : t_mem_miso;
SIGNAL reg_mdio_0_mosi : t_mem_mosi;
SIGNAL reg_mdio_0_miso : t_mem_miso;
SIGNAL reg_mdio_1_mosi : t_mem_mosi;
SIGNAL reg_mdio_1_miso : t_mem_miso;
SIGNAL reg_mdio_2_mosi : t_mem_mosi;
SIGNAL reg_mdio_2_miso : t_mem_miso;
SIGNAL reg_dp_offload_rx_hdr_dat_mosi : t_mem_mosi;
SIGNAL reg_dp_offload_rx_hdr_dat_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_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_bsn_monitor_mosi : t_mem_mosi;
SIGNAL reg_bsn_monitor_miso : t_mem_miso;
SIGNAL reg_mdio_mosi_arr : t_mem_mosi_arr(c_unb1_board_nof_mdio-1 DOWNTO 0);
SIGNAL reg_mdio_miso_arr : t_mem_miso_arr(c_unb1_board_nof_mdio-1 DOWNTO 0);
-- BSN monitors
SIGNAL dp_bsn_monitor_in_siso_arr : t_dp_siso_arr(c_nof_10GbE_streams+1+1-1 DOWNTO 0);
SIGNAL dp_bsn_monitor_in_sosi_arr : t_dp_sosi_arr(c_nof_10GbE_streams+1+1-1 DOWNTO 0);
SIGNAL dp_offload_tx_src_out_arr : t_dp_sosi_arr(c_nof_visibility_streams-1 DOWNTO 0);
SIGNAL dp_offload_tx_src_in_arr : t_dp_siso_arr(c_nof_visibility_streams-1 DOWNTO 0);
SIGNAL mesh_data_in_sosi_arr : t_dp_sosi_arr(c_nof_nodes-1 DOWNTO 0);
SIGNAL mesh_data_in_siso_arr : t_dp_siso_arr(c_nof_nodes-1 DOWNTO 0);
SIGNAL mesh_data_out_sosi_arr : t_dp_sosi_arr(c_nof_nodes-1 DOWNTO 0);
SIGNAL mesh_data_out_siso_arr : t_dp_siso_arr(c_nof_nodes-1 DOWNTO 0);
BEGIN
gen_node_input : IF c_use_input_node = TRUE GENERATE
u_input_node : ENTITY work.node_apertif_unb1_correlator_input
GENERIC MAP (
g_sim => g_sim, --: BOOLEAN := FALSE; -- Overridden by TB
g_use_bg => c_use_bg_input, --: BOOLEAN := FALSE; -- Overridden (TRUE) by TB but still a valid synthesis option; this replaces the 10GbE input stage with block gens.
g_use_db => c_use_db_input, --: BOOLEAN := FALSE; -- Enable the databuffers when set tot TRUE.
g_use_interleave => c_use_interleave,
g_bg_file_name_prefix => c_bg_file_name_prefix, --: STRING := "hex/composite_signals";
g_usr_data_w => c_usr_data_w, --: NATURAL := 16; -- Specifies the datawidth of Re + Im
g_nof_output_streams => c_nof_nodes --: NATURAL := 8 -- 8 Indicates the number of output streams, where each stream is targetting a unique node.
)
PORT MAP (
-- System
mm_rst => mm_rst,
mm_clk => mm_clk,
dp_rst => dp_rst,
dp_clk => dp_clk,
-- Output array
data_src_out_arr => mesh_data_in_sosi_arr,
data_src_in_arr => mesh_data_in_siso_arr,
-- MM
reg_diag_bg_mosi => reg_diag_bg_input_mosi,
reg_diag_bg_miso => reg_diag_bg_input_miso,
reg_tr_10GbE_mosi => reg_tr_10GbE_mosi,
reg_tr_10GbE_miso => reg_tr_10GbE_miso,
reg_tr_xaui_mosi => reg_tr_xaui_mosi,
reg_tr_xaui_miso => reg_tr_xaui_miso,
reg_mdio_mosi_arr => reg_mdio_mosi_arr,
reg_mdio_miso_arr => reg_mdio_miso_arr,
ram_diag_data_buf_mosi => ram_diag_data_buf_input_mosi,
ram_diag_data_buf_miso => ram_diag_data_buf_input_miso,
reg_diag_data_buf_mosi => reg_diag_data_buf_input_mosi,
reg_diag_data_buf_miso => reg_diag_data_buf_input_miso,
reg_dp_offload_rx_hdr_dat_mosi => reg_dp_offload_rx_hdr_dat_mosi,
reg_dp_offload_rx_hdr_dat_miso => reg_dp_offload_rx_hdr_dat_miso,
-- Transceiver clocks
SA_CLK => SA_CLK,
-- Serial I/O: 10GbE receivers
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_3_TX => SI_FN_3_TX,
SI_FN_3_RX => SI_FN_3_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,
SI_FN_RSTN => SI_FN_RSTN
);
END GENERATE;
gen_node_mesh : IF c_use_mesh_node = TRUE GENERATE
u_mesh_node : ENTITY work.node_apertif_unb1_correlator_mesh
GENERIC MAP(
g_sim => g_sim,
g_sim_level => g_sim_level,
g_sim_node_nr => g_sim_node_nr,
g_node_type => e_any,
g_use_bg => c_use_bg_mesh,
g_use_db => c_use_db_mesh,
g_nof_input_streams => c_nof_nodes,
g_nof_output_streams => c_nof_nodes,
g_use_repack => c_use_repack,
g_usr_use_complex => c_use_complex,
g_usr_data_w => c_mesh_data_w,
g_usr_frame_len => 128,
g_aux => c_unb1_board_aux
)
PORT MAP(
-- System
chip_id => this_chip_id,
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,
-- Input array
data_snk_in_arr => mesh_data_in_sosi_arr,
data_snk_out_arr => mesh_data_in_siso_arr,
-- Output array
data_src_out_arr => mesh_data_out_sosi_arr,
data_src_in_arr => mesh_data_out_siso_arr,
-- MM interface
reg_diag_bg_mosi => reg_diag_bg_mesh_mosi,
reg_diag_bg_miso => reg_diag_bg_mesh_miso,
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,
reg_bsn_monitor_mosi => reg_bsn_monitor_mosi,
reg_bsn_monitor_miso => reg_bsn_monitor_miso,
ram_diag_data_buf_mosi => ram_diag_data_buf_mesh_mosi,
ram_diag_data_buf_miso => ram_diag_data_buf_mesh_miso,
reg_diag_data_buf_mosi => reg_diag_data_buf_mesh_mosi,
reg_diag_data_buf_miso => reg_diag_data_buf_mesh_miso,
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;
gen_no_node_mesh : IF c_use_mesh_node = FALSE GENERATE
mesh_data_out_sosi_arr <= mesh_data_in_sosi_arr;
mesh_data_in_siso_arr <= mesh_data_out_siso_arr;
END GENERATE;
gen_node_processing : IF c_use_processing_node = TRUE GENERATE
u_node_processing : ENTITY work.apertif_unb1_correlator_processing
GENERIC MAP (
g_sim => g_sim,
g_sim_fast => g_sim_fast,
g_use_wpfb => c_use_wpfb,
g_usr_data_w => c_usr_data_w,
g_nof_input_streams => c_nof_nodes,
g_nof_output_streams => c_nof_visibility_streams
)
PORT MAP (
-- System
mm_rst => mm_rst,
mm_clk => mm_clk,
dp_rst => dp_rst,
dp_clk => dp_clk,
ID => ID,
-- Input array
data_snk_in_arr => mesh_data_out_sosi_arr,
data_snk_out_arr => mesh_data_out_siso_arr,
-- Output array
data_src_out_arr => dp_offload_tx_src_out_arr,
data_src_in_arr => dp_offload_tx_src_in_arr,
-- MM
ram_fil_coefs_mosi => ram_fil_coefs_mosi,
ram_fil_coefs_miso => ram_fil_coefs_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
);
END GENERATE;
-----------------------------------------------------------------------------
-- RX: BSN monitors at several stages in the stream
-----------------------------------------------------------------------------
-- u_dp_bsn_monitor : ENTITY dp_lib.mms_dp_bsn_monitor
-- GENERIC MAP (
-- g_nof_streams => 5,
-- g_sync_timeout => c_bsn_sync_time_out,
-- g_log_first_bsn => TRUE
-- )
-- PORT MAP (
-- mm_rst => mm_rst,
-- mm_clk => mm_clk,
-- reg_mosi => reg_bsn_monitor_mosi,
-- reg_miso => reg_bsn_monitor_miso,
--
-- dp_rst => dp_rst,
-- dp_clk => dp_clk,
-- in_siso_arr => dp_bsn_monitor_in_siso_arr,
-- in_sosi_arr => dp_bsn_monitor_in_sosi_arr
-- );
--
-- -- 0) Monitor the BSN-aligned output
-- dp_bsn_monitor_in_sosi_arr(0) <= dp_bsn_align_src_out_arr(0);
-- dp_bsn_monitor_in_siso_arr(0) <= dp_bsn_align_src_in_arr(0);
-- -- 1) Monitor the rewired/reinterleaver stage output / WPFB input
-- dp_bsn_monitor_in_sosi_arr(1) <= wpfb_snk_in_arr(0);
-- dp_bsn_monitor_in_siso_arr(1) <= c_dp_siso_rdy;
-- -- 2) Monitor the WPFB output / correlator input
-- dp_bsn_monitor_in_sosi_arr(2) <= wpfb_src_out_arr(0);
-- dp_bsn_monitor_in_siso_arr(2) <= c_dp_siso_rdy;
-- -- 3) Monitor the correlator output / visibility offload input
-- dp_bsn_monitor_in_sosi_arr(3) <= correlator_src_out_arr(0);
-- dp_bsn_monitor_in_siso_arr(3) <= c_dp_siso_rdy;
-- -- 3) Monitor the correlator output / visibility offload input
-- dp_bsn_monitor_in_sosi_arr(4) <= dp_offload_tx_src_out_arr(0);
-- dp_bsn_monitor_in_siso_arr(4) <= dp_offload_tx_src_in_arr(0);
-----------------------------------------------------------------------------
-- General control function
-----------------------------------------------------------------------------
u_ctrl : ENTITY unb1_board_lib.ctrl_unb1_board
GENERIC MAP (
g_sim => g_sim,
g_sim_flash_model => FALSE,
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_fw_version => c_fw_version,
g_mm_clk_freq => c_unb1_board_mm_clk_freq_50M,
g_udp_offload => TRUE,
g_udp_offload_nof_streams => 1,
g_use_phy => c_use_phy,
g_aux => c_unb1_board_aux,
g_dp_clk_use_pll => TRUE,
g_xo_clk_use_pll => TRUE
)
PORT MAP (
-- Clock and reset signals
cs_sim => cs_sim,
xo_clk => xo_clk,
xo_rst => xo_rst,
xo_rst_n => xo_rst_n,
mm_clk_out => mm_clk,
mm_clk => mm_clk,
mm_rst => mm_rst,
mm_locked => mm_locked,
mm_locked_out => mm_locked,
epcs_clk => epcs_clk,
epcs_clk_out => epcs_clk,
dp_rst => dp_rst,
dp_clk => dp_clk,
dp_pps => dp_pps,
dp_rst_in => dp_rst,
dp_clk_in => dp_clk,
cal_rec_clk => cal_clk,
this_chip_id => this_chip_id,
-- Toggle WDI
pout_wdi => pout_wdi,
-- MM buses
-- . Manual WDI override
reg_wdi_mosi => reg_wdi_mosi,
reg_wdi_miso => reg_wdi_miso,
-- . 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,
-- . UniBoard I2C sensors
reg_unb_sens_mosi => reg_unb_sens_mosi,
reg_unb_sens_miso => reg_unb_sens_miso,
-- . PPSH
reg_ppsh_mosi => reg_ppsh_mosi,
reg_ppsh_miso => reg_ppsh_miso,
-- eth1g
eth1g_tse_clk_out => eth1g_tse_clk,
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
udp_tx_sosi_arr => dp_offload_tx_src_out_arr,
udp_tx_siso_arr => dp_offload_tx_src_in_arr,
-- 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,
-- . 1GbE Control Interface
ETH_clk => ETH_clk,
ETH_SGIN => ETH_SGIN,
ETH_SGOUT => ETH_SGOUT
);
-----------------------------------------------------------------------------
-- MM master
-----------------------------------------------------------------------------
u_mmm_apertif_unb1_correlator : ENTITY work.mmm_apertif_unb1_correlator
GENERIC MAP(
g_sim => g_sim,
g_sim_unb_nr => g_sim_unb_nr,
g_sim_node_nr => g_sim_node_nr
)
PORT MAP(
mm_clk => mm_clk,
mm_rst => mm_rst,
pout_wdi => pout_wdi,
reg_wdi_mosi => reg_wdi_mosi,
reg_wdi_miso => reg_wdi_miso,
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,
reg_unb_sens_mosi => reg_unb_sens_mosi,
reg_unb_sens_miso => reg_unb_sens_miso,
reg_ppsh_mosi => reg_ppsh_mosi,
reg_ppsh_miso => reg_ppsh_miso,
eth1g_mm_rst => eth1g_mm_rst,
eth1g_reg_interrupt => eth1g_reg_interrupt,
eth1g_ram_mosi => eth1g_ram_mosi,
eth1g_ram_miso => eth1g_ram_miso,
eth1g_reg_mosi => eth1g_reg_mosi,
eth1g_reg_miso => eth1g_reg_miso,
eth1g_tse_mosi => eth1g_tse_mosi,
eth1g_tse_miso => eth1g_tse_miso,
reg_diag_bg_input_mosi => reg_diag_bg_input_mosi,
reg_diag_bg_input_miso => reg_diag_bg_input_miso,
reg_diag_bg_mesh_mosi => reg_diag_bg_mesh_mosi,
reg_diag_bg_mesh_miso => reg_diag_bg_mesh_miso,
ram_diag_bg_mesh_mosi => ram_diag_bg_mesh_mosi,
ram_diag_bg_mesh_miso => ram_diag_bg_mesh_miso,
reg_diagnostics_mosi => reg_diagnostics_mosi,
reg_diagnostics_miso => reg_diagnostics_miso,
reg_tr_nonbonded_mosi => reg_tr_nonbonded_mosi,
reg_tr_nonbonded_miso => reg_tr_nonbonded_miso,
reg_diag_data_buf_input_mosi => reg_diag_data_buf_input_mosi,
reg_diag_data_buf_input_miso => reg_diag_data_buf_input_miso,
ram_diag_data_buf_input_mosi => ram_diag_data_buf_input_mosi,
ram_diag_data_buf_input_miso => ram_diag_data_buf_input_miso,
reg_diag_data_buf_mesh_mosi => reg_diag_data_buf_mesh_mosi,
reg_diag_data_buf_mesh_miso => reg_diag_data_buf_mesh_miso,
ram_diag_data_buf_mesh_mosi => ram_diag_data_buf_mesh_mosi,
ram_diag_data_buf_mesh_miso => ram_diag_data_buf_mesh_miso,
ram_fil_coefs_mosi => ram_fil_coefs_mosi,
ram_fil_coefs_miso => ram_fil_coefs_miso,
reg_mdio_0_mosi => reg_mdio_0_mosi,
reg_mdio_0_miso => reg_mdio_0_miso,
reg_mdio_1_mosi => reg_mdio_1_mosi,
reg_mdio_1_miso => reg_mdio_1_miso,
reg_mdio_2_mosi => reg_mdio_2_mosi,
reg_mdio_2_miso => reg_mdio_2_miso,
reg_dp_offload_rx_hdr_dat_mosi => reg_dp_offload_rx_hdr_dat_mosi,
reg_dp_offload_rx_hdr_dat_miso => reg_dp_offload_rx_hdr_dat_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_tr_10gbe_mosi => reg_tr_10gbe_mosi,
reg_tr_10gbe_miso => reg_tr_10gbe_miso,
reg_tr_xaui_mosi => reg_tr_xaui_mosi,
reg_tr_xaui_miso => reg_tr_xaui_miso,
reg_bsn_monitor_mosi => reg_bsn_monitor_mosi,
reg_bsn_monitor_miso => reg_bsn_monitor_miso
);
reg_mdio_mosi_arr(0) <= reg_mdio_0_mosi;
reg_mdio_mosi_arr(1) <= reg_mdio_1_mosi;
reg_mdio_mosi_arr(2) <= reg_mdio_2_mosi;
reg_mdio_0_miso <= reg_mdio_miso_arr(0);
reg_mdio_1_miso <= reg_mdio_miso_arr(1);
reg_mdio_2_miso <= reg_mdio_miso_arr(2);
-- u_mmm : ENTITY work.mmm_apertif_unb1_correlator
-- GENERIC MAP (
-- g_sim => g_sim,
-- g_sim_unb_nr => g_sim_unb_nr,
-- g_sim_node_nr => g_sim_node_nr,
-- g_wpfb => c_wpfb,
-- g_hdr_field_arr => c_apertif_udp_offload_hdr_field_arr
-- )
-- PORT MAP(
-- xo_clk => xo_clk,
-- xo_rst_n => xo_rst_n,
-- xo_rst => xo_rst,
--
-- mm_rst => mm_rst,
-- mm_clk => mm_clk,
-- mm_locked => mm_locked,
--
-- -- PIOs
-- pout_wdi => pout_wdi,
--
-- -- Manual WDI override
-- reg_wdi_mosi => reg_wdi_mosi,
-- reg_wdi_miso => reg_wdi_miso,
--
-- -- 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,
--
-- -- UniBoard I2C sensors
-- reg_unb_sens_mosi => reg_unb_sens_mosi,
-- reg_unb_sens_miso => reg_unb_sens_miso,
--
-- -- PPSH
-- reg_ppsh_mosi => reg_ppsh_mosi,
-- reg_ppsh_miso => reg_ppsh_miso,
--
-- -- Block generator input
-- reg_diag_bg_input_mosi => reg_diag_bg_input_mosi,
-- reg_diag_bg_input_miso => reg_diag_bg_input_miso,
--
-- -- Block generator mesh
-- reg_diag_bg_mesh_mosi => reg_diag_bg_mesh_mosi,
-- reg_diag_bg_mesh_miso => reg_diag_bg_mesh_miso,
-- ram_diag_bg_mesh_mosi => ram_diag_bg_mesh_mosi,
-- ram_diag_bg_mesh_miso => ram_diag_bg_mesh_miso,
--
-- -- 10 GbE
-- reg_tr_10GbE_mosi => reg_tr_10GbE_mosi,
-- reg_tr_10GbE_miso => reg_tr_10GbE_miso,
-- reg_tr_xaui_mosi => reg_tr_xaui_mosi,
-- reg_tr_xaui_miso => reg_tr_xaui_miso,
-- reg_mdio_mosi_arr => reg_mdio_mosi_arr,
-- reg_mdio_miso_arr => reg_mdio_miso_arr,
--
-- -- DP offload RX
-- reg_dp_offload_rx_hdr_dat_mosi => reg_dp_offload_rx_hdr_dat_mosi,
-- reg_dp_offload_rx_hdr_dat_miso => reg_dp_offload_rx_hdr_dat_miso,
--
-- reg_bsn_monitor_mosi => reg_bsn_monitor_mosi,
-- reg_bsn_monitor_miso => reg_bsn_monitor_miso,
--
-- -- . Data buffers input
-- reg_diag_data_buf_input_mosi => reg_diag_data_buf_input_mosi,
-- reg_diag_data_buf_input_miso => reg_diag_data_buf_input_miso,
-- ram_diag_data_buf_input_mosi => ram_diag_data_buf_input_mosi,
-- ram_diag_data_buf_input_miso => ram_diag_data_buf_input_miso,
--
-- -- . Data buffers mesh
-- reg_diag_data_buf_mesh_mosi => reg_diag_data_buf_mesh_mosi,
-- reg_diag_data_buf_mesh_miso => reg_diag_data_buf_mesh_miso,
-- ram_diag_data_buf_mesh_mosi => ram_diag_data_buf_mesh_mosi,
-- ram_diag_data_buf_mesh_miso => ram_diag_data_buf_mesh_miso,
--
-- -- 1GbE visibility offload TX
-- 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,
--
-- -- Filter coefficients
-- ram_fil_coefs_mosi => ram_fil_coefs_mosi,
-- ram_fil_coefs_miso => ram_fil_coefs_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
-- );
END str;
-------------------------------------------------------------------------------
--
-- Copyright (C) 2014
-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
-- JIVE (Joint Institute for VLBI in Europe) <http://www.jive.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 common_lib.common_pkg.ALL;
PACKAGE apertif_unb1_correlator_pkg IS
CONSTANT c_nof_revisions : NATURAL := 4;
CONSTANT c_nof_constants : NATURAL := 10;
TYPE t_apertif_unb1_correlator_revision_matrix IS ARRAY(INTEGER RANGE 0 TO c_nof_constants-1, INTEGER RANGE 0 TO c_nof_revisions-1) OF BOOLEAN;
CONSTANT c_apertif_unb1_correlator_revision_matrix : t_apertif_unb1_correlator_revision_matrix :=
(-- 0 1 2 3
( TRUE, TRUE, TRUE, FALSE), -- c_use_input_node
( TRUE, TRUE, TRUE, TRUE), -- c_use_mesh_node
( TRUE, TRUE, TRUE, FALSE), -- c_use_processing_node
( TRUE, TRUE, TRUE, FALSE), -- c_use_bg_input
( TRUE, TRUE, TRUE, FALSE), -- c_use_db_input
( TRUE, TRUE, TRUE, FALSE), -- c_use_interleave
( TRUE, TRUE, TRUE, TRUE), -- c_use_bg_mesh
( TRUE, TRUE, TRUE, TRUE), -- c_use_db_mesh
( TRUE, TRUE, TRUE, FALSE), -- c_use_repack
( TRUE, TRUE, TRUE, FALSE) -- c_use_wpfb
);
FUNCTION func_revision_number(g_design_name : STRING) RETURN NATURAL;
FUNCTION func_constant_number(c_name : STRING) RETURN NATURAL;
FUNCTION func_rev_selector(g_design_name, c_name : STRING) RETURN BOOLEAN;
END apertif_unb1_correlator_pkg;
PACKAGE BODY apertif_unb1_correlator_pkg IS
FUNCTION func_revision_number(g_design_name : STRING) RETURN NATURAL IS
BEGIN
IF g_design_name = "apertif_unb1_correlator_full" THEN RETURN 0;
ELSIF g_design_name = "apertif_unb1_correlator_lite" THEN RETURN 1;
ELSIF g_design_name = "apertif_unb1_correlator_lite_bg" THEN RETURN 2;
ELSIF g_design_name = "apertif_unb1_correlator_mesh_ref" THEN RETURN 3;
ELSE RETURN 0;
END IF;
END;
FUNCTION func_constant_number(c_name : STRING) RETURN NATURAL IS
BEGIN
IF c_name = "c_use_input_node" THEN RETURN 0;
ELSIF c_name = "c_use_mesh_node" THEN RETURN 1;
ELSIF c_name = "c_use_processing_node" THEN RETURN 2;
ELSIF c_name = "c_use_bg_input" THEN RETURN 3;
ELSIF c_name = "c_use_db_input" THEN RETURN 4;
ELSIF c_name = "c_use_interleave" THEN RETURN 5;
ELSIF c_name = "c_use_bg_mesh" THEN RETURN 6;
ELSIF c_name = "c_use_db_mesh" THEN RETURN 7;
ELSIF c_name = "c_use_repack" THEN RETURN 8;
ELSIF c_name = "c_use_wpfb" THEN RETURN 9;
ELSE RETURN 0;
END IF;
END;
FUNCTION func_rev_selector(g_design_name, c_name : STRING) RETURN BOOLEAN IS
VARIABLE v_rev_index : NATURAL := func_revision_number(g_design_name);
VARIABLE v_con_index : NATURAL := func_constant_number(c_name);
BEGIN
RETURN c_apertif_unb1_correlator_revision_matrix(v_con_index, v_rev_index);
END;
END apertif_unb1_correlator_pkg;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment