diff --git a/libraries/technology/10gbase_r/hdllib.cfg b/libraries/technology/10gbase_r/hdllib.cfg index b3b2306413b6652255d06b9cfb92a12b78115698..b98c64e0f13512fafefb82de46b1bee050aee073 100644 --- a/libraries/technology/10gbase_r/hdllib.cfg +++ b/libraries/technology/10gbase_r/hdllib.cfg @@ -1,12 +1,19 @@ hdl_lib_name = tech_10gbase_r hdl_library_clause_name = tech_10gbase_r_lib -hdl_lib_uses = technology tech_pll ip_arria10_phy_10gbase_r ip_arria10_transceiver_pll_10g ip_arria10_transceiver_reset_controller_1 common +hdl_lib_uses = technology + tech_pll + ip_arria10_phy_10gbase_r + ip_arria10_transceiver_pll_10g + ip_arria10_transceiver_reset_controller_1 + tech_transceiver + common hdl_lib_technology = build_dir_sim = $HDL_BUILD_DIR build_dir_synth = $HDL_BUILD_DIR synth_files = + sim_10gbase_r.vhd tech_10gbase_r_component_pkg.vhd tech_10gbase_r_arria10.vhd tech_10gbase_r.vhd diff --git a/libraries/technology/10gbase_r/sim_10gbase_r.vhd b/libraries/technology/10gbase_r/sim_10gbase_r.vhd new file mode 100644 index 0000000000000000000000000000000000000000..6c6831aaab690102056faf38621db7f9d6cffcbe --- /dev/null +++ b/libraries/technology/10gbase_r/sim_10gbase_r.vhd @@ -0,0 +1,143 @@ +-------------------------------------------------------------------------------- +-- +-- 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/>. +-- +-------------------------------------------------------------------------------- + +-- Purpose : Fast simulation model for 10G XGMII over 1 lane +-- Description : +-- Remark: +-- . The sim_10gbase_r has the same entity ports and generics as tech_10gbase_r +-- so that it can directly be mapped in tech_10gbase_r. +-- . The model uses 10/8 overhead to transport the control signalling. Therefore +-- the line rate becomes 12.5 Gbps instead of 10.3125 M for the technology. + +LIBRARY IEEE, common_lib, tech_transceiver_lib; +USE IEEE.STD_LOGIC_1164.ALL; +USE common_lib.common_pkg.ALL; +USE common_lib.common_interface_layers_pkg.ALL; + +ENTITY sim_10gbase_r IS + GENERIC ( + g_sim : BOOLEAN := FALSE; + g_nof_channels : NATURAL := 1 + ); + PORT ( + -- Transceiver ATX PLL reference clock + tr_ref_clk_644 : IN STD_LOGIC; -- 644.531250 MHz + + -- XGMII clocks + clk_156 : IN STD_LOGIC; -- 156.25 MHz + rst_156 : IN STD_LOGIC; + + -- XGMII interface + xgmii_tx_ready_arr : OUT STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0); -- can be used for xon flow control + xgmii_rx_ready_arr : OUT STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0); -- typically leave not connected + xgmii_tx_dc_arr : IN t_xgmii_dc_arr(g_nof_channels-1 DOWNTO 0); -- 72 bit + xgmii_rx_dc_arr : OUT t_xgmii_dc_arr(g_nof_channels-1 DOWNTO 0); -- 72 bit + + -- PHY serial IO + tx_serial_arr : OUT STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0); + rx_serial_arr : IN STD_LOGIC_VECTOR(g_nof_channels-1 DOWNTO 0) + ); +END sim_10gbase_r; + + +ARCHITECTURE str OF sim_10gbase_r IS + + CONSTANT c_serdes_data_w : NATURAL := c_xgmii_data_w; -- 64 b + CONSTANT c_serdes_ctrl_w : NATURAL := c_xgmii_ctrl_w; -- 8 b + CONSTANT c_serdes_line_rate : NATURAL := 12500; -- Mbps = 156.25 MHz * 10/8 (encoding) * 64b (data width) + + -- XGMII control bits (one for each XGMII lane): + SIGNAL xgmii_tx_c_arr : t_xgmii_c_arr(g_nof_channels-1 DOWNTO 0); + SIGNAL xgmii_rx_c_arr : t_xgmii_c_arr(g_nof_channels-1 DOWNTO 0); + + -- XGMII data + SIGNAL xgmii_tx_d_arr : t_xgmii_d_arr(g_nof_channels-1 DOWNTO 0); + SIGNAL xgmii_rx_d_arr : t_xgmii_d_arr(g_nof_channels-1 DOWNTO 0); + +BEGIN + + gen_nof_10gbase_r : FOR i IN g_nof_channels-1 DOWNTO 0 GENERATE + + -- Rewire XGMII + xgmii_tx_d_arr(i) <= func_xgmii_d(xgmii_tx_dc_arr(i)); + xgmii_tx_c_arr(i) <= func_xgmii_c(xgmii_tx_dc_arr(i)); + + xgmii_rx_dc_arr(i) <= func_xgmii_dc(xgmii_rx_d_arr(i), xgmii_rx_c_arr(i)); + + -- Model tx_ready + u_areset_tx_rdy : ENTITY common_lib.common_areset + GENERIC MAP( + g_rst_level => '0', + g_delay_len => 40 + ) + PORT MAP( + clk => clk_156, + in_rst => '0', + out_rst => xgmii_tx_ready_arr(i) + ); + + -- Model rx_ready + u_areset_rx_rdy : ENTITY common_lib.common_areset + GENERIC MAP( + g_rst_level => '0', + g_delay_len => 80 + ) + PORT MAP( + clk => clk_156, + in_rst => '0', + out_rst => xgmii_rx_ready_arr(i) + ); + + u_ser: ENTITY tech_transceiver_lib.sim_transceiver_serializer + GENERIC MAP ( + g_data_w => c_serdes_data_w, + g_line_rate => c_serdes_line_rate + ) + PORT MAP ( + tr_clk => clk_156, + tr_rst => rst_156, + + tx_in_data => xgmii_tx_d_arr(i), + tx_in_ctrl => xgmii_tx_c_arr(i), + + tx_out => tx_serial_arr(i) + ); + + u_des: ENTITY tech_transceiver_lib.sim_transceiver_deserializer + GENERIC MAP ( + g_data_w => c_serdes_data_w, + g_line_rate => c_serdes_line_rate + ) + PORT MAP ( + tr_clk => clk_156, + tr_rst => rst_156, + + rx_out_data => xgmii_rx_d_arr(i), + rx_out_ctrl => xgmii_rx_c_arr(i), + + rx_in => rx_serial_arr(i) + ); + + END GENERATE; + +END str; +