--==============================================================================
-- © Copyright CERN for the benefit of the HPTD interest group 2019. All rights not
-- expressly granted are reserved.
--
-- This file is part of TClink.
--
-- TClink is free VHDL code: 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.
--
-- TClink 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 TClink. If not, see .
--==============================================================================
--! @file mgt_user_clock.vhd
--==============================================================================
--! Standard library
library ieee;
--! Standard packages
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
--! Specific packages
library UNISIM;
use UNISIM.vcomponents.all;
-------------------------------------------------------------------------------
-- --
-- CERN, EP-ESE-BE, HPTD
-- --
-------------------------------------------------------------------------------
--
-- unit name: Example design for MGT clocking scheme (mgt_user_clock)
--
--! @brief MGT clock for TCLink
--! - This is an example design created for a symmetric 10.24Gbps transceiver for GTY Ultrascale+ to be used for a TClink implementation
--! - This transceiver can be used to implement lpGBT-like links if working in a bit-folding downlink (x4) and 10.24Gbps uplink
--! - This implementation uses two PLLs: one for Tx and one for Rx. This is the typical case for a bidirectional link where the downlink is receiving timing and the uplink has to use the recovered clock for transmission
--!
--! @author Eduardo Brandao de Souza Mendes - eduardo.brandao.de.souza.mendes@cern.ch
--! @date 18\10\2019
--! @version 1.0
--! @details
--!
--! Dependencies:\n
--!
--!
--! References:\n
--! \n
--!
--!
--! Modified by:\n
--! Author: Eduardo Brandao de Souza Mendes
-------------------------------------------------------------------------------
--! \n\nLast changes:\n
--! 18\10\2019 - EBSM - Created\n
--!
-------------------------------------------------------------------------------
--! @todo - \n
--! \n
--
-------------------------------------------------------------------------------
--==============================================================================
--! Entity declaration for mgt_user_clock
--==============================================================================
entity mgt_user_clock is
generic(
g_NUMBER_CHANNELS : integer := 1 --1,2,3,4
);
port (
-- User clocks
txusrclk_o : out std_logic_vector(g_NUMBER_CHANNELS-1 downto 0);
rxusrclk_o : out std_logic_vector(g_NUMBER_CHANNELS-1 downto 0);
--! User clock network
mgt_txoutclk_i : in std_logic_vector(g_NUMBER_CHANNELS-1 downto 0); --! Only channel 0 used, shared Tx clock
mgt_rxoutclk_i : in std_logic_vector(g_NUMBER_CHANNELS-1 downto 0)
);
end mgt_user_clock;
--==============================================================================
-- architecture declaration
--==============================================================================
architecture rtl of mgt_user_clock is
--! Function declaration
--! Constant declaration
--! Signal declaration
------------------------- Auxiliar MGT interface ------------------------------
signal txusrclk : std_logic_vector(g_NUMBER_CHANNELS-1 downto 0);
signal rxusrclk : std_logic_vector(g_NUMBER_CHANNELS-1 downto 0);
--! Component declaration
begin
--============================================================================
--! User clock network
--============================================================================
--! ------------ Transmitter network ------------
-- cmp_tx_bufg_gt : Transmitter user clock buffer (low-skew buffer resource contained within transceiver region)
cmp_tx_bufg_gt : BUFG_GT
port map(
O => txusrclk(0), -- 1-bit output: Buffer
CE => '1', -- 1-bit input: Buffer enable
CEMASK => '0', -- 1-bit input: CE Mask
CLR => '0', -- 1-bit input: Asynchronous clear
CLRMASK => '0', -- 1-bit input: CLR Mask
DIV => "000", -- 3-bit input: Dymanic divide Value - 000=div by 1
I => mgt_txoutclk_i(0) -- 1-bit input: Buffer
);
txusrclk_o <= (others => txusrclk(0));
--! ------------ Receiver network ------------
gen_channel_rxusrclk : for i in g_NUMBER_CHANNELS-1 downto 0 generate
-- cmp_rx_bufg_gt : Receiver user clock buffer (low-skew buffer resource contained within transceiver region)
cmp_rx_bufg_gt : BUFG_GT
port map(
O => rxusrclk(i), -- 1-bit output: Buffer
CE => '1', -- 1-bit input: Buffer enable
CEMASK => '0', -- 1-bit input: CE Mask
CLR => '0', -- 1-bit input: Asynchronous clear
CLRMASK => '0', -- 1-bit input: CLR Mask
DIV => "000", -- 3-bit input: Dymanic divide Value - 000=div by 1
I => mgt_rxoutclk_i(i) -- 1-bit input: Buffer
);
end generate gen_channel_rxusrclk;
rxusrclk_o <= rxusrclk;
end architecture rtl;
--==============================================================================
-- architecture end
--==============================================================================