SURF  1.0
Pgp2bGth7FixedLatWrapper.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : Pgp2bGth7FixedLatWrapper.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2015-04-01
5 -- Last update: 2016-08-24
6 -------------------------------------------------------------------------------
7 -- Description: Gth7 Fixed Latency Wrapper
8 -------------------------------------------------------------------------------
9 -- This file is part of 'SLAC Firmware Standard Library'.
10 -- It is subject to the license terms in the LICENSE.txt file found in the
11 -- top-level directory of this distribution and at:
12 -- https://confluence.slac.stanford.edu/display/ppareg/LICENSE.html.
13 -- No part of 'SLAC Firmware Standard Library', including this file,
14 -- may be copied, modified, propagated, or distributed except according to
15 -- the terms contained in the LICENSE.txt file.
16 -------------------------------------------------------------------------------
17 
18 library ieee;
19 use ieee.std_logic_1164.all;
20 use ieee.numeric_std.all;
21 
22 use work.StdRtlPkg.all;
23 use work.AxiStreamPkg.all;
24 use work.Pgp2bPkg.all;
25 use work.AxiLitePkg.all;
26 
27 library unisim;
28 use unisim.vcomponents.all;
29 
30 --! @see entity
31  --! @ingroup protocols_pgp_pgp2b_gth7
33  generic (
34  -- Select Master or Slave
35  MASTER_SEL_G : boolean := true;
36  RX_CLK_SEL_G : boolean := true;
37  -- PGP Settings
38  VC_INTERLEAVE_G : integer := 0; -- No interleave Frames
39  PAYLOAD_CNT_TOP_G : integer := 7; -- Top bit for payload counter
40  NUM_VC_EN_G : integer range 1 to 4 := 4;
42  TX_ENABLE_G : boolean := true; -- Enable TX direction
43  RX_ENABLE_G : boolean := true; -- Enable RX direction
44  -- QPLL Configurations
45  QPLL_FBDIV_G : bit_vector := "0100100000";
46  QPLL_FBDIV_RATIO_G : bit := '1';
47  QPLL_REFCLK_DIV_G : integer := 1;
48  -- CPLL Configurations
49  CPLL_FBDIV_G : integer range 1 to 5 := 4;
50  CPLL_FBDIV_45_G : integer range 4 to 5 := 5;
51  CPLL_REFCLK_DIV_G : integer range 1 to 2 := 1;
52  -- MMCM Configurations
53  MMCM_CLKIN_PERIOD_G : real := 8.000;
54  MMCM_CLKFBOUT_MULT_G : real := 8.000;
55  MMCM_GTCLK_DIVIDE_G : real := 8.000;
56  MMCM_TXCLK_DIVIDE_G : natural := 8;
57  -- MGT Configurations
58  RXOUT_DIV_G : integer := 2;
59  TXOUT_DIV_G : integer := 4;
60  RX_CLK25_DIV_G : integer := 5; -- Set by wizard
61  TX_CLK25_DIV_G : integer := 5; -- Set by wizard
62  RX_OS_CFG_G : bit_vector := "0000010000000"; -- Set by wizard
63  RXCDR_CFG_G : bit_vector := x"0002007FE1000C2200018"; -- Set by wizard
64  RXDFEXYDEN_G : sl := '0'; -- Set by wizard
65  TX_PLL_G : string := "QPLL";
66  RX_PLL_G : string := "CPLL");
67  port (
68  -- Manual Reset
69  extRst : in sl;
70  -- Status and Clock Signals
71  txPllLock : out sl;
72  rxPllLock : out sl;
73  txClk : out sl;
74  rxClk : out sl;
75  stableClk : out sl;
76  -- Non VC Rx Signals
79  -- Non VC Tx Signals
82  -- Frame Transmit Interface - 1 Lane, Array of 4 VCs
84  pgpTxSlaves : out AxiStreamSlaveArray(3 downto 0);
85  -- Frame Receive Interface - 1 Lane, Array of 4 VCs
88  pgpRxCtrl : in AxiStreamCtrlArray(3 downto 0);
89  -- GT Pins
90  gtClkP : in sl;
91  gtClkN : in sl;
92  gtTxP : out sl;
93  gtTxN : out sl;
94  gtRxP : in sl;
95  gtRxN : in sl;
96  -- Debug Interface
97  txPreCursor : in slv(4 downto 0) := (others => '0');
98  txPostCursor : in slv(4 downto 0) := (others => '0');
99  txDiffCtrl : in slv(3 downto 0) := "1000";
100  -- AXI-Lite Interface
101  axilClk : in sl := '0';
102  axilRst : in sl := '0';
107 end Pgp2bGth7FixedLatWrapper;
108 
109 architecture rtl of Pgp2bGth7FixedLatWrapper is
110 
111  signal gtClk,
112  gtClkDiv2,
113  stableClock,
114  stableRst,
115  locked,
116  clkIn1,
117  clkOut0,
118  clkOut1,
119  clkFbIn,
120  clkFbOut,
121  txClock,
122  txRst,
123  rxClock,
124  rxRecClk,
125  pllRefClk,
126  gtCPllRefClk,
127  gtCPllLock,
128  qPllOutClk,
129  qPllOutRefClk,
130  qPllLock,
131  pllLockDetClk,
132  qPllRefClkLost,
133  qPllReset,
134  gtQPllReset : sl := '0';
135 
136  attribute KEEP_HIERARCHY : string;
137  attribute KEEP_HIERARCHY of
138  PwrUpRst_Inst,
139  QPllCore_1,
140  Pgp2bGth7Fixedlat_Inst : label is "TRUE";
141 
142 begin
143 
144  -- Set the status outputs
145  txPllLock <= ite((TX_PLL_G = "QPLL"), qPllLock, gtCPllLock);
146  rxPllLock <= ite((RX_PLL_G = "QPLL"), qPllLock, gtCPllLock);
147  txClk <= txClock;
148  rxClk <= rxClock;
149  stableClk <= stableClock;
150 
151  -- GT Reference Clock
152  IBUFDS_GTE2_Inst : IBUFDS_GTE2
153  port map (
154  I => gtClkP,
155  IB => gtClkN,
156  CEB => '0',
157  ODIV2 => gtClkDiv2,
158  O => open);
159 
160  BUFG_G : BUFG
161  port map (
162  I => gtClkDiv2,
163  O => stableClock);
164 
165  -- Power Up Reset
166  PwrUpRst_Inst : entity work.PwrUpRst
167  port map (
168  arst => extRst,
169  clk => stableClock,
170  rstOut => stableRst);
171 
172  clkIn1 <= ite(MASTER_SEL_G, stableClock, rxClock);
173 
174  mmcm_adv_inst : MMCME2_ADV
175  generic map(
176  BANDWIDTH => "LOW",
177  CLKOUT4_CASCADE => false,
178  COMPENSATION => "ZHOLD",
179  STARTUP_WAIT => false,
180  DIVCLK_DIVIDE => 1,
181  CLKFBOUT_MULT_F => MMCM_CLKFBOUT_MULT_G,
182  CLKFBOUT_PHASE => 0.000,
183  CLKFBOUT_USE_FINE_PS => false,
184  CLKOUT0_DIVIDE_F => MMCM_GTCLK_DIVIDE_G,
185  CLKOUT0_PHASE => 0.000,
186  CLKOUT0_DUTY_CYCLE => 0.500,
187  CLKOUT0_USE_FINE_PS => false,
188  CLKOUT1_DIVIDE => MMCM_TXCLK_DIVIDE_G,
189  CLKOUT1_PHASE => 0.000,
190  CLKOUT1_DUTY_CYCLE => 0.500,
191  CLKOUT1_USE_FINE_PS => false,
192  CLKIN1_PERIOD => MMCM_CLKIN_PERIOD_G,
193  REF_JITTER1 => 0.006)
194  port map(
195  -- Output clocks
196  CLKFBOUT => clkFbOut,
197  CLKFBOUTB => open,
198  CLKOUT0 => clkOut0,
199  CLKOUT0B => open,
200  CLKOUT1 => clkOut1,
201  CLKOUT1B => open,
202  CLKOUT2 => open,
203  CLKOUT2B => open,
204  CLKOUT3 => open,
205  CLKOUT3B => open,
206  CLKOUT4 => open,
207  CLKOUT5 => open,
208  CLKOUT6 => open,
209  -- Input clock control
210  CLKFBIN => clkFbIn,
211  CLKIN1 => clkIn1,
212  CLKIN2 => '0',
213  -- Tied to always select the primary input clock
214  CLKINSEL => '1',
215  -- Ports for dynamic reconfiguration
216  DADDR => (others => '0'),
217  DCLK => '0',
218  DEN => '0',
219  DI => (others => '0'),
220  DO => open,
221  DRDY => open,
222  DWE => '0',
223  -- Ports for dynamic phase shift
224  PSCLK => '0',
225  PSEN => '0',
226  PSINCDEC => '0',
227  PSDONE => open,
228  -- Other control and status signals
229  LOCKED => locked,
230  CLKINSTOPPED => open,
231  CLKFBSTOPPED => open,
232  PWRDWN => '0',
233  RST => stableRst);
234 
235  BUFH_1 : BUFH
236  port map (
237  I => clkFbOut,
238  O => clkFbIn);
239 
240  BUFG_2 : BUFG
241  port map (
242  I => clkOut0,
243  O => gtClk);
244 
245  BUFG_3 : BUFG
246  port map (
247  I => clkOut1,
248  O => txClock);
249 
250  txRst <= stableRst;
251 
252  gtCPllRefClk <= gtClk when((MASTER_SEL_G = true) or (TX_PLL_G = "CPLL")) else stableClock;
253  pllRefClk <= gtClk when((MASTER_SEL_G = true) or (TX_PLL_G = "QPLL")) else stableClock;
254  pllLockDetClk <= stableClock;
255  qPllReset <= stableRst or gtQPllReset;
256  rxClock <= rxRecClk when(RX_CLK_SEL_G = true) else txClock;
257 
258  QPllCore_1 : entity work.Gth7QuadPll
259  generic map (
260  QPLL_REFCLK_SEL_G => "111",
264  port map (
265  qPllRefClk => pllRefClk,
266  qPllOutClk => qPllOutClk,
267  qPllOutRefClk => qPllOutRefClk,
268  qPllLock => qPllLock,
269  qPllLockDetClk => pllLockDetClk,
270  qPllRefClkLost => qPllRefClkLost,
271  qPllReset => qPllReset);
272 
273  Pgp2bGth7Fixedlat_Inst : entity work.Pgp2bGth7Fixedlat
274  generic map (
281  STABLE_CLOCK_PERIOD_G => 4.0E-9, --set for longest timeout
282  -- CPLL Settings -
283  CPLL_REFCLK_SEL_G => "111",
287  -- CDR Settings -
295  -- Configure PLL sources
296  TX_PLL_G => TX_PLL_G,
297  RX_PLL_G => RX_PLL_G)
298  port map (
299  -- GT Clocking
300  stableClk => stableClock,
301  gtCPllRefClk => gtCPllRefClk,
302  gtCPllLock => gtCPllLock,
303  gtQPllRefClk => qPllOutRefClk,
304  gtQPllClk => qPllOutClk,
305  gtQPllLock => qPllLock,
306  gtQPllRefClkLost => qPllRefClkLost,
307  gtQPllReset => gtQPllReset,
308  gtRxRefClkBufg => stableClock,
309  -- Gt Serial IO
310  gtTxP => gtTxP,
311  gtTxN => gtTxN,
312  gtRxP => gtRxP,
313  gtRxN => gtRxN,
314  -- Tx Clocking
315  pgpTxReset => txRst,
316  pgpTxClk => txClock,
317  -- Rx clocking
318  pgpRxReset => extRst,
319  pgpRxRecClk => rxRecClk,
320  pgpRxClk => rxClock,
321  pgpRxMmcmReset => open,
322  pgpRxMmcmLocked => locked,
323  -- Non VC Rx Signals
324  pgpRxIn => pgpRxIn,
325  pgpRxOut => pgpRxOut,
326  -- Non VC Tx Signals
327  pgpTxIn => pgpTxIn,
328  pgpTxOut => pgpTxOut,
329  -- Frame Transmit Interface - 1 Lane, Array of 4 VCs
332  -- Frame Receive Interface - 1 Lane, Array of 4 VCs
335  pgpRxCtrl => pgpRxCtrl,
336  -- Debug Interface
340  -- AXI-Lite Interface
341  axilClk => axilClk,
342  axilRst => axilRst,
347 end rtl;
QPLL_REFCLK_SEL_Gbit_vector := "001"
Definition: Gth7QuadPll.vhd:37
in txPreCursorslv( 4 downto 0) :=( others => '0')
array(natural range <> ) of AxiStreamSlaveType AxiStreamSlaveArray
out qPllOutRefClksl
Definition: Gth7QuadPll.vhd:44
in qPllRefClksl
Definition: Gth7QuadPll.vhd:42
out rstOutsl
Definition: PwrUpRst.vhd:39
TX_PLL_Gstring := "QPLL"
QPLL_REFCLK_DIV_Ginteger := 1
Definition: Gth7QuadPll.vhd:40
PAYLOAD_CNT_TOP_Ginteger := 7
out pgpTxSlavesAxiStreamSlaveArray( 3 downto 0)
in pgpTxMastersAxiStreamMasterArray( 3 downto 0) :=( others => AXI_STREAM_MASTER_INIT_C)
in gtQPllRefClksl := '0'
mmcme2_adv mmcm_adv_instmmcm_adv_inst
in axilReadMasterAxiLiteReadMasterType := AXI_LITE_READ_MASTER_INIT_C
out qPllRefClkLostsl
Definition: Gth7QuadPll.vhd:47
AxiLiteWriteMasterType
Definition: AxiLitePkg.vhd:111
std_logic sl
Definition: StdRtlPkg.vhd:28
TX_CLK25_DIV_Ginteger := 5
CPLL_REFCLK_SEL_Gbit_vector := "001"
NUM_VC_EN_Ginteger range 1 to 4:= 4
out pgpRxMastersAxiStreamMasterArray( 3 downto 0)
TX_ENABLE_Gboolean := true
out axilWriteSlaveAxiLiteWriteSlaveType
out qPllLocksl
Definition: Gth7QuadPll.vhd:45
out axilReadSlaveAxiLiteReadSlaveType
out qPllOutClksl
Definition: Gth7QuadPll.vhd:43
in txPreCursorslv( 4 downto 0) :=( others => '0')
CPLL_REFCLK_DIV_Ginteger range 1 to 2:= 1
RX_OS_CFG_Gbit_vector := "0000010000000"
in axilWriteMasterAxiLiteWriteMasterType := AXI_LITE_WRITE_MASTER_INIT_C
in txPostCursorslv( 4 downto 0) :=( others => '0')
out axilWriteSlaveAxiLiteWriteSlaveType
out pgpRxOutPgp2bRxOutType
in arstsl :=not IN_POLARITY_G
Definition: PwrUpRst.vhd:37
CPLL_FBDIV_Ginteger range 1 to 5:= 4
QPLL_FBDIV_RATIO_Gbit := '1'
Definition: Gth7QuadPll.vhd:39
Pgp2bRxInType
Definition: Pgp2bPkg.vhd:55
AXI_ERROR_RESP_Gslv( 1 downto 0) := AXI_RESP_DECERR_C
slv( 1 downto 0) := "11" AXI_RESP_DECERR_C
Definition: AxiLitePkg.vhd:49
RX_OS_CFG_Gbit_vector := "0000010000000"
in qPllResetsl
Definition: Gth7QuadPll.vhd:49
STABLE_CLOCK_PERIOD_Greal := 4.0E-9
in txDiffCtrlslv( 3 downto 0) := "1000"
AxiLiteReadMasterType
Definition: AxiLitePkg.vhd:59
out axilReadSlaveAxiLiteReadSlaveType
out pgpTxSlavesAxiStreamSlaveArray( 3 downto 0)
in gtQPllRefClkLostsl := '0'
in txPostCursorslv( 4 downto 0) :=( others => '0')
array(natural range <> ) of AxiStreamCtrlType AxiStreamCtrlArray
AXI_ERROR_RESP_Gslv( 1 downto 0) := AXI_RESP_DECERR_C
in txDiffCtrlslv( 3 downto 0) := "1000"
RXCDR_CFG_Gbit_vector := x"0002007FE1000C2200018"
out pgpRxMasterMuxedAxiStreamMasterType
in clksl
Definition: PwrUpRst.vhd:38
array(natural range <> ) of AxiStreamMasterType AxiStreamMasterArray
CPLL_FBDIV_Ginteger := 4
RX_ENABLE_Gboolean := true
RX_PLL_Gstring := "CPLL"
in pgpRxInPgp2bRxInType
AxiLiteReadMasterType :=(araddr =>( others => '0'),arprot =>( others => '0'),arvalid => '0',rready => '1') AXI_LITE_READ_MASTER_INIT_C
Definition: AxiLitePkg.vhd:69
CPLL_FBDIV_45_Ginteger := 5
in qPllLockDetClksl
Definition: Gth7QuadPll.vhd:46
AxiLiteReadSlaveType
Definition: AxiLitePkg.vhd:85
RXCDR_CFG_Gbit_vector := x"0002007FE1000C2200018"
VC_INTERLEAVE_Ginteger := 0
in pgpRxCtrlAxiStreamCtrlArray( 3 downto 0)
CPLL_REFCLK_DIV_Ginteger := 1
QPLL_FBDIV_Gbit_vector := "0100100000"
Definition: Gth7QuadPll.vhd:38
AxiLiteWriteMasterType :=(awaddr =>( others => '0'),awprot =>( others => '0'),awvalid => '0',wdata =>( others => '0'),wstrb =>( others => '1'),wvalid => '0',bready => '1') AXI_LITE_WRITE_MASTER_INIT_C
Definition: AxiLitePkg.vhd:125
CPLL_FBDIV_45_Ginteger range 4 to 5:= 5
in pgpTxMastersAxiStreamMasterArray( 3 downto 0)
Pgp2bTxOutType
Definition: Pgp2bPkg.vhd:135
NUM_VC_EN_Ginteger range 1 to 4:= 4
RX_CLK25_DIV_Ginteger := 5
QPLL_FBDIV_Gbit_vector := "0100100000"
in axilWriteMasterAxiLiteWriteMasterType := AXI_LITE_WRITE_MASTER_INIT_C
out pgpTxOutPgp2bTxOutType
in pgpRxCtrlAxiStreamCtrlArray( 3 downto 0)
out pgpRxMasterMuxedAxiStreamMasterType
in pgpRxMmcmLockedsl := '1'
in gtCPllRefClksl := '0'
Pgp2bRxOutType
Definition: Pgp2bPkg.vhd:69
out pgpRxMastersAxiStreamMasterArray( 3 downto 0)
in pgpTxInPgp2bTxInType
std_logic_vector slv
Definition: StdRtlPkg.vhd:29
in axilReadMasterAxiLiteReadMasterType := AXI_LITE_READ_MASTER_INIT_C