diff --git a/libraries/technology/transceiver/tech_transceiver_arria10_48.vhd b/libraries/technology/transceiver/tech_transceiver_arria10_48.vhd index 6feb428eb49769516dacc0dfe193415347543af8..6ed4536f9b8a963c6b7ea5205e4c16b88424e85d 100644 --- a/libraries/technology/transceiver/tech_transceiver_arria10_48.vhd +++ b/libraries/technology/transceiver/tech_transceiver_arria10_48.vhd @@ -34,6 +34,8 @@ entity tech_transceiver_arria10_48 is clk : in std_logic; reset_p : in std_logic; refclk : in std_logic; + clk_156_arr : out std_logic_vector(g_nof_channels-1 downto 0); + clk_312_arr : out std_logic_vector(g_nof_channels-1 downto 0); tx_serial_data : out std_logic_vector(g_nof_channels-1 downto 0); rx_serial_data : in std_logic_vector(g_nof_channels-1 downto 0); tx_parallel_data : in std_logic_vector(64*g_nof_channels-1 downto 0); @@ -63,6 +65,10 @@ architecture str of tech_transceiver_arria10_48 is rx_coreclkin : in std_logic_vector(47 downto 0) := (others => 'X'); -- clk tx_clkout : out std_logic_vector(47 downto 0); -- clk rx_clkout : out std_logic_vector(47 downto 0); -- clk + tx_pma_clkout : out std_logic_vector(47 downto 0); -- clk + tx_pma_div_clkout : out std_logic_vector(47 downto 0); -- clk + rx_pma_clkout : out std_logic_vector(47 downto 0); -- clk + rx_pma_div_clkout : out std_logic_vector(47 downto 0); -- clk tx_enh_data_valid : in std_logic_vector(47 downto 0) := (others => 'X'); -- tx_enh_data_valid rx_enh_data_valid : out std_logic_vector(47 downto 0); -- rx_enh_data_valid rx_enh_blk_lock : out std_logic_vector(47 downto 0); -- rx_enh_blk_lock @@ -108,9 +114,21 @@ architecture str of tech_transceiver_arria10_48 is ); end component transceiver_pll; + component pll_xgmii_mac_clocks is + port ( + pll_refclk0 : in std_logic := 'X'; -- clk + pll_powerdown : in std_logic := 'X'; -- pll_powerdown + pll_locked : out std_logic; -- pll_locked + outclk0 : out std_logic; -- clk + pll_cal_busy : out std_logic; -- pll_cal_busy + outclk1 : out std_logic -- clk + ); + end component pll_xgmii_mac_clocks; + -- signals for the transceivers signal tx_data_valid : std_logic_vector(g_nof_channels-1 downto 0) := (others => '1'); - signal tx_serdesclk : std_logic_vector(g_nof_channels-1 downto 0); + signal tx_clk : std_logic_vector(g_nof_channels-1 downto 0); + signal rx_clk : std_logic_vector(g_nof_channels-1 downto 0); signal tx_analogreset : std_logic_vector(g_nof_channels-1 downto 0); signal tx_digitalreset : std_logic_vector(g_nof_channels-1 downto 0); signal rx_analogreset : std_logic_vector(g_nof_channels-1 downto 0); @@ -125,9 +143,18 @@ architecture str of tech_transceiver_arria10_48 is signal tx_serial_clk : std_logic_vector(g_nof_channels-1 downto 0); signal mcgb_serial_clk : std_logic; + signal tx_pma_clkout : std_logic_vector(g_nof_channels-1 downto 0); + signal tx_pma_div_clkout : std_logic_vector(g_nof_channels-1 downto 0); + signal rx_pma_clkout : std_logic_vector(g_nof_channels-1 downto 0); + signal rx_pma_div_clkout : std_logic_vector(g_nof_channels-1 downto 0); + signal clk_156_internal : std_logic_vector(g_nof_channels-1 downto 0); + signal clk_312_internal : std_logic_vector(g_nof_channels-1 downto 0); + signal clk_156 : std_logic; + signal clk_312 : std_logic; begin + transceiver_phy : transceiver_phy_48 port map ( tx_analogreset => tx_analogreset, @@ -141,10 +168,14 @@ begin rx_cdr_refclk0 => refclk, tx_serial_data => tx_serial_data, rx_serial_data => rx_serial_data, - tx_coreclkin => tx_serdesclk, -- write side clock for tx fifo - rx_coreclkin => tx_serdesclk, - tx_clkout => tx_serdesclk, - rx_clkout => open, + tx_coreclkin => clk_156_internal, -- write side clock for tx fifo + rx_coreclkin => clk_156_internal, + tx_clkout => tx_clk, + rx_clkout => rx_clk, + tx_pma_clkout => tx_pma_clkout, + tx_pma_div_clkout => tx_pma_div_clkout, + rx_pma_clkout => rx_pma_clkout, + rx_pma_div_clkout => rx_pma_div_clkout, tx_enh_data_valid => tx_data_valid, rx_enh_data_valid => open, rx_enh_blk_lock => open, @@ -190,4 +221,20 @@ begin tx_serial_clk <= (others => mcgb_serial_clk); txpll_cal_busy <= tx_cal_busy when pll_cal_busy = '0' else (others => '1'); + u_pll_xgmii_mac_clocks : component pll_xgmii_mac_clocks + port map ( + pll_refclk0 => refclk, -- pll_refclk0.clk + pll_powerdown => reset_p, -- pll_powerdown.pll_powerdown + pll_locked => open, -- pll_locked.pll_locked + outclk0 => clk_156, -- outclk0.clk + pll_cal_busy => open, -- pll_cal_busy.pll_cal_busy + outclk1 => clk_312 -- outclk1.clk + ); + + clk_156_internal <= (others => clk_156); + clk_312_internal <= (others => clk_312); + clk_156_arr <= clk_156_internal; + clk_312_arr <= clk_312_internal; + + end;