From 2c5af00b33c9990d4523304bed52af6a77088991 Mon Sep 17 00:00:00 2001 From: Reinier van der Walle <walle@astron.nl> Date: Mon, 16 Mar 2020 13:59:02 +0100 Subject: [PATCH] Used SISO/SOSI instead of kernel signals. Also made nof IPs configurable with constants in top.vhd --- .../ip/ta2_unb2b_10GbE/ta2_unb2b_10GbE.vhd | 424 +++++++++--------- .../ta2_unb2b_1GbE_mc/ta2_unb2b_1GbE_mc.vhd | 36 +- .../ip/ta2_unb2b_40GbE/ta2_unb2b_40GbE.vhd | 34 +- .../ta2_unb2b_jesd204b/ta2_unb2b_jesd204b.vhd | 171 ++++--- .../ta2_unb2b_bsp/hardware/unb2b/top.vhd | 254 ++++++----- 5 files changed, 451 insertions(+), 468 deletions(-) diff --git a/applications/ta2/libraries/ta2_unb2b_bsp/hardware/unb2b/ip/ta2_unb2b_10GbE/ta2_unb2b_10GbE.vhd b/applications/ta2/libraries/ta2_unb2b_bsp/hardware/unb2b/ip/ta2_unb2b_10GbE/ta2_unb2b_10GbE.vhd index 34f7db0034..27f608901b 100644 --- a/applications/ta2/libraries/ta2_unb2b_bsp/hardware/unb2b/ip/ta2_unb2b_10GbE/ta2_unb2b_10GbE.vhd +++ b/applications/ta2/libraries/ta2_unb2b_bsp/hardware/unb2b/ip/ta2_unb2b_10GbE/ta2_unb2b_10GbE.vhd @@ -57,28 +57,27 @@ USE technology_lib.technology_pkg.ALL; USE common_lib.common_interface_layers_pkg.ALL; USE tech_mac_10g_lib.tech_mac_10g_component_pkg.ALL; -ENTITY ta2_unb2b_10GbE IS +ENTITY ta2_unb2b_10GbE IS + GENERIC ( + g_nof_mac : NATURAL + ); PORT ( - --config_clk : IN STD_LOGIC; -- 100MHz clk for reconfig block and status interface - config_reset : IN STD_LOGIC; + mm_clk : IN STD_LOGIC; -- 100MHz clk for reconfig block and status interface + mm_rst : IN STD_LOGIC; - clk_ref_r : IN STD_LOGIC; -- 644.53125MHz 10G MAC reference clock + clk_ref_r : IN STD_LOGIC; -- 644.53125MHz 10G MAC reference clock - tx_serial_r : OUT STD_LOGIC; -- Serial TX lanes towards QSFP cage - rx_serial_r : IN STD_LOGIC; -- Serial RX lanes from QSFP cage + tx_serial_r : OUT STD_LOGIC_VECTOR(g_nof_mac-1 DOWNTO 0); -- Serial TX lanes towards QSFP cage + rx_serial_r : IN STD_LOGIC_VECTOR(g_nof_mac-1 DOWNTO 0); -- Serial RX lanes from QSFP cage - kernel_clk : IN STD_LOGIC; -- Kernel clock (runs the kernel_* I/O below) - kernel_reset : IN STD_LOGIC; + kernel_clk : IN STD_LOGIC; -- Kernel clock (runs the kernel_* I/O below) + kernel_reset : IN STD_LOGIC; - kernel_src_data : OUT STD_LOGIC_VECTOR(71 DOWNTO 0); -- RX Data to kernel - kernel_src_valid : OUT STD_LOGIC; -- RX data valid signal to kernel - kernel_src_ready : IN STD_LOGIC; -- Flow control from kernel + src_out_arr : OUT t_dp_sosi_arr(g_nof_mac-1 DOWNTO 0); + src_in_arr : IN t_dp_siso_arr(g_nof_mac-1 DOWNTO 0); + snk_out_arr : OUT t_dp_siso_arr(g_nof_mac-1 DOWNTO 0); + snk_in_arr : IN t_dp_sosi_arr(g_nof_mac-1 DOWNTO 0) - kernel_snk_data : IN STD_LOGIC_VECTOR(71 DOWNTO 0); -- TX Data from kernel - kernel_snk_valid : IN STD_LOGIC; -- TX data valid signal from kernel - kernel_snk_ready : OUT STD_LOGIC; -- Flow control towards kernel - - rx_status : OUT STD_LOGIC -- RX status ); END ta2_unb2b_10GbE; @@ -87,8 +86,6 @@ ARCHITECTURE str OF ta2_unb2b_10GbE IS CONSTANT c_sim : BOOLEAN := FALSE; - CONSTANT c_nof_streams_qsfp : NATURAL := 1; - CONSTANT c_tx_fifo_fill : NATURAL := 1125; -- Largest frame is 9000 bytes = 1125 CONSTANT c_tx_fifo_size : NATURAL := 2048; CONSTANT c_rx_fifo_size : NATURAL := 256; -- should be large enough @@ -97,39 +94,36 @@ ARCHITECTURE str OF ta2_unb2b_10GbE IS SIGNAL tr_ref_clk_156 : STD_LOGIC; SIGNAL tr_ref_rst_156 : STD_LOGIC; - SIGNAL unb2_board_front_io_serial_tx_arr : STD_LOGIC_VECTOR(c_nof_streams_qsfp-1 DOWNTO 0) := (OTHERS=>'0'); - SIGNAL unb2_board_front_io_serial_rx_arr : STD_LOGIC_VECTOR(c_nof_streams_qsfp-1 DOWNTO 0); - SIGNAL eth_ref_clk_644 : STD_LOGIC; SIGNAL eth_ref_clk_312 : STD_LOGIC; SIGNAL eth_ref_clk_156 : STD_LOGIC; SIGNAL eth_ref_rst_156 : STD_LOGIC; - SIGNAL eth_tx_clk_arr : STD_LOGIC_VECTOR(c_nof_streams_qsfp-1 DOWNTO 0); - SIGNAL eth_tx_rst_arr : STD_LOGIC_VECTOR(c_nof_streams_qsfp-1 DOWNTO 0); - SIGNAL eth_rx_clk_arr : STD_LOGIC_VECTOR(c_nof_streams_qsfp-1 DOWNTO 0); - SIGNAL eth_rx_rst_arr : STD_LOGIC_VECTOR(c_nof_streams_qsfp-1 DOWNTO 0); + SIGNAL eth_tx_clk_arr : STD_LOGIC_VECTOR(g_nof_mac-1 DOWNTO 0); + SIGNAL eth_tx_rst_arr : STD_LOGIC_VECTOR(g_nof_mac-1 DOWNTO 0); + SIGNAL eth_rx_clk_arr : STD_LOGIC_VECTOR(g_nof_mac-1 DOWNTO 0); + SIGNAL eth_rx_rst_arr : STD_LOGIC_VECTOR(g_nof_mac-1 DOWNTO 0); - SIGNAL dp_latency_adapter_tx_src_out : t_dp_sosi; - SIGNAL dp_latency_adapter_tx_src_in : t_dp_siso; + SIGNAL dp_latency_adapter_tx_src_out_arr : t_dp_sosi_arr(g_nof_mac-1 DOWNTO 0); + SIGNAL dp_latency_adapter_tx_src_in_arr : t_dp_siso_arr(g_nof_mac-1 DOWNTO 0); + SIGNAL dp_latency_adapter_tx_snk_in_arr : t_dp_sosi_arr(g_nof_mac-1 DOWNTO 0); + SIGNAL dp_latency_adapter_tx_snk_out_arr : t_dp_siso_arr(g_nof_mac-1 DOWNTO 0); - SIGNAL dp_latency_adapter_tx_snk_in : t_dp_sosi; - SIGNAL dp_latency_adapter_tx_snk_out : t_dp_siso; + SIGNAL dp_fifo_fill_tx_src_out_arr : t_dp_sosi_arr(g_nof_mac-1 DOWNTO 0); + SIGNAL dp_fifo_fill_tx_src_in_arr : t_dp_siso_arr(g_nof_mac-1 DOWNTO 0); - SIGNAL dp_fifo_fill_tx_src_out_arr : t_dp_sosi_arr(c_nof_streams_qsfp-1 DOWNTO 0); - SIGNAL dp_fifo_fill_tx_src_in_arr : t_dp_siso_arr(c_nof_streams_qsfp-1 DOWNTO 0); + SIGNAL mac_10g_src_out_arr : t_dp_sosi_arr(g_nof_mac-1 DOWNTO 0); + SIGNAL mac_10g_src_in_arr : t_dp_siso_arr(g_nof_mac-1 DOWNTO 0); - SIGNAL mac_10g_src_out_arr : t_dp_sosi_arr(c_nof_streams_qsfp-1 DOWNTO 0); - SIGNAL mac_10g_src_in_arr : t_dp_siso_arr(c_nof_streams_qsfp-1 DOWNTO 0); + SIGNAL dp_fifo_dc_rx_src_out_arr : t_dp_sosi_arr(g_nof_mac-1 DOWNTO 0); + SIGNAL dp_fifo_dc_rx_src_in_arr : t_dp_siso_arr(g_nof_mac-1 DOWNTO 0); - SIGNAL dp_fifo_dc_rx_src_out : t_dp_sosi; - SIGNAL dp_fifo_dc_rx_src_in : t_dp_siso; + SIGNAL dp_latency_adapter_rx_src_out_arr : t_dp_sosi_arr(g_nof_mac-1 DOWNTO 0); + SIGNAL dp_latency_adapter_rx_src_in_arr : t_dp_siso_arr(g_nof_mac-1 DOWNTO 0); - SIGNAL dp_latency_adapter_rx_src_out : t_dp_sosi; - SIGNAL dp_latency_adapter_rx_src_in : t_dp_siso; + SIGNAL dp_xonoff_src_out_arr : t_dp_sosi_arr(g_nof_mac-1 DOWNTO 0); + SIGNAL dp_xonoff_src_in_arr : t_dp_siso_arr(g_nof_mac-1 DOWNTO 0); - SIGNAL dp_xonoff_src_out : t_dp_sosi; - SIGNAL dp_xonoff_src_in : t_dp_siso; BEGIN -------- @@ -141,23 +135,21 @@ BEGIN ) PORT MAP ( refclk_644 => clk_ref_r, - rst_in => config_reset, + rst_in => mm_rst, clk_156 => tr_ref_clk_156, clk_312 => tr_ref_clk_312, rst_156 => tr_ref_rst_156, rst_312 => OPEN ); - --------------------------------------------------------------------------------------- -- Clocks and reset --------------------------------------------------------------------------------------- - -- Apply the clocks from top level down such that they have their rising_edge() aligned without any delta-delay u_tech_eth_10g_clocks : ENTITY tech_eth_10g_lib.tech_eth_10g_clocks GENERIC MAP ( g_technology => c_tech_arria10_e1sg, - g_nof_channels => c_nof_streams_qsfp + g_nof_channels => g_nof_mac ) PORT MAP ( -- Input clocks @@ -183,196 +175,180 @@ BEGIN eth_rx_rst_arr => eth_rx_rst_arr ); - - ---------------------------------------------------------------------------- - -- Data mapping - ---------------------------------------------------------------------------- - -- Reverse byte order - gen_tx_bytes: FOR I IN 0 TO 7 GENERATE - dp_latency_adapter_tx_snk_in.data(8*(8-I) -1 DOWNTO 8*(7-I)) <= kernel_snk_data(8*(I+1) -1 DOWNTO 8*I); - END GENERATE; - - -- Assign correct data fields to control signals. - dp_latency_adapter_tx_snk_in.sop <= kernel_snk_data(64); - dp_latency_adapter_tx_snk_in.eop <= kernel_snk_data(65); - dp_latency_adapter_tx_snk_in.empty(2 DOWNTO 0) <= kernel_snk_data(71 DOWNTO 69); - - dp_latency_adapter_tx_snk_in.valid <= kernel_snk_valid; - kernel_snk_ready <= dp_latency_adapter_tx_snk_out.ready; -- Flow control towards source (kernel) - - rx_status <= dp_xonoff_src_in.xon; -- use xonoff_src_in for status as xonoff_snk_out is always '1' - - tx_serial_r <= unb2_board_front_io_serial_tx_arr(0); - unb2_board_front_io_serial_rx_arr(0) <= rx_serial_r; - - ---------------------------------------------------------------------------- - -- Latency adapter: adapt RL=0 (OpenCL kernel) to RL=1 (Downstream). - ---------------------------------------------------------------------------- - u_dp_latency_adapter_tx : ENTITY dp_lib.dp_latency_adapter - GENERIC MAP ( - g_in_latency => 0, - g_out_latency => 1 - ) - PORT MAP ( - clk => kernel_clk, - rst => kernel_reset, - - snk_in => dp_latency_adapter_tx_snk_in, - snk_out => dp_latency_adapter_tx_snk_out, - - src_out => dp_latency_adapter_tx_src_out, - src_in => dp_latency_adapter_tx_src_in - ); + gen_mac: FOR mac IN 0 TO g_nof_mac-1 GENERATE + ---------------------------------------------------------------------------- + -- Data mapping + ---------------------------------------------------------------------------- + -- Reverse byte order + gen_tx_bytes: FOR I IN 0 TO 7 GENERATE + dp_latency_adapter_tx_snk_in_arr(mac).data(8*(8-I) -1 DOWNTO 8*(7-I)) <= snk_in_arr(mac).data(8*(I+1) -1 DOWNTO 8*I); + END GENERATE; + -- Assign correct data fields to control signals. + dp_latency_adapter_tx_snk_in_arr(mac).sop <= snk_in_arr(mac).data(64); + dp_latency_adapter_tx_snk_in_arr(mac).eop <= snk_in_arr(mac).data(65); + dp_latency_adapter_tx_snk_in_arr(mac).empty(2 DOWNTO 0) <= snk_in_arr(mac).data(71 DOWNTO 69); + dp_latency_adapter_tx_snk_in_arr(mac).valid <= snk_in_arr(mac).valid; + snk_out_arr(mac).ready <= dp_latency_adapter_tx_snk_out_arr(mac).ready; -- Flow control towards source (kernel) + snk_out_arr(mac).xon <= dp_xonoff_src_in_arr(mac).xon; -- use xonoff_src_in for status as xonoff_snk_out is always '1' + + ---------------------------------------------------------------------------- + -- Latency adapter: adapt RL=0 (OpenCL kernel) to RL=1 (Downstream). + ---------------------------------------------------------------------------- + u_dp_latency_adapter_tx : ENTITY dp_lib.dp_latency_adapter + GENERIC MAP ( + g_in_latency => 0, + g_out_latency => 1 + ) + PORT MAP ( + clk => kernel_clk, + rst => kernel_reset, + + snk_in => dp_latency_adapter_tx_snk_in_arr(mac), + snk_out => dp_latency_adapter_tx_snk_out_arr(mac), + + src_out => dp_latency_adapter_tx_src_out_arr(mac), + src_in => dp_latency_adapter_tx_src_in_arr(mac) + ); - ----------------------------------------------------------------------------- - -- RX XON frame control - ----------------------------------------------------------------------------- - - u_dp_xonoff : ENTITY dp_lib.dp_xonoff - PORT MAP ( - rst => kernel_reset, - clk => kernel_clk, - - in_siso => dp_latency_adapter_tx_src_in, - in_sosi => dp_latency_adapter_tx_src_out, - - out_siso => dp_xonoff_src_in, - out_sosi => dp_xonoff_src_out - ); - - - --------------------------------------------------------------------------------------- - -- FIFO FILL with fill level/eop trigger so we can deliver packets to the MAC fast enough - --------------------------------------------------------------------------------------- - - u_dp_fifo_fill_tx_eop : ENTITY dp_lib.dp_fifo_fill_eop - GENERIC MAP ( - g_technology => c_tech_arria10_e1sg, - g_use_dual_clock => TRUE, - g_data_w => c_xgmii_data_w, - g_empty_w => c_tech_mac_10g_empty_w, - g_use_empty => TRUE, - g_fifo_fill => c_tx_fifo_fill, - g_fifo_size => c_tx_fifo_size - ) - PORT MAP ( - wr_rst => kernel_reset, - wr_clk => kernel_clk, - rd_rst => eth_tx_rst_arr(0), - rd_clk => eth_tx_clk_arr(0), - - snk_out => dp_xonoff_src_in, - snk_in => dp_xonoff_src_out, - - src_in => dp_fifo_fill_tx_src_in_arr(0), - src_out => dp_fifo_fill_tx_src_out_arr(0) - ); - - - --------------------------------------------------------------------------------------- - -- ETH MAC + PHY - --------------------------------------------------------------------------------------- - - u_tech_eth_10g : ENTITY tech_eth_10g_lib.tech_eth_10g - GENERIC MAP ( - g_technology => c_tech_arria10_e1sg, - g_sim => c_sim, - g_sim_level => 1, -- 0 = use IP; 1 = use fast serdes model - g_nof_channels => c_nof_streams_qsfp, - g_direction => "TX_RX", - g_pre_header_padding => FALSE - ) - PORT MAP ( - -- Transceiver PLL reference clock - tr_ref_clk_644 => eth_ref_clk_644, -- 644.531250 MHz for 10GBASE-R - tr_ref_clk_312 => eth_ref_clk_312, -- 312.5 MHz for 10GBASE-R - tr_ref_clk_156 => eth_ref_clk_156, -- 156.25 MHz for 10GBASE-R or for XAUI - tr_ref_rst_156 => eth_ref_rst_156, -- for 10GBASE-R or for XAUI + + ----------------------------------------------------------------------------- + -- RX XON frame control + ----------------------------------------------------------------------------- + u_dp_xonoff : ENTITY dp_lib.dp_xonoff + PORT MAP ( + rst => kernel_reset, + clk => kernel_clk, + + in_siso => dp_latency_adapter_tx_src_in_arr(mac), + in_sosi => dp_latency_adapter_tx_src_out_arr(mac), + + out_siso => dp_xonoff_src_in_arr(mac), + out_sosi => dp_xonoff_src_out_arr(mac) + ); + + --------------------------------------------------------------------------------------- + -- FIFO FILL with fill level/eop trigger so we can deliver packets to the MAC fast enough + --------------------------------------------------------------------------------------- + u_dp_fifo_fill_tx_eop : ENTITY dp_lib.dp_fifo_fill_eop + GENERIC MAP ( + g_technology => c_tech_arria10_e1sg, + g_use_dual_clock => TRUE, + g_data_w => c_xgmii_data_w, + g_empty_w => c_tech_mac_10g_empty_w, + g_use_empty => TRUE, + g_fifo_fill => c_tx_fifo_fill, + g_fifo_size => c_tx_fifo_size + ) + PORT MAP ( + wr_rst => kernel_reset, + wr_clk => kernel_clk, + rd_rst => eth_tx_rst_arr(mac), + rd_clk => eth_tx_clk_arr(mac), + + snk_out => dp_xonoff_src_in_arr(mac), + snk_in => dp_xonoff_src_out_arr(mac), + + src_in => dp_fifo_fill_tx_src_in_arr(mac), + src_out => dp_fifo_fill_tx_src_out_arr(mac) + ); + + + --------------------------------------------------------------------------------------- + -- ETH MAC + PHY, use g_nof_mac duplicates of eth_10g with g_nof_channels = 1 to be most flexible + --------------------------------------------------------------------------------------- + u_tech_eth_10g : ENTITY tech_eth_10g_lib.tech_eth_10g + GENERIC MAP ( + g_technology => c_tech_arria10_e1sg, + g_sim => c_sim, + g_sim_level => 1, -- 0 = use IP; 1 = use fast serdes model + g_nof_channels => 1, + g_direction => "TX_RX", + g_pre_header_padding => FALSE + ) + PORT MAP ( + -- Transceiver PLL reference clock + tr_ref_clk_644 => eth_ref_clk_644, -- 644.531250 MHz for 10GBASE-R + tr_ref_clk_312 => eth_ref_clk_312, -- 312.5 MHz for 10GBASE-R + tr_ref_clk_156 => eth_ref_clk_156, -- 156.25 MHz for 10GBASE-R or for XAUI + tr_ref_rst_156 => eth_ref_rst_156, -- for 10GBASE-R or for XAUI + + -- MM + mm_clk => '0', + mm_rst => '0', - -- MM - mm_clk => '0', - mm_rst => '0', + -- ST + tx_snk_in_arr => dp_fifo_fill_tx_src_out_arr(mac DOWNTO mac), -- 64 bit data @ 156 MHz + tx_snk_out_arr => dp_fifo_fill_tx_src_in_arr(mac DOWNTO mac), + + rx_src_out_arr => mac_10g_src_out_arr(mac DOWNTO mac), -- 64 bit data @ 156 MHz + rx_src_in_arr => mac_10g_src_in_arr(mac DOWNTO mac), + + -- PHY serial IO + -- . 10GBASE-R (single lane) + serial_tx_arr => tx_serial_r(mac DOWNTO mac), + serial_rx_arr => rx_serial_r(mac DOWNTO mac) + ); - -- ST - tx_snk_in_arr => dp_fifo_fill_tx_src_out_arr, -- 64 bit data @ 156 MHz - tx_snk_out_arr => dp_fifo_fill_tx_src_in_arr, + --------------------------------------------------------------------------------------- + -- RX FIFO: rx_clk -> dp_clk + --------------------------------------------------------------------------------------- + u_dp_fifo_dc_rx : ENTITY dp_lib.dp_fifo_dc + GENERIC MAP ( + g_technology => c_tech_arria10_e1sg, + g_data_w => c_xgmii_data_w, + g_empty_w => c_tech_mac_10g_empty_w, + g_use_empty => TRUE, + g_fifo_size => c_rx_fifo_size + ) + PORT MAP ( + wr_rst => eth_rx_rst_arr(mac), + wr_clk => eth_rx_clk_arr(mac), + rd_rst => kernel_reset, + rd_clk => kernel_clk, - rx_src_out_arr => mac_10g_src_out_arr, -- 64 bit data @ 156 MHz - rx_src_in_arr => mac_10g_src_in_arr, + snk_out => mac_10g_src_in_arr(mac), + snk_in => mac_10g_src_out_arr(mac), - -- PHY serial IO - -- . 10GBASE-R (single lane) - serial_tx_arr => unb2_board_front_io_serial_tx_arr, - serial_rx_arr => unb2_board_front_io_serial_rx_arr - ); - - - - --------------------------------------------------------------------------------------- - -- RX FIFO: rx_clk -> dp_clk - --------------------------------------------------------------------------------------- - - u_dp_fifo_dc_rx : ENTITY dp_lib.dp_fifo_dc - GENERIC MAP ( - g_technology => c_tech_arria10_e1sg, - g_data_w => c_xgmii_data_w, - g_empty_w => c_tech_mac_10g_empty_w, - g_use_empty => TRUE, - g_fifo_size => c_rx_fifo_size - ) - PORT MAP ( - wr_rst => eth_rx_rst_arr(0), - wr_clk => eth_rx_clk_arr(0), - rd_rst => kernel_reset, - rd_clk => kernel_clk, + src_in => dp_fifo_dc_rx_src_in_arr(mac), + src_out => dp_fifo_dc_rx_src_out_arr(mac) + ); - snk_out => mac_10g_src_in_arr(0), - snk_in => mac_10g_src_out_arr(0), + ---------------------------------------------------------------------------- + -- Latency adapter: adapt RL=1 (Upstream) to RL=0 (OpenCL kernel). + ---------------------------------------------------------------------------- + u_dp_latency_adapter_rx : ENTITY dp_lib.dp_latency_adapter + GENERIC MAP ( + g_in_latency => 1, + g_out_latency => 0 + ) + PORT MAP ( + clk => kernel_clk, + rst => kernel_reset, - src_in => dp_fifo_dc_rx_src_in, - src_out => dp_fifo_dc_rx_src_out - ); - - - ---------------------------------------------------------------------------- - -- Latency adapter: adapt RL=1 (Upstream) to RL=0 (OpenCL kernel). - ---------------------------------------------------------------------------- - u_dp_latency_adapter_rx : ENTITY dp_lib.dp_latency_adapter - GENERIC MAP ( - g_in_latency => 1, - g_out_latency => 0 - ) - PORT MAP ( - clk => kernel_clk, - rst => kernel_reset, - - snk_in => dp_fifo_dc_rx_src_out, - snk_out => dp_fifo_dc_rx_src_in, - - src_out => dp_latency_adapter_rx_src_out, - src_in => dp_latency_adapter_rx_src_in - ); - - - ---------------------------------------------------------------------------- - -- Data mapping - ---------------------------------------------------------------------------- - -- Reverse byte order - gen_rx_bytes: FOR I IN 0 TO 7 GENERATE - kernel_src_data(8*(8-I) -1 DOWNTO 8*(7-I)) <= dp_latency_adapter_rx_src_out.data(8*(I+1) -1 DOWNTO 8*I); - END GENERATE; - - -- Assign control signals to correct data fields. - kernel_src_data(64) <= dp_latency_adapter_rx_src_out.sop; - kernel_src_data(65) <= dp_latency_adapter_rx_src_out.eop; - kernel_src_data(71 DOWNTO 69) <= dp_latency_adapter_rx_src_out.empty(2 DOWNTO 0); + snk_in => dp_fifo_dc_rx_src_out_arr(mac), + snk_out => dp_fifo_dc_rx_src_in_arr(mac), - - kernel_src_valid <= dp_latency_adapter_rx_src_out.valid; - dp_latency_adapter_rx_src_in.ready <= kernel_src_ready; - dp_latency_adapter_rx_src_in.xon <= '1'; - + src_out => dp_latency_adapter_rx_src_out_arr(mac), + src_in => dp_latency_adapter_rx_src_in_arr(mac) + ); + + ---------------------------------------------------------------------------- + -- Data mapping + ---------------------------------------------------------------------------- + -- Reverse byte order + gen_rx_bytes: FOR I IN 0 TO 7 GENERATE + src_out_arr(mac).data(8*(8-I) -1 DOWNTO 8*(7-I)) <= dp_latency_adapter_rx_src_out_arr(mac).data(8*(I+1) -1 DOWNTO 8*I); + END GENERATE; + + -- Assign control signals to correct data fields. + src_out_arr(mac).data(64) <= dp_latency_adapter_rx_src_out_arr(mac).sop; + src_out_arr(mac).data(65) <= dp_latency_adapter_rx_src_out_arr(mac).eop; + src_out_arr(mac).data(71 DOWNTO 69) <= dp_latency_adapter_rx_src_out_arr(mac).empty(2 DOWNTO 0); + src_out_arr(mac).valid <= dp_latency_adapter_rx_src_out_arr(mac).valid; + dp_latency_adapter_rx_src_in_arr(mac).ready <= src_in_arr(mac).ready; + dp_latency_adapter_rx_src_in_arr(mac).xon <= '1'; + END GENERATE; END str; diff --git a/applications/ta2/libraries/ta2_unb2b_bsp/hardware/unb2b/ip/ta2_unb2b_1GbE_mc/ta2_unb2b_1GbE_mc.vhd b/applications/ta2/libraries/ta2_unb2b_bsp/hardware/unb2b/ip/ta2_unb2b_1GbE_mc/ta2_unb2b_1GbE_mc.vhd index 79c186c775..9e87d67520 100644 --- a/applications/ta2/libraries/ta2_unb2b_bsp/hardware/unb2b/ip/ta2_unb2b_1GbE_mc/ta2_unb2b_1GbE_mc.vhd +++ b/applications/ta2/libraries/ta2_unb2b_bsp/hardware/unb2b/ip/ta2_unb2b_1GbE_mc/ta2_unb2b_1GbE_mc.vhd @@ -64,14 +64,10 @@ ENTITY ta2_unb2b_1GbE_mc IS kernel_clk : IN STD_LOGIC; -- Kernel clock (runs the kernel_* I/O below) kernel_reset : IN STD_LOGIC; - kernel_src_data : OUT STD_LOGIC_VECTOR(5*c_byte_w -1 DOWNTO 0); -- RX Data to kernel - kernel_src_valid : OUT STD_LOGIC; -- RX data valid signal to kernel - kernel_src_ready : IN STD_LOGIC; -- Flow control from kernel - - kernel_snk_data : IN STD_LOGIC_VECTOR(5*c_byte_w -1 DOWNTO 0); -- TX Data from kernel - kernel_snk_valid : IN STD_LOGIC; -- TX data valid signal from kernel - kernel_snk_ready : OUT STD_LOGIC -- Flow control towards kernel - + src_out : OUT t_dp_sosi; + src_in : IN t_dp_siso; + snk_out : OUT t_dp_siso; + snk_in : IN t_dp_sosi ); END ta2_unb2b_1GbE_mc; @@ -109,16 +105,16 @@ BEGIN ---------------------------------------------------------------------------- -- Reverse byte order gen_tx_bytes: FOR I IN 0 TO 3 GENERATE - dp_latency_adapter_tx_snk_in.data(c_byte_w*(4-I) -1 DOWNTO c_byte_w*(3-I)) <= kernel_snk_data(c_byte_w*(I+1) -1 DOWNTO c_byte_w*I); + dp_latency_adapter_tx_snk_in.data(c_byte_w*(4-I) -1 DOWNTO c_byte_w*(3-I)) <= snk_in.data(c_byte_w*(I+1) -1 DOWNTO c_byte_w*I); END GENERATE; -- Assign correct data fields to control signals. - dp_latency_adapter_tx_snk_in.sop <= kernel_snk_data(32); - dp_latency_adapter_tx_snk_in.eop <= kernel_snk_data(33); - dp_latency_adapter_tx_snk_in.empty(1 DOWNTO 0) <= kernel_snk_data(39 DOWNTO 38); + dp_latency_adapter_tx_snk_in.sop <= snk_in.data(32); + dp_latency_adapter_tx_snk_in.eop <= snk_in.data(33); + dp_latency_adapter_tx_snk_in.empty(1 DOWNTO 0) <= snk_in.data(39 DOWNTO 38); - dp_latency_adapter_tx_snk_in.valid <= kernel_snk_valid; - kernel_snk_ready <= dp_latency_adapter_tx_snk_out.ready; -- Flow control towards source (kernel) + dp_latency_adapter_tx_snk_in.valid <= snk_in.valid; + snk_out.ready <= dp_latency_adapter_tx_snk_out.ready; -- Flow control towards source (kernel) ---------------------------------------------------------------------------- -- Latency adapter: adapt RL=0 (OpenCL kernel) to RL=1 (Downstream). @@ -234,17 +230,17 @@ BEGIN ---------------------------------------------------------------------------- -- Reverse byte order gen_rx_bytes: FOR I IN 0 TO 3 GENERATE - kernel_src_data(c_byte_w*(4-I) -1 DOWNTO c_byte_w*(3-I)) <= dp_latency_adapter_rx_src_out.data(c_byte_w*(I+1) -1 DOWNTO c_byte_w*I); + src_out.data(c_byte_w*(4-I) -1 DOWNTO c_byte_w*(3-I)) <= dp_latency_adapter_rx_src_out.data(c_byte_w*(I+1) -1 DOWNTO c_byte_w*I); END GENERATE; -- Assign control signals to correct data fields. - kernel_src_data(32) <= dp_latency_adapter_rx_src_out.sop; - kernel_src_data(33) <= dp_latency_adapter_rx_src_out.eop; - kernel_src_data(39 DOWNTO 38) <= dp_latency_adapter_rx_src_out.empty(1 DOWNTO 0); + src_out.data(32) <= dp_latency_adapter_rx_src_out.sop; + src_out.data(33) <= dp_latency_adapter_rx_src_out.eop; + src_out.data(39 DOWNTO 38) <= dp_latency_adapter_rx_src_out.empty(1 DOWNTO 0); - kernel_src_valid <= dp_latency_adapter_rx_src_out.valid; - dp_latency_adapter_rx_src_in.ready <= kernel_src_ready; + src_out.valid <= dp_latency_adapter_rx_src_out.valid; + dp_latency_adapter_rx_src_in.ready <= src_in.ready; dp_latency_adapter_rx_src_in.xon <= '1'; diff --git a/applications/ta2/libraries/ta2_unb2b_bsp/hardware/unb2b/ip/ta2_unb2b_40GbE/ta2_unb2b_40GbE.vhd b/applications/ta2/libraries/ta2_unb2b_bsp/hardware/unb2b/ip/ta2_unb2b_40GbE/ta2_unb2b_40GbE.vhd index 0bbee7f131..87962e2db3 100644 --- a/applications/ta2/libraries/ta2_unb2b_bsp/hardware/unb2b/ip/ta2_unb2b_40GbE/ta2_unb2b_40GbE.vhd +++ b/applications/ta2/libraries/ta2_unb2b_bsp/hardware/unb2b/ip/ta2_unb2b_40GbE/ta2_unb2b_40GbE.vhd @@ -60,21 +60,21 @@ ENTITY ta2_unb2b_40GbE IS g_nof_mac : NATURAL := 1 ); PORT ( - config_clk : IN STD_LOGIC; -- 100MHz clk for reconfig block and status interface - config_reset : IN STD_LOGIC; + mm_clk : IN STD_LOGIC; -- 100MHz clk for reconfig block and status interface + mm_rst : IN STD_LOGIC; - clk_ref_r : IN STD_LOGIC; -- 644.53125MHz 40G MAC reference clock + clk_ref_r : IN STD_LOGIC; -- 644.53125MHz 40G MAC reference clock - tx_serial_r : OUT STD_LOGIC_VECTOR(4*g_nof_mac-1 DOWNTO 0); -- Serial TX lanes towards QSFP cage - rx_serial_r : IN STD_LOGIC_VECTOR(4*g_nof_mac-1 DOWNTO 0); -- Serial RX lanes from QSFP cage + tx_serial_r : OUT STD_LOGIC_VECTOR(4*g_nof_mac-1 DOWNTO 0); -- Serial TX lanes towards QSFP cage + rx_serial_r : IN STD_LOGIC_VECTOR(4*g_nof_mac-1 DOWNTO 0); -- Serial RX lanes from QSFP cage - kernel_clk : IN STD_LOGIC; -- Kernel clock (runs the kernel_* I/O below) - kernel_reset : IN STD_LOGIC; + kernel_clk : IN STD_LOGIC; -- Kernel clock (runs the kernel_* I/O below) + kernel_reset : IN STD_LOGIC; - src_out_arr : OUT t_dp_sosi_arr(g_nof_mac-1 DOWNTO 0); - src_in_arr : IN t_dp_siso_arr(g_nof_mac-1 DOWNTO 0); - snk_out_arr : OUT t_dp_siso_arr(g_nof_mac-1 DOWNTO 0); - snk_in_arr : IN t_dp_sosi_arr(g_nof_mac-1 DOWNTO 0) + src_out_arr : OUT t_dp_sosi_arr(g_nof_mac-1 DOWNTO 0); + src_in_arr : IN t_dp_siso_arr(g_nof_mac-1 DOWNTO 0); + snk_out_arr : OUT t_dp_siso_arr(g_nof_mac-1 DOWNTO 0); + snk_in_arr : IN t_dp_sosi_arr(g_nof_mac-1 DOWNTO 0) ); END ta2_unb2b_40GbE; @@ -381,7 +381,7 @@ BEGIN u_arria10_40g_mac : arria10_40g_mac PORT MAP ( - reset_async(0) => config_reset, + reset_async(0) => mm_rst, clk_txmac(0) => clk_txmac_arr(mac), -- MAC + PCS clock - at least 312.5Mhz clk_rxmac(0) => clk_rxmac_arr(mac), -- MAC + PCS clock - at least 312.5Mhz clk_ref(0) => clk_ref_r, @@ -390,8 +390,8 @@ BEGIN tx_serial_clk => serial_clk_2arr(mac), tx_pll_locked(0) => pll_locked_arr(mac), - clk_status(0) => config_clk, - reset_status(0) => config_reset, + clk_status(0) => mm_clk, + reset_status(0) => mm_rst, status_addr => (OTHERS=>'0'), status_read => (OTHERS=>'0'), status_write => (OTHERS=>'0'), @@ -400,8 +400,8 @@ BEGIN -- status_read_timeout => status_read_timeout, -- status_readdata_valid => status_readdata_valid_eth, - reconfig_clk(0) => config_clk, - reconfig_reset(0) => config_reset, + reconfig_clk(0) => mm_clk, + reconfig_reset(0) => mm_rst, reconfig_write => (OTHERS=>'0'), reconfig_read => (OTHERS=>'0'), reconfig_address => (OTHERS=>'0'), @@ -577,7 +577,7 @@ BEGIN port map ( pll_cal_busy => OPEN, pll_locked => pll_locked_arr(mac), - pll_powerdown => config_reset, + pll_powerdown => mm_rst, pll_refclk0 => clk_ref_r, tx_serial_clk => serial_clk_arr(mac) ); diff --git a/applications/ta2/libraries/ta2_unb2b_bsp/hardware/unb2b/ip/ta2_unb2b_jesd204b/ta2_unb2b_jesd204b.vhd b/applications/ta2/libraries/ta2_unb2b_bsp/hardware/unb2b/ip/ta2_unb2b_jesd204b/ta2_unb2b_jesd204b.vhd index 506ffc71d9..61a92c4c21 100644 --- a/applications/ta2/libraries/ta2_unb2b_bsp/hardware/unb2b/ip/ta2_unb2b_jesd204b/ta2_unb2b_jesd204b.vhd +++ b/applications/ta2/libraries/ta2_unb2b_bsp/hardware/unb2b/ip/ta2_unb2b_jesd204b/ta2_unb2b_jesd204b.vhd @@ -50,9 +50,12 @@ USE technology_lib.technology_pkg.ALL; USE common_lib.common_interface_layers_pkg.ALL; ENTITY ta2_unb2b_jesd204b IS + GENERIC ( + g_nof_streams : NATURAL := 12 -- can be 1-12 + ); PORT ( - config_clk : IN STD_LOGIC; -- 100MHz clk for reconfig block and status interface - config_reset : IN STD_LOGIC; + mm_clk : IN STD_LOGIC; -- 100MHz clk for reconfig block and status interface + mm_rst : IN STD_LOGIC; -- MM Control jesd204b_mosi : IN t_mem_mosi; @@ -61,16 +64,15 @@ ENTITY ta2_unb2b_jesd204b IS -- JESD204B external signals jesd204b_refclk : IN STD_LOGIC := '0'; -- Reference clock. For AD9683 use 200MHz direct from clock reference pin jesd204b_sysref : IN STD_LOGIC := '0'; -- SYSREF should drive ADC and FPGA with correct phase wrt jesd204b_device_clk - jesd204b_sync_n_arr : OUT STD_LOGIC_VECTOR(0 DOWNTO 0); -- output to control ADC initialization/syncronization phase + jesd204b_sync_n_arr : OUT STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); -- output to control ADC initialization/syncronization phase - serial_rx_arr : IN STD_LOGIC_VECTOR(0 DOWNTO 0); + serial_rx_arr : IN STD_LOGIC_VECTOR(g_nof_streams-1 DOWNTO 0); kernel_clk : IN STD_LOGIC; -- Kernel clock (runs the kernel_* I/O below) kernel_reset : IN STD_LOGIC; - kernel_src_data : OUT STD_LOGIC_VECTOR(15 DOWNTO 0); -- RX Data to kernel - kernel_src_valid : OUT STD_LOGIC; -- RX data valid signal to kernel - kernel_src_ready : IN STD_LOGIC -- Flow control from kernel + src_out_arr : OUT t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); + src_in_arr : IN t_dp_siso_arr(g_nof_streams-1 DOWNTO 0) ); END ta2_unb2b_jesd204b; @@ -80,29 +82,27 @@ ARCHITECTURE str OF ta2_unb2b_jesd204b IS CONSTANT c_sim : BOOLEAN := FALSE; - CONSTANT c_nof_connected_streams_jesd204b: NATURAL := 1; CONSTANT c_nof_streams_jesd204b : NATURAL := 12; CONSTANT c_rx_fifo_size : NATURAL := 32; -- should be large enough - SIGNAL dp_fifo_dc_rx_src_out : t_dp_sosi; - SIGNAL dp_fifo_dc_rx_snk_in : t_dp_sosi := c_dp_sosi_rst; - SIGNAL dp_fifo_dc_rx_src_in : t_dp_siso; - SIGNAL dp_fifo_dc_rx_snk_out : t_dp_siso; + SIGNAL dp_fifo_dc_rx_src_out_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); + SIGNAL dp_fifo_dc_rx_snk_in_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0) := (OTHERS => c_dp_sosi_rst); + SIGNAL dp_fifo_dc_rx_src_in_arr : t_dp_siso_arr(g_nof_streams-1 DOWNTO 0); + SIGNAL dp_fifo_dc_rx_snk_out_arr : t_dp_siso_arr(g_nof_streams-1 DOWNTO 0); - SIGNAL dp_latency_adapter_rx_src_out : t_dp_sosi; - SIGNAL dp_latency_adapter_rx_src_in : t_dp_siso; + SIGNAL dp_latency_adapter_rx_src_out_arr : t_dp_sosi_arr(g_nof_streams-1 DOWNTO 0); + SIGNAL dp_latency_adapter_rx_src_in_arr : t_dp_siso_arr(g_nof_streams-1 DOWNTO 0); SIGNAL jesd204b_rx_src_out_arr : t_dp_sosi_arr(c_nof_streams_jesd204b-1 DOWNTO 0); SIGNAL jesd204b_frame_clk : STD_LOGIC; - SIGNAL jesd204b_rx_src_out_flat_w_sync : t_dp_sosi; SIGNAL i_jesd204b_sync_n_arr : STD_LOGIC_VECTOR(c_nof_streams_jesd204b-1 DOWNTO 0); SIGNAL jesd204b_serial_rx_arr : STD_LOGIC_VECTOR(c_nof_streams_jesd204b-1 DOWNTO 0) := (OTHERS => '0'); BEGIN - jesd204b_sync_n_arr <= i_jesd204b_sync_n_arr(c_nof_connected_streams_jesd204b -1 DOWNTO 0); - jesd204b_serial_rx_arr(c_nof_connected_streams_jesd204b -1 DOWNTO 0) <= serial_rx_arr; + jesd204b_sync_n_arr <= i_jesd204b_sync_n_arr(g_nof_streams -1 DOWNTO 0); + jesd204b_serial_rx_arr(g_nof_streams -1 DOWNTO 0) <= serial_rx_arr; u_jesd204b: ENTITY tech_jesd204b_lib.tech_jesd204b GENERIC MAP( @@ -118,8 +118,8 @@ BEGIN jesd204b_frame_clk => jesd204b_frame_clk, -- MM - mm_clk => config_clk, - mm_rst => config_reset, + mm_clk => mm_clk, + mm_rst => mm_rst, jesd204b_mosi => jesd204b_mosi, jesd204b_miso => jesd204b_miso, @@ -129,73 +129,72 @@ BEGIN serial_rx_arr => jesd204b_serial_rx_arr ); - - --------------------------------------------------------------------------------------- - -- RX FIFO: adc_clk -> kernel_clk - --------------------------------------------------------------------------------------- - - dp_fifo_dc_rx_snk_in.data(13 DOWNTO 0) <= jesd204b_rx_src_out_arr(0).data(15 DOWNTO 2); - dp_fifo_dc_rx_snk_in.data(14) <= jesd204b_rx_src_out_arr(0).data(15); - dp_fifo_dc_rx_snk_in.data(15) <= jesd204b_rx_src_out_arr(0).data(15); - dp_fifo_dc_rx_snk_in.valid <= dp_fifo_dc_rx_snk_out.ready AND jesd204b_rx_src_out_arr(0).valid; - - u_dp_fifo_dc_rx : ENTITY dp_lib.dp_fifo_dc - GENERIC MAP ( - g_technology => c_tech_arria10_e1sg, - g_data_w => 16, - g_empty_w => 1, - g_use_empty => FALSE, - g_use_ctrl => FALSE, - g_fifo_size => c_rx_fifo_size - ) - PORT MAP ( - wr_rst => kernel_reset, - wr_clk => jesd204b_frame_clk, - rd_rst => kernel_reset, - rd_clk => kernel_clk, - - snk_out => dp_fifo_dc_rx_snk_out, - snk_in => dp_fifo_dc_rx_snk_in, - - src_in => dp_fifo_dc_rx_src_in, - src_out => dp_fifo_dc_rx_src_out - ); - - - ---------------------------------------------------------------------------- - -- Latency adapter: adapt RL=1 (Upstream) to RL=0 (OpenCL kernel). - ---------------------------------------------------------------------------- - u_dp_latency_adapter_rx : ENTITY dp_lib.dp_latency_adapter - GENERIC MAP ( - g_in_latency => 1, - g_out_latency => 0 - ) - PORT MAP ( - clk => kernel_clk, - rst => kernel_reset, - - snk_in => dp_fifo_dc_rx_src_out, - snk_out => dp_fifo_dc_rx_src_in, - - src_out => dp_latency_adapter_rx_src_out, - src_in => dp_latency_adapter_rx_src_in - ); - - - ---------------------------------------------------------------------------- - -- Data mapping - ---------------------------------------------------------------------------- - -- Reverse byte order - --gen_rx_bytes: FOR I IN 0 TO c_halfword_sz-1 GENERATE - -- kernel_src_data(c_byte_w*(c_halfword_sz-I) -1 DOWNTO c_byte_w*(c_halfword_sz-1-I)) <= dp_latency_adapter_rx_src_out.data(c_byte_w*(I+1) -1 DOWNTO c_byte_w*I); - --END GENERATE; - - kernel_src_data <= dp_latency_adapter_rx_src_out.data(15 DOWNTO 0); - - kernel_src_valid <= dp_latency_adapter_rx_src_out.valid; - dp_latency_adapter_rx_src_in.ready <= kernel_src_ready; - dp_latency_adapter_rx_src_in.xon <= '1'; - + gen_streams: FOR stream IN 0 TO g_nof_streams-1 GENERATE + --------------------------------------------------------------------------------------- + -- RX FIFO: adc_clk -> kernel_clk + --------------------------------------------------------------------------------------- + + dp_fifo_dc_rx_snk_in_arr(stream).data(13 DOWNTO 0) <= jesd204b_rx_src_out_arr(stream).data(15 DOWNTO 2); + dp_fifo_dc_rx_snk_in_arr(stream).data(14) <= jesd204b_rx_src_out_arr(stream).data(15); + dp_fifo_dc_rx_snk_in_arr(stream).data(15) <= jesd204b_rx_src_out_arr(stream).data(15); + dp_fifo_dc_rx_snk_in_arr(stream).valid <= dp_fifo_dc_rx_snk_out_arr(stream).ready AND jesd204b_rx_src_out_arr(stream).valid; + + u_dp_fifo_dc_rx : ENTITY dp_lib.dp_fifo_dc + GENERIC MAP ( + g_technology => c_tech_arria10_e1sg, + g_data_w => 16, + g_empty_w => 1, + g_use_empty => FALSE, + g_use_ctrl => FALSE, + g_fifo_size => c_rx_fifo_size + ) + PORT MAP ( + wr_rst => kernel_reset, + wr_clk => jesd204b_frame_clk, + rd_rst => kernel_reset, + rd_clk => kernel_clk, + + snk_out => dp_fifo_dc_rx_snk_out_arr(stream), + snk_in => dp_fifo_dc_rx_snk_in_arr(stream), + + src_in => dp_fifo_dc_rx_src_in_arr(stream), + src_out => dp_fifo_dc_rx_src_out_arr(stream) + ); + + + ---------------------------------------------------------------------------- + -- Latency adapter: adapt RL=1 (Upstream) to RL=0 (OpenCL kernel). + ---------------------------------------------------------------------------- + u_dp_latency_adapter_rx : ENTITY dp_lib.dp_latency_adapter + GENERIC MAP ( + g_in_latency => 1, + g_out_latency => 0 + ) + PORT MAP ( + clk => kernel_clk, + rst => kernel_reset, + + snk_in => dp_fifo_dc_rx_src_out_arr(stream), + snk_out => dp_fifo_dc_rx_src_in_arr(stream), + + src_out => dp_latency_adapter_rx_src_out_arr(stream), + src_in => dp_latency_adapter_rx_src_in_arr(stream) + ); + + + ---------------------------------------------------------------------------- + -- Data mapping + ---------------------------------------------------------------------------- + -- Reverse byte order + --gen_rx_bytes: FOR I IN 0 TO c_halfword_sz-1 GENERATE + -- kernel_src_data(c_byte_w*(c_halfword_sz-I) -1 DOWNTO c_byte_w*(c_halfword_sz-1-I)) <= dp_latency_adapter_rx_src_out.data(c_byte_w*(I+1) -1 DOWNTO c_byte_w*I); + --END GENERATE; + + src_out_arr(stream).data(15 DOWNTO 0) <= dp_latency_adapter_rx_src_out_arr(stream).data(15 DOWNTO 0); + src_out_arr(stream).valid <= dp_latency_adapter_rx_src_out_arr(stream).valid; + dp_latency_adapter_rx_src_in_arr(stream).ready <= src_in_arr(stream).ready; + dp_latency_adapter_rx_src_in_arr(stream).xon <= '1'; + END GENERATE; END str; diff --git a/applications/ta2/libraries/ta2_unb2b_bsp/hardware/unb2b/top.vhd b/applications/ta2/libraries/ta2_unb2b_bsp/hardware/unb2b/top.vhd index 42ce5312d6..e3cc0384ae 100644 --- a/applications/ta2/libraries/ta2_unb2b_bsp/hardware/unb2b/top.vhd +++ b/applications/ta2/libraries/ta2_unb2b_bsp/hardware/unb2b/top.vhd @@ -101,25 +101,38 @@ END top; ARCHITECTURE str OF top IS - - -- Firmware version x.y - CONSTANT c_fw_version : t_unb2b_board_fw_version := (1, 1); - CONSTANT c_mm_clk_freq : NATURAL := c_unb2b_board_mm_clk_freq_100M; - - -- 1 GbE - CONSTANT c_use_1GbE_udp_offload : BOOLEAN := TRUE; - CONSTANT c_nof_streams_1GbE : NATURAL := 1; - - -- 10GbE + --------------- + -- Constants + --------------- + -- QSFP CONSTANT c_nof_qsfp_bus : NATURAL := 2; + CONSTANT c_nof_streams_qsfp : NATURAL := c_unb2b_board_tr_qsfp.bus_w*c_nof_qsfp_bus; + + -- RING CONSTANT c_nof_ring_bus : NATURAL := 2; CONSTANT c_ring_bus_w : NATURAL := c_unb2b_board_tr_ring.bus_w; - CONSTANT c_nof_streams_qsfp : NATURAL := c_unb2b_board_tr_qsfp.bus_w*c_nof_qsfp_bus; CONSTANT c_nof_streams_ring : NATURAL := c_unb2b_board_tr_ring.bus_w*c_nof_ring_bus; -- 40GbE CONSTANT c_nof_40GbE_IP : NATURAL := 3; + -- 10GbE + CONSTANT c_nof_10GbE_IP : NATURAL := 1; + + -- 1 GbE + CONSTANT c_use_1GbE_udp_offload : BOOLEAN := TRUE; + CONSTANT c_nof_streams_1GbE : NATURAL := 1; + + -- ADC + CONSTANT c_nof_ADC : NATURAL := 1; + + -- Firmware version x.y + CONSTANT c_fw_version : t_unb2b_board_fw_version := (1, 1); + CONSTANT c_mm_clk_freq : NATURAL := c_unb2b_board_mm_clk_freq_100M; + + ------------ + -- Signals + ------------ -- System SIGNAL cs_sim : STD_LOGIC; SIGNAL xo_ethclk : STD_LOGIC; @@ -202,16 +215,17 @@ ARCHITECTURE str OF top IS SIGNAL reg_ta2_unb2b_jesd204b_mosi : t_mem_mosi; SIGNAL reg_ta2_unb2b_jesd204b_miso : t_mem_miso; - -- 10GbE + -- QSFP SIGNAL i_QSFP_TX : t_unb2b_board_qsfp_bus_2arr(c_nof_qsfp_bus-1 DOWNTO 0); SIGNAL i_QSFP_RX : t_unb2b_board_qsfp_bus_2arr(c_nof_qsfp_bus-1 DOWNTO 0); + + SIGNAL unb2b_board_front_io_serial_tx_arr : STD_LOGIC_VECTOR(c_nof_streams_qsfp-1 DOWNTO 0) := (OTHERS=>'0'); + SIGNAL unb2b_board_front_io_serial_rx_arr : STD_LOGIC_VECTOR(c_nof_streams_qsfp-1 DOWNTO 0); + -- RING SIGNAL i_RING_TX : t_unb2b_board_ring_bus_2arr(c_nof_ring_bus-1 DOWNTO 0); SIGNAL i_RING_RX : t_unb2b_board_ring_bus_2arr(c_nof_ring_bus-1 DOWNTO 0); - SIGNAL unb2b_board_front_io_serial_tx_arr : STD_LOGIC_VECTOR(c_nof_streams_qsfp-1 DOWNTO 0) := (OTHERS=>'0'); - SIGNAL unb2b_board_front_io_serial_rx_arr : STD_LOGIC_VECTOR(c_nof_streams_qsfp-1 DOWNTO 0); - SIGNAL unb2b_board_ring_io_serial_tx_arr : STD_LOGIC_VECTOR(c_nof_streams_ring-1 DOWNTO 0) := (OTHERS=>'0'); SIGNAL unb2b_board_ring_io_serial_rx_arr : STD_LOGIC_VECTOR(c_nof_streams_ring-1 DOWNTO 0); @@ -221,6 +235,7 @@ ARCHITECTURE str OF top IS --SIGNAL unb2b_board_qsfp_leds_tx_src_in_arr : t_dp_siso_arr(c_nof_qsfp_bus*c_quad-1 DOWNTO 0) := (OTHERS => c_dp_siso_rst); SIGNAL unb2b_board_qsfp_leds_tx_src_in_arr : t_dp_siso_arr((c_nof_qsfp_bus+c_nof_qsfp_bus)*c_quad-1 DOWNTO 0) := (OTHERS => c_dp_siso_rst); + -- Reset SIGNAL i_reset_n : STD_LOGIC; SIGNAL i_kernel_rst : STD_LOGIC; @@ -258,24 +273,20 @@ ARCHITECTURE str OF top IS SIGNAL ta2_unb2b_40GbE_tx_serial_r : STD_LOGIC_VECTOR(4*c_nof_40GbE_IP -1 DOWNTO 0); SIGNAL ta2_unb2b_40GbE_rx_serial_r : STD_LOGIC_VECTOR(4*c_nof_40GbE_IP -1 DOWNTO 0); - SIGNAL board_kernel_stream_src_10GbE_data : std_logic_vector(71 downto 0); - SIGNAL board_kernel_stream_src_10GbE_valid : std_logic; - SIGNAL board_kernel_stream_src_10GbE_ready : std_logic; - SIGNAL board_kernel_stream_snk_10GbE_data : std_logic_vector(71 downto 0); - SIGNAL board_kernel_stream_snk_10GbE_valid : std_logic; - SIGNAL board_kernel_stream_snk_10GbE_ready : std_logic; - SIGNAL ta2_unb2b_10gbe_rx_status_rx_status : std_logic; -- rx_status - - SIGNAL board_kernel_stream_src_1GbE_data : std_logic_vector(39 downto 0); - SIGNAL board_kernel_stream_src_1GbE_valid : std_logic; - SIGNAL board_kernel_stream_src_1GbE_ready : std_logic; - SIGNAL board_kernel_stream_snk_1GbE_data : std_logic_vector(39 downto 0); - SIGNAL board_kernel_stream_snk_1GbE_valid : std_logic; - SIGNAL board_kernel_stream_snk_1GbE_ready : std_logic; - - SIGNAL board_kernel_stream_src_ADC_data : std_logic_vector(15 downto 0); - SIGNAL board_kernel_stream_src_ADC_valid : std_logic; - SIGNAL board_kernel_stream_src_ADC_ready : std_logic; + SIGNAL ta2_unb2b_10GbE_src_out_arr : t_dp_sosi_arr(c_nof_10GbE_IP-1 DOWNTO 0); + SIGNAL ta2_unb2b_10GbE_src_in_arr : t_dp_siso_arr(c_nof_10GbE_IP-1 DOWNTO 0); + SIGNAL ta2_unb2b_10GbE_snk_out_arr : t_dp_siso_arr(c_nof_10GbE_IP-1 DOWNTO 0); + SIGNAL ta2_unb2b_10GbE_snk_in_arr : t_dp_sosi_arr(c_nof_10GbE_IP-1 DOWNTO 0); + SIGNAL ta2_unb2b_10GbE_tx_serial_r : STD_LOGIC_VECTOR(c_nof_10GbE_IP -1 DOWNTO 0); + SIGNAL ta2_unb2b_10GbE_rx_serial_r : STD_LOGIC_VECTOR(c_nof_10GbE_IP -1 DOWNTO 0); + + SIGNAL ta2_unb2b_1GbE_src_out : t_dp_sosi; + SIGNAL ta2_unb2b_1GbE_src_in : t_dp_siso; + SIGNAL ta2_unb2b_1GbE_snk_out : t_dp_siso; + SIGNAL ta2_unb2b_1GbE_snk_in : t_dp_sosi; + + SIGNAL ta2_unb2b_ADC_src_out_arr : t_dp_sosi_arr(c_nof_ADC-1 DOWNTO 0); + SIGNAL ta2_unb2b_ADC_src_in_arr : t_dp_siso_arr(c_nof_ADC-1 DOWNTO 0); BEGIN ------------ @@ -309,7 +320,7 @@ BEGIN ------------------------ -- qsfp LEDs controller ------------------------ - unb2b_board_qsfp_leds_tx_src_in_arr(0).xon <= ta2_unb2b_10gbe_rx_status_rx_status; + unb2b_board_qsfp_leds_tx_src_in_arr(0).xon <= ta2_unb2b_10GbE_snk_out_arr(0).xon; unb2b_board_qsfp_leds_tx_src_in_arr(4).xon <= ta2_unb2b_40GbE_snk_out_arr(0).xon; -- ring LED indicator unb2b_board_qsfp_leds_tx_src_in_arr(8).xon <= ta2_unb2b_40GbE_snk_out_arr(1).xon; @@ -378,47 +389,51 @@ BEGIN g_nof_mac => c_nof_40GbE_IP ) PORT MAP ( - config_clk => mm_clk, - config_reset => mm_rst, + mm_clk => mm_clk, + mm_rst => mm_rst, - clk_ref_r => SA_CLK, + clk_ref_r => SA_CLK, - tx_serial_r => ta2_unb2b_40GbE_tx_serial_r, - rx_serial_r => ta2_unb2b_40GbE_rx_serial_r, + tx_serial_r => ta2_unb2b_40GbE_tx_serial_r, + rx_serial_r => ta2_unb2b_40GbE_rx_serial_r, - kernel_clk => board_kernel_clk_clk, - kernel_reset => i_kernel_rst, + kernel_clk => board_kernel_clk_clk, + kernel_reset => i_kernel_rst, - src_out_arr => ta2_unb2b_40GbE_src_out_arr, - src_in_arr => ta2_unb2b_40GbE_src_in_arr, - snk_out_arr => ta2_unb2b_40GbE_snk_out_arr, - snk_in_arr => ta2_unb2b_40GbE_snk_in_arr + src_out_arr => ta2_unb2b_40GbE_src_out_arr, + src_in_arr => ta2_unb2b_40GbE_src_in_arr, + snk_out_arr => ta2_unb2b_40GbE_snk_out_arr, + snk_in_arr => ta2_unb2b_40GbE_snk_in_arr ); ---------- -- 10GbE ---------- - u_ta2_unb2b_10GbE : ENTITY work.ta2_unb2b_10GbE - PORT MAP ( - config_reset => mm_rst, + -- Front QSFP 0 10GbE Interface, IP index = 0 + unb2b_board_front_io_serial_tx_arr(0) <= ta2_unb2b_10GbE_tx_serial_r(0); + ta2_unb2b_10GbE_rx_serial_r(0) <= unb2b_board_front_io_serial_rx_arr(0); - clk_ref_r => SA_CLK, - tx_serial_r => unb2b_board_front_io_serial_tx_arr(0), - rx_serial_r => unb2b_board_front_io_serial_rx_arr(0), - - kernel_clk => board_kernel_clk_clk, - kernel_reset => i_kernel_rst, + u_ta2_unb2b_10GbE : ENTITY work.ta2_unb2b_10GbE + GENERIC MAP ( + g_nof_mac => c_nof_10GbE_IP + ) + PORT MAP ( + mm_clk => '0', --mm_clk, + mm_rst => mm_rst, - kernel_src_data => board_kernel_stream_src_10GbE_data, - kernel_src_valid => board_kernel_stream_src_10GbE_valid, - kernel_src_ready => board_kernel_stream_src_10GbE_ready, + clk_ref_r => SA_CLK, + + tx_serial_r => ta2_unb2b_10GbE_tx_serial_r, + rx_serial_r => ta2_unb2b_10GbE_rx_serial_r, - kernel_snk_data => board_kernel_stream_snk_10GbE_data, - kernel_snk_valid => board_kernel_stream_snk_10GbE_valid, - kernel_snk_ready => board_kernel_stream_snk_10GbE_ready, + kernel_clk => board_kernel_clk_clk, + kernel_reset => i_kernel_rst, - rx_status => ta2_unb2b_10gbe_rx_status_rx_status + src_out_arr => ta2_unb2b_10GbE_src_out_arr, + src_in_arr => ta2_unb2b_10GbE_src_in_arr, + snk_out_arr => ta2_unb2b_10GbE_snk_out_arr, + snk_in_arr => ta2_unb2b_10GbE_snk_in_arr ); @@ -438,22 +453,22 @@ BEGIN kernel_clk => board_kernel_clk_clk, kernel_reset => i_kernel_rst, - kernel_src_data => board_kernel_stream_src_1GbE_data, - kernel_src_valid => board_kernel_stream_src_1GbE_valid, - kernel_src_ready => board_kernel_stream_src_1GbE_ready, - kernel_snk_data => board_kernel_stream_snk_1GbE_data, - kernel_snk_valid => board_kernel_stream_snk_1GbE_valid, - kernel_snk_ready => board_kernel_stream_snk_1GbE_ready - + src_out => ta2_unb2b_1GbE_src_out, + src_in => ta2_unb2b_1GbE_src_in, + snk_out => ta2_unb2b_1GbE_snk_out, + snk_in => ta2_unb2b_1GbE_snk_in ); ---------- -- ADC ---------- u_ta2_unb2b_jesd204b : ENTITY work.ta2_unb2b_jesd204b + GENERIC MAP( + g_nof_streams => c_nof_ADC + ) PORT MAP( - config_clk => mm_clk, - config_reset => mm_rst, + mm_clk => mm_clk, + mm_rst => mm_rst, jesd204b_mosi => reg_ta2_unb2b_jesd204b_mosi, jesd204b_miso => reg_ta2_unb2b_jesd204b_miso, @@ -467,11 +482,9 @@ BEGIN kernel_clk => board_kernel_clk_clk, kernel_reset => i_kernel_rst, - - kernel_src_data => board_kernel_stream_src_ADC_data, - kernel_src_valid => board_kernel_stream_src_ADC_valid, - kernel_src_ready => board_kernel_stream_src_ADC_ready - + + src_out_arr => ta2_unb2b_ADC_src_out_arr, + src_in_arr => ta2_unb2b_ADC_src_in_arr ); @@ -480,34 +493,34 @@ BEGIN ----------------------------------------------------------------------------- freeze_wrapper_inst : freeze_wrapper PORT MAP( - board_kernel_clk_clk => board_kernel_clk_clk, - board_kernel_clk2x_clk => board_kernel_clk2x_clk, - board_kernel_reset_reset_n => board_kernel_reset_reset_n_in, - board_kernel_irq_irq => board_kernel_irq_irq, - board_kernel_cra_waitrequest => board_kernel_cra_waitrequest, - board_kernel_cra_readdata => board_kernel_cra_readdata, - board_kernel_cra_readdatavalid => board_kernel_cra_readdatavalid, - board_kernel_cra_burstcount => board_kernel_cra_burstcount, - board_kernel_cra_writedata => board_kernel_cra_writedata, - board_kernel_cra_address => board_kernel_cra_address, - board_kernel_cra_write => board_kernel_cra_write, - board_kernel_cra_read => board_kernel_cra_read, - board_kernel_cra_byteenable => board_kernel_cra_byteenable, - board_kernel_cra_debugaccess => board_kernel_cra_debugaccess, - board_kernel_register_mem_address => board_kernel_register_mem_address, - board_kernel_register_mem_clken => board_kernel_register_mem_clken, - board_kernel_register_mem_chipselect => board_kernel_register_mem_chipselect, - board_kernel_register_mem_write => board_kernel_register_mem_write, - board_kernel_register_mem_readdata => board_kernel_register_mem_readdata, - board_kernel_register_mem_writedata => board_kernel_register_mem_writedata, - board_kernel_register_mem_byteenable => board_kernel_register_mem_byteenable, - - board_kernel_stream_src_40GbE_data => ta2_unb2b_40GbE_src_out_arr(0).data(263 DOWNTO 0), - board_kernel_stream_src_40GbE_valid => ta2_unb2b_40GbE_src_out_arr(0).valid, - board_kernel_stream_src_40GbE_ready => ta2_unb2b_40GbE_src_in_arr(0).ready, - board_kernel_stream_snk_40GbE_data => ta2_unb2b_40GbE_snk_in_arr(0).data(263 DOWNTO 0), - board_kernel_stream_snk_40GbE_valid => ta2_unb2b_40GbE_snk_in_arr(0).valid, - board_kernel_stream_snk_40GbE_ready => ta2_unb2b_40GbE_snk_out_arr(0).ready, + board_kernel_clk_clk => board_kernel_clk_clk, + board_kernel_clk2x_clk => board_kernel_clk2x_clk, + board_kernel_reset_reset_n => board_kernel_reset_reset_n_in, + board_kernel_irq_irq => board_kernel_irq_irq, + board_kernel_cra_waitrequest => board_kernel_cra_waitrequest, + board_kernel_cra_readdata => board_kernel_cra_readdata, + board_kernel_cra_readdatavalid => board_kernel_cra_readdatavalid, + board_kernel_cra_burstcount => board_kernel_cra_burstcount, + board_kernel_cra_writedata => board_kernel_cra_writedata, + board_kernel_cra_address => board_kernel_cra_address, + board_kernel_cra_write => board_kernel_cra_write, + board_kernel_cra_read => board_kernel_cra_read, + board_kernel_cra_byteenable => board_kernel_cra_byteenable, + board_kernel_cra_debugaccess => board_kernel_cra_debugaccess, + board_kernel_register_mem_address => board_kernel_register_mem_address, + board_kernel_register_mem_clken => board_kernel_register_mem_clken, + board_kernel_register_mem_chipselect => board_kernel_register_mem_chipselect, + board_kernel_register_mem_write => board_kernel_register_mem_write, + board_kernel_register_mem_readdata => board_kernel_register_mem_readdata, + board_kernel_register_mem_writedata => board_kernel_register_mem_writedata, + board_kernel_register_mem_byteenable => board_kernel_register_mem_byteenable, + + board_kernel_stream_src_40GbE_data => ta2_unb2b_40GbE_src_out_arr(0).data(263 DOWNTO 0), + board_kernel_stream_src_40GbE_valid => ta2_unb2b_40GbE_src_out_arr(0).valid, + board_kernel_stream_src_40GbE_ready => ta2_unb2b_40GbE_src_in_arr(0).ready, + board_kernel_stream_snk_40GbE_data => ta2_unb2b_40GbE_snk_in_arr(0).data(263 DOWNTO 0), + board_kernel_stream_snk_40GbE_valid => ta2_unb2b_40GbE_snk_in_arr(0).valid, + board_kernel_stream_snk_40GbE_ready => ta2_unb2b_40GbE_snk_out_arr(0).ready, board_kernel_stream_src_40GbE_ring_0_data => ta2_unb2b_40GbE_src_out_arr(1).data(263 DOWNTO 0), board_kernel_stream_src_40GbE_ring_0_valid => ta2_unb2b_40GbE_src_out_arr(1).valid, @@ -523,23 +536,23 @@ BEGIN board_kernel_stream_snk_40GbE_ring_1_valid => ta2_unb2b_40GbE_snk_in_arr(2).valid, board_kernel_stream_snk_40GbE_ring_1_ready => ta2_unb2b_40GbE_snk_out_arr(2).ready, - board_kernel_stream_src_10GbE_data => board_kernel_stream_src_10GbE_data, - board_kernel_stream_src_10GbE_valid => board_kernel_stream_src_10GbE_valid, - board_kernel_stream_src_10GbE_ready => board_kernel_stream_src_10GbE_ready, - board_kernel_stream_snk_10GbE_data => board_kernel_stream_snk_10GbE_data, - board_kernel_stream_snk_10GbE_valid => board_kernel_stream_snk_10GbE_valid, - board_kernel_stream_snk_10GbE_ready => board_kernel_stream_snk_10GbE_ready, - - board_kernel_stream_src_1GbE_data => board_kernel_stream_src_1GbE_data, - board_kernel_stream_src_1GbE_valid => board_kernel_stream_src_1GbE_valid, - board_kernel_stream_src_1GbE_ready => board_kernel_stream_src_1GbE_ready, - board_kernel_stream_snk_1GbE_data => board_kernel_stream_snk_1GbE_data, - board_kernel_stream_snk_1GbE_valid => board_kernel_stream_snk_1GbE_valid, - board_kernel_stream_snk_1GbE_ready => board_kernel_stream_snk_1GbE_ready, - - board_kernel_stream_src_ADC_data => board_kernel_stream_src_ADC_data, - board_kernel_stream_src_ADC_valid => board_kernel_stream_src_ADC_valid, - board_kernel_stream_src_ADC_ready => board_kernel_stream_src_ADC_ready + board_kernel_stream_src_10GbE_data => ta2_unb2b_10GbE_src_out_arr(0).data(71 DOWNTO 0), + board_kernel_stream_src_10GbE_valid => ta2_unb2b_10GbE_src_out_arr(0).valid, + board_kernel_stream_src_10GbE_ready => ta2_unb2b_10GbE_src_in_arr(0).ready, + board_kernel_stream_snk_10GbE_data => ta2_unb2b_10GbE_snk_in_arr(0).data(71 DOWNTO 0), + board_kernel_stream_snk_10GbE_valid => ta2_unb2b_10GbE_snk_in_arr(0).valid, + board_kernel_stream_snk_10GbE_ready => ta2_unb2b_10GbE_snk_out_arr(0).ready, + + board_kernel_stream_src_1GbE_data => ta2_unb2b_1GbE_src_out.data(39 DOWNTO 0), + board_kernel_stream_src_1GbE_valid => ta2_unb2b_1GbE_src_out.valid, + board_kernel_stream_src_1GbE_ready => ta2_unb2b_1GbE_src_in.ready, + board_kernel_stream_snk_1GbE_data => ta2_unb2b_1GbE_snk_in.data(39 DOWNTO 0), + board_kernel_stream_snk_1GbE_valid => ta2_unb2b_1GbE_snk_in.valid, + board_kernel_stream_snk_1GbE_ready => ta2_unb2b_1GbE_snk_out.ready, + + board_kernel_stream_src_ADC_data => ta2_unb2b_ADC_src_out_arr(0).data(15 DOWNTO 0), + board_kernel_stream_src_ADC_valid => ta2_unb2b_ADC_src_out_arr(0).valid, + board_kernel_stream_src_ADC_ready => ta2_unb2b_ADC_src_in_arr(0).ready ); @@ -558,7 +571,6 @@ BEGIN out_rst => board_kernel_reset_reset_n_in ); - ----------------------------------------------------------------------------- -- General control function ----------------------------------------------------------------------------- -- GitLab