SURF  1.0
GLinkGtx7FixedLat.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : GLinkGtx7FixedLat.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2014-01-30
5 -- Last update: 2015-02-23
6 -------------------------------------------------------------------------------
7 -- Description: G-Link wrapper for GTX7 Fixed Latency transceiver
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.GlinkPkg.all;
24 
25 --! @see entity
26  --! @ingroup protocols_glink_gtx7
28  generic (
29  -- GLink Settings
30  FLAGSEL_G : boolean := false;
31  SYNTH_TX_G : boolean := true;
32  SYNTH_RX_G : boolean := true;
33  -- Simulation Generics
34  TPD_G : time := 1 ns;
35  SIM_GTRESET_SPEEDUP_G : string := "FALSE";
36  SIM_VERSION_G : string := "4.0";
37  SIMULATION_G : boolean := false;
38  -- CPLL Settings
39  CPLL_REFCLK_SEL_G : bit_vector := "001";
40  CPLL_FBDIV_G : integer := 4;
41  CPLL_FBDIV_45_G : integer := 5;
42  CPLL_REFCLK_DIV_G : integer := 1;
43  -- MGT Settings
44  RXOUT_DIV_G : integer := 2;
45  TXOUT_DIV_G : integer := 2;
46  RX_CLK25_DIV_G : integer := 5; -- Set by wizard
47  TX_CLK25_DIV_G : integer := 5; -- Set by wizard
48  RX_OS_CFG_G : bit_vector := "0000010000000"; -- Set by wizard
49  RXCDR_CFG_G : bit_vector := x"03000023ff40200020"; -- Set by wizard
50  -- RX Equalizer Attributes
51  RX_DFE_KL_CFG2_G : bit_vector := x"3008E56A"; -- Set by wizard
52  RX_CM_TRIM_G : bit_vector := "010";
53  RX_DFE_LPM_CFG_G : bit_vector := x"0954";
54  RXDFELFOVRDEN_G : sl := '1';
55  RXDFEXYDEN_G : sl := '1'; -- This should always be 1
56  -- Configure PLL sources
57  TX_PLL_G : string := "QPLL";
58  RX_PLL_G : string := "CPLL");
59  port (
60  -- G-Link TX Interface (gLinkTxClk Domain)
61  gLinkTx : in GLinkTxType;
62  txReady : out sl;
63  gLinkTxClk : in sl;
64  gLinkTxClkEn : in sl := '1';
65  gLinkTxRst : in sl := '0';
66  -- G-Link TX Interface (gLinkClk Domain)
67  gLinkRx : out GLinkRxType;
68  rxReady : out sl;
69  gLinkRxClk : in sl;
70  gLinkRxClkEn : in sl := '1';
71  gLinkRxRst : in sl := '0';
72  -- MGT Clocking
73  gLinkTxRefClk : in sl; -- G-Link TX clock reference
74  stableClk : in sl;
75  gtCPllRefClk : in sl := '0';
76  gtCPllLock : out sl;
77  gtQPllRefClk : in sl := '0';
78  gtQPllClk : in sl := '0';
79  gtQPllLock : in sl := '0';
80  gtQPllRefClkLost : in sl := '0';
81  gtQPllReset : out sl;
82  -- Misc. MGT control
83  lpmMode : in sl := '1';
84  loopback : in slv(2 downto 0);
87  rxClkDebug : out sl; -- debug only
88  -- MGT Serial IO
89  gtTxP : out sl;
90  gtTxN : out sl;
91  gtRxP : in sl;
92  gtRxN : in sl);
93 
94 end GLinkGtx7FixedLat;
95 
96 architecture rtl of GLinkGtx7FixedLat is
97 
98  constant FIXED_ALIGN_COMMA_0_C : slv(19 downto 0) := bitReverse((GLINK_VALID_IDLE_WORDS_C(0) & GLINK_CONTROL_WORD_C)); -- FF0
99  constant FIXED_ALIGN_COMMA_1_C : slv(19 downto 0) := bitReverse((GLINK_VALID_IDLE_WORDS_C(1) & GLINK_CONTROL_WORD_C)); -- FF1A
100  constant FIXED_ALIGN_COMMA_2_C : slv(19 downto 0) := bitReverse((GLINK_VALID_IDLE_WORDS_C(2) & GLINK_CONTROL_WORD_C)); -- FF1B
101 
102  signal txFifoValid,
103  rxFifoValid,
104  rxRecClk,
105  rxClk,
106  rxRst,
107  txClk,
108  txUserReset,
109  rxUserReset,
110  gtTxRstDone,
111  gtRxRstDone,
112  gtTxRst,
113  gtRxRst,
114  dataValid : sl := '0';
115  signal txFifoDout,
116  gtTxData,
117  gtRxData,
118  gtTxDataReversed,
119  gtRxDataReversed : slv(19 downto 0) := (others => '0');
120  signal rxFifoDout : slv(23 downto 0);
121  signal gLinkTxSync : GLinkTxType;
122  signal gLinkRxSync : GLinkRxType;
123 
124 begin
125 
126  rxClkDebug <= rxClk;
127 
128  SYNTH_TX : if (SYNTH_TX_G = true) generate
129 
130  txClk <= gLinkTxRefClk;
131 
132  Synchronizer_0 : entity work.Synchronizer
133  generic map (
134  TPD_G => TPD_G)
135  port map (
136  clk => gLinkTxClk,
137  dataIn => gtTxRstDone,
138  dataOut => txReady);
139 
140  SyncFifo_TX : entity work.SynchronizerFifo
141  generic map (
142  TPD_G => TPD_G,
143  INIT_G => toSlv(GLINK_TX_UNUSED_C),
144  DATA_WIDTH_G => 20)
145  port map (
146  --Write Ports (wr_clk domain)
147  wr_clk => gLinkTxClk,
148  wr_en => gLinkTxClkEn,
149  din => toSlv(gLinkTx),
150  --Read Ports (rd_clk domain)
151  rd_clk => txClk,
152  valid => txFifoValid,
153  dout => txFifoDout);
154 
155  gLinkTxSync <= toGLinkTx(txFifoDout) when(txFifoValid = '1') else GLINK_TX_UNUSED_C;
156 
157  gtTxRst <= not(gtTxRstDone) or gLinkTxSync.linkRst;
158 
159  GLinkEncoder_Inst : entity work.GLinkEncoder
160  generic map (
161  TPD_G => TPD_G,
162  FLAGSEL_G => FLAGSEL_G,
163  RST_POLARITY_G => '1')
164  port map (
165  clk => txClk,
166  rst => gtTxRst,
167  gLinkTx => gLinkTxSync,
168  encodedData => gtTxData);
169 
170  end generate;
171 
172  DISABLE_SYNTH_TX : if (SYNTH_TX_G = false) generate
173 
174  txClk <= '0';
175  txReady <= '1';
176  gLinkTxSync <= GLINK_TX_UNUSED_C;
177  gtTxRst <= '0';
178  gtTxData <= (GLINK_IDLE_WORD_FF0_C & GLINK_CONTROL_WORD_C);
179 
180  end generate;
181 
182  SYNTH_RX : if (SYNTH_RX_G = true) generate
183 
184  rxClk <= rxRecClk;
185 
186  Synchronizer_1 : entity work.Synchronizer
187  generic map (
188  TPD_G => TPD_G)
189  port map (
190  clk => gLinkRxClk,
191  dataIn => gtRxRstDone,
192  dataOut => rxReady);
193 
194  SyncFifo_RX : entity work.SynchronizerFifo
195  generic map (
196  TPD_G => TPD_G,
197  INIT_G => toSlv(GLINK_RX_INIT_C),
198  DATA_WIDTH_G => 24)
199  port map (
200  -- Asynchronous Reset
201  rst => gtRxRst,
202  --Write Ports (wr_clk domain)
203  wr_clk => rxClk,
204  wr_en => gtRxRstDone,
205  din => toSlv(gLinkRxSync),
206  --Read Ports (rd_clk domain)
207  rd_clk => gLinkRxClk,
208  rd_en => gLinkRxClkEn,
209  valid => rxFifoValid,
210  dout => rxFifoDout);
211 
212  gLinkRx <= toGLinkRx(rxFifoDout);
213 
214  rxRst <= '0';
215  gtRxRst <= not(gtRxRstDone) or rxRst;
216 
217  GLinkDecoder_Inst : entity work.GLinkDecoder
218  generic map (
219  TPD_G => TPD_G,
220  FLAGSEL_G => FLAGSEL_G,
221  RST_POLARITY_G => '1')
222  port map (
223  clk => rxClk,
224  rst => gtRxRst,
225  gtRxData => gtRxData,
226  rxReady => gtRxRstDone,
227  txReady => gtTxRstDone,
228  gLinkRx => gLinkRxSync,
229  decoderErrorL => dataValid);
230 
231  end generate;
232 
233  DISABLE_SYNTH_RX : if (SYNTH_RX_G = false) generate
234 
235  rxClk <= '0';
236  rxReady <= '1';
237  gLinkRx <= GLINK_RX_INIT_C;
238  rxRst <= '0';
239  gtRxRst <= '0';
240  dataValid <= '1';
241 
242  end generate;
243 
244  gtTxDataReversed <= bitReverse(gtTxData);
245  gtRxData <= bitReverse(gtRxDataReversed);
246 
247  rxUserReset <= gLinkTx.linkRst or gLinkRxRst;
248  txUserReset <= gLinkTx.linkRst or gLinkTxRst;
249 
250  -- GTX 7 Core in Fixed Latency mode
251  Gtx7Core_Inst : entity work.GLinkGtx7Core
252  generic map (
253  TPD_G => TPD_G,
257  STABLE_CLOCK_PERIOD_G => 4.0E-9,
266  TX_PLL_G => TX_PLL_G,
267  RX_PLL_G => RX_PLL_G,
268  -- Configure TX
269  TX_EXT_DATA_WIDTH_G => 20,
270  TX_INT_DATA_WIDTH_G => 20,
271  TX_8B10B_EN_G => false,
272  TX_BUF_EN_G => false,
273  TX_OUTCLK_SRC_G => "PLLREFCLK",
274  TX_DLY_BYPASS_G => '0',
275  TX_PHASE_ALIGN_G => "MANUAL",
276  TX_BUF_ADDR_MODE_G => "FAST",
277  -- Configure RX
278  RX_EXT_DATA_WIDTH_G => 20,
279  RX_INT_DATA_WIDTH_G => 20,
280  RX_8B10B_EN_G => false,
281  RX_BUF_EN_G => false,
282  RX_OUTCLK_SRC_G => "OUTCLKPMA",
283  RX_USRCLK_SRC_G => "RXOUTCLK",
284  RX_DLY_BYPASS_G => '1',
285  RX_DDIEN_G => '0',
286  RX_ALIGN_MODE_G => "FIXED_LAT",
289  RXSLIDE_MODE_G => "PMA",
290  -- RX Equalizer Attributes
296  -- Fixed Latency comma alignment (If RX_ALIGN_MODE_G = "FIXED_LAT")
297  FIXED_COMMA_EN_G => "0111",
298  FIXED_ALIGN_COMMA_0_G => FIXED_ALIGN_COMMA_0_C,
299  FIXED_ALIGN_COMMA_1_G => FIXED_ALIGN_COMMA_1_C,
300  FIXED_ALIGN_COMMA_2_G => FIXED_ALIGN_COMMA_2_C,
301  FIXED_ALIGN_COMMA_3_G => "XXXXXXXXXXXXXXXXXXXX")
302  port map (
303  lpmMode => lpmMode,
308  qPllClkIn => gtQPllClk,
312  gtTxP => gtTxP,
313  gtTxN => gtTxN,
314  gtRxP => gtRxP,
315  gtRxN => gtRxN,
317  rxOutClkOut => rxRecClk,
318  rxUsrClkIn => rxClk,
319  rxUsrClk2In => rxClk,
320  rxUserRdyOut => open,
321  rxMmcmResetOut => open,
322  rxMmcmLockedIn => '1',
323  rxUserResetIn => rxUserReset, -- Sync'd in Gtx7RxRst.vhd
324  rxResetDoneOut => gtRxRstDone,
325  rxDataValidIn => dataValid,
326  rxSlideIn => '0', -- Slide is controlled internally
327  rxDataOut => gtRxDataReversed,
328  rxCharIsKOut => open, -- Not using gt rx 8b10b
329  rxDecErrOut => open, -- Not using gt rx 8b10b
330  rxDispErrOut => open, -- Not using gt rx 8b10b
331  rxPolarityIn => '0',
332  rxBufStatusOut => open,
333  txOutClkOut => open,
334  txUsrClkIn => txClk,
335  txUsrClk2In => txClk,
336  txUserRdyOut => open, -- Not sure what to do with this
337  txMmcmResetOut => open, -- No Tx MMCM in Fixed Latency mode
338  txMmcmLockedIn => '1',
339  txUserResetIn => txUserReset,
340  txResetDoneOut => gtTxRstDone,
341  txDataIn => gtTxDataReversed,
342  txCharIsKIn => (others => '0'), -- Not using gt rx 8b10b
343  txBufStatusOut => open,
344  txPowerDown(0) => txPowerDown,
345  txPowerDown(1) => txPowerDown,
346  rxPowerDown(0) => rxPowerDown,
347  rxPowerDown(1) => rxPowerDown,
348  loopbackIn => loopback);
349 end rtl;
RX_DFE_KL_CFG2_Gbit_vector := x"3008E56A"
TX_EXT_DATA_WIDTH_Ginteger := 16
CPLL_REFCLK_DIV_Ginteger := 1
RX_EXT_DATA_WIDTH_Ginteger := 16
RXSLIDE_MODE_Gstring := "PCS"
out encodedDataslv( 19 downto 0)
in gtQPllRefClksl := '0'
in gLinkTxGLinkTxType
RXOUT_DIV_Ginteger := 2
in qPllRefClkInsl := '0'
in qPllRefClkLostInsl := '0'
in gtCPllRefClksl := '0'
out txMmcmResetOutsl
RX_CM_TRIM_Gbit_vector := "010"
in qPllClkInsl := '0'
RX_DFE_LPM_CFG_Gbit_vector := x"0954"
RX_PLL_Gstring := "CPLL"
std_logic sl
Definition: StdRtlPkg.vhd:28
in loopbackslv( 2 downto 0)
TX_8B10B_EN_Gboolean := true
RX_PLL_Gstring := "CPLL"
in dinslv( DATA_WIDTH_G- 1 downto 0)
in rxMmcmLockedInsl := '1'
in gtRxDataslv( 19 downto 0)
out rxDataOutslv( RX_EXT_DATA_WIDTH_G- 1 downto 0)
RX_DFE_LPM_CFG_Gbit_vector := x"0954"
out gLinkRxGLinkRxType
FIXED_ALIGN_COMMA_3_Gslv := "XXXXXXXXXXXXXXXXXXXX"
in gtQPllRefClkLostsl := '0'
TX_BUF_ADDR_MODE_Gstring := "FAST"
in gLinkTxClkEnsl := '1'
TPD_Gtime := 1 ns
in gtRxRefClkBufgsl := '0'
SIM_GTRESET_SPEEDUP_Gstring := "FALSE"
RX_USRCLK_SRC_Gstring := "RXOUTCLK"
RXCDR_CFG_Gbit_vector := x"03000023ff40200020"
RXCDR_CFG_Gbit_vector := x"03000023ff40200020"
SIM_VERSION_Gstring := "4.0"
TX_OUTCLK_SRC_Gstring := "PLLREFCLK"
CPLL_REFCLK_SEL_Gbit_vector := "001"
out dataOutsl
out doutslv( DATA_WIDTH_G- 1 downto 0)
CPLL_FBDIV_45_Ginteger := 5
RXDFELFOVRDEN_Gsl := '1'
RX_CLK25_DIV_Ginteger := 5
SIMULATION_Gboolean := false
SIM_GTRESET_SPEEDUP_Gstring := "FALSE"
out txResetDoneOutsl
RST_POLARITY_Gsl := '1'
out rxResetDoneOutsl
in loopbackInslv( 2 downto 0) := "000"
RX_DFE_KL_CFG2_Gbit_vector := x"3008E56A"
in txCharIsKInslv(( TX_EXT_DATA_WIDTH_G/ 8)- 1 downto 0)
in gLinkTxGLinkTxType
STABLE_CLOCK_PERIOD_Greal := 4.0E-9
TPD_Gtime := 1 ns
SIM_VERSION_Gstring := "4.0"
in qPllLockInsl := '0'
out rxBufStatusOutslv( 2 downto 0)
out rxCharIsKOutslv(( RX_EXT_DATA_WIDTH_G/ 8)- 1 downto 0)
RX_OUTCLK_SRC_Gstring := "PLLREFCLK"
TPD_Gtime := 1 ns
RX_OS_CFG_Gbit_vector := "0000010000000"
out txBufStatusOutslv( 1 downto 0)
TPD_Gtime := 1 ns
out rxDispErrOutslv(( RX_EXT_DATA_WIDTH_G/ 8)- 1 downto 0)
RX_INT_DATA_WIDTH_Ginteger := 20
out decoderErrorLsl
TX_INT_DATA_WIDTH_Ginteger := 20
in rxDataValidInsl := '1'
out rxMmcmResetOutsl
TX_PHASE_ALIGN_Gstring := "AUTO"
FLAGSEL_Gboolean := false
RX_BUF_EN_Gboolean := true
FIXED_ALIGN_COMMA_1_Gslv := "----------1010000011"
SIMULATION_Gboolean := false
TX_CLK25_DIV_Ginteger := 5
FIXED_ALIGN_COMMA_0_Gslv := "----------0101111100"
TX_PLL_Gstring := "CPLL"
TX_CLK25_DIV_Ginteger := 5
RX_ALIGN_MODE_Gstring := "GT"
FIXED_ALIGN_COMMA_2_Gslv := "XXXXXXXXXXXXXXXXXXXX"
in txDataInslv( TX_EXT_DATA_WIDTH_G- 1 downto 0)
FLAGSEL_Gboolean := false
CPLL_FBDIV_45_Ginteger := 5
CPLL_REFCLK_SEL_Gbit_vector := "001"
CPLL_FBDIV_Ginteger := 4
RX_DDIEN_Gsl := '0'
in txMmcmLockedInsl := '1'
RX_8B10B_EN_Gboolean := true
TX_BUF_EN_Gboolean := true
FIXED_COMMA_EN_Gslv( 3 downto 0) := "0011"
in cPllRefClkInsl := '0'
out rxDecErrOutslv(( RX_EXT_DATA_WIDTH_G/ 8)- 1 downto 0)
RXDFEXYDEN_Gsl := '1'
RST_POLARITY_Gsl := '1'
in rxPolarityInsl := '0'
TX_DLY_BYPASS_Gsl := '1'
in gLinkRxClkEnsl := '1'
CPLL_FBDIV_Ginteger := 4
RX_CLK25_DIV_Ginteger := 5
out gLinkRxGLinkRxType
SYNTH_TX_Gboolean := true
_library_ ieeeieee
SYNTH_RX_Gboolean := true
TX_PLL_Gstring := "QPLL"
RX_CM_TRIM_Gbit_vector := "010"
TXOUT_DIV_Ginteger := 2
RX_OS_CFG_Gbit_vector := "0000010000000"
DATA_WIDTH_Ginteger range 1 to ( 2** 24):= 16
RX_DLY_BYPASS_Gsl := '1'
std_logic_vector slv
Definition: StdRtlPkg.vhd:29
CPLL_REFCLK_DIV_Ginteger := 1
in rxSlideInsl := '0'
FLAGSEL_Gboolean := false