SURF  1.0
GLinkGtp7FixedLat.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : GLinkGtp7FixedLat.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2014-01-30
5 -- Last update: 2017-05-08
6 -------------------------------------------------------------------------------
7 -- Description: G-Link wrapper for GTP7 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_gtp7
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  -- MGT Settings
39  RXOUT_DIV_G : integer := 2;
40  TXOUT_DIV_G : integer := 2;
41  RX_CLK25_DIV_G : integer := 5; -- Set by wizard
42  TX_CLK25_DIV_G : integer := 5; -- Set by wizard
43  PMA_RSV_G : bit_vector := x"00000333"; -- Set by wizard
44  RX_OS_CFG_G : bit_vector := "0001111110000"; -- Set by wizard
45  RXCDR_CFG_G : bit_vector := x"0000107FE206001041010"; -- Set by wizard
46  RXLPM_INCM_CFG_G : bit := '1'; -- Set by wizard
47  RXLPM_IPCM_CFG_G : bit := '0'; -- Set by wizard
48  -- Configure PLL sources
49  TX_PLL_G : string := "PLL0";
50  RX_PLL_G : string := "PLL1");
51  port (
52  -- G-Link TX Interface (gLinkTxClk Domain)
53  gLinkTx : in GLinkTxType;
54  txReady : out sl;
55  gLinkTxClk : in sl;
56  gLinkTxClkEn : in sl := '1';
57  -- G-Link TX Interface (gLinkClk Domain)
58  gLinkRx : out GLinkRxType;
59  rxReady : out sl;
60  gLinkRxClk : in sl;
61  gLinkRxClkEn : in sl := '1';
62  -- MGT Clocking
63  gLinkTxRefClk : in sl; -- G-Link TX clock reference
64  stableClk : in sl;
65  gtQPllRefClk : in slv(1 downto 0);
66  gtQPllClk : in slv(1 downto 0);
67  gtQPllLock : in slv(1 downto 0);
68  gtQPllRefClkLost : in slv(1 downto 0);
69  gtQPllReset : out slv(1 downto 0);
70  -- MGT loopback control
71  loopback : in slv(2 downto 0);
72  -- MGT Serial IO
73  gtTxP : out sl;
74  gtTxN : out sl;
75  gtRxP : in sl;
76  gtRxN : in sl);
77 
78 end GLinkGtp7FixedLat;
79 
80 architecture rtl of GLinkGtp7FixedLat is
81 
82  constant FIXED_ALIGN_COMMA_0_C : slv(19 downto 0) := bitReverse((GLINK_VALID_IDLE_WORDS_C(0) & GLINK_CONTROL_WORD_C)); -- FF0
83  constant FIXED_ALIGN_COMMA_1_C : slv(19 downto 0) := bitReverse((GLINK_VALID_IDLE_WORDS_C(1) & GLINK_CONTROL_WORD_C)); -- FF1A
84  constant FIXED_ALIGN_COMMA_2_C : slv(19 downto 0) := bitReverse((GLINK_VALID_IDLE_WORDS_C(2) & GLINK_CONTROL_WORD_C)); -- FF1B
85 
86  signal txFifoValid,
87  rxFifoValid,
88  rxRecClk,
89  rxClk,
90  rxRst,
91  txClk,
92  gtTxRstDone,
93  gtRxRstDone,
94  gtTxRst,
95  gtRxRst,
96  dataValid : sl := '0';
97  signal txFifoDout,
98  gtTxData,
99  gtRxData,
100  gtTxDataReversed,
101  gtRxDataReversed : slv(19 downto 0) := (others => '0');
102  signal rxFifoDout : slv(23 downto 0);
103  signal gLinkTxSync : GLinkTxType;
104  signal gLinkRxSync : GLinkRxType;
105 
106 begin
107 
108  SYNTH_TX : if (SYNTH_TX_G = true) generate
109 
110  txClk <= gLinkTxRefClk;
111 
112  Synchronizer_0 : entity work.Synchronizer
113  generic map (
114  TPD_G => TPD_G)
115  port map (
116  clk => gLinkTxClk,
117  dataIn => gtTxRstDone,
118  dataOut => txReady);
119 
120  SyncFifo_TX : entity work.SynchronizerFifo
121  generic map (
122  TPD_G => TPD_G,
123  INIT_G => toSlv(GLINK_TX_UNUSED_C),
124  DATA_WIDTH_G => 20)
125  port map (
126  --Write Ports (wr_clk domain)
127  wr_clk => gLinkTxClk,
128  wr_en => gLinkTxClkEn,
129  din => toSlv(gLinkTx),
130  --Read Ports (rd_clk domain)
131  rd_clk => txClk,
132  valid => txFifoValid,
133  dout => txFifoDout);
134 
135  gLinkTxSync <= toGLinkTx(txFifoDout) when(txFifoValid = '1') else GLINK_TX_UNUSED_C;
136 
137  gtTxRst <= not(gtTxRstDone) or gLinkTxSync.linkRst;
138 
139  GLinkEncoder_Inst : entity work.GLinkEncoder
140  generic map (
141  TPD_G => TPD_G,
142  FLAGSEL_G => FLAGSEL_G,
143  RST_POLARITY_G => '1')
144  port map (
145  clk => txClk,
146  rst => gtTxRst,
147  gLinkTx => gLinkTxSync,
148  encodedData => gtTxData);
149 
150  end generate;
151 
152  DISABLE_SYNTH_TX : if (SYNTH_TX_G = false) generate
153 
154  txClk <= '0';
155  txReady <= '1';
156  gLinkTxSync <= GLINK_TX_UNUSED_C;
157  gtTxRst <= '0';
158  gtTxData <= (GLINK_IDLE_WORD_FF0_C & GLINK_CONTROL_WORD_C);
159 
160  end generate;
161 
162  SYNTH_RX : if (SYNTH_RX_G = true) generate
163 
164  rxClk <= rxRecClk;
165 
166  Synchronizer_1 : entity work.Synchronizer
167  generic map (
168  TPD_G => TPD_G)
169  port map (
170  clk => gLinkRxClk,
171  dataIn => gtRxRstDone,
172  dataOut => rxReady);
173 
174  SyncFifo_RX : entity work.SynchronizerFifo
175  generic map (
176  TPD_G => TPD_G,
177  INIT_G => toSlv(GLINK_RX_INIT_C),
178  DATA_WIDTH_G => 24)
179  port map (
180  -- Asynchronous Reset
181  rst => gtRxRst,
182  --Write Ports (wr_clk domain)
183  wr_clk => rxClk,
184  wr_en => gtRxRstDone,
185  din => toSlv(gLinkRxSync),
186  --Read Ports (rd_clk domain)
187  rd_clk => gLinkRxClk,
188  rd_en => gLinkRxClkEn,
189  valid => rxFifoValid,
190  dout => rxFifoDout);
191 
192  gLinkRx <= toGLinkRx(rxFifoDout);
193 
194  rxRst <= '0';
195  gtRxRst <= not(gtRxRstDone) or rxRst;
196 
197  GLinkDecoder_Inst : entity work.GLinkDecoder
198  generic map (
199  TPD_G => TPD_G,
200  FLAGSEL_G => FLAGSEL_G,
201  RST_POLARITY_G => '1')
202  port map (
203  clk => rxClk,
204  rst => gtRxRst,
205  gtRxData => gtRxData,
206  rxReady => gtRxRstDone,
207  txReady => gtTxRstDone,
208  gLinkRx => gLinkRxSync,
209  decoderErrorL => dataValid);
210 
211  end generate;
212 
213  DISABLE_SYNTH_RX : if (SYNTH_RX_G = false) generate
214 
215  rxClk <= '0';
216  rxReady <= '1';
217  gLinkRx <= GLINK_RX_INIT_C;
218  rxRst <= '0';
219  gtRxRst <= '0';
220  dataValid <= '1';
221 
222  end generate;
223 
224  gtTxDataReversed <= bitReverse(gtTxData);
225  gtRxData <= bitReverse(gtRxDataReversed);
226 
227  -- GTP 7 Core in Fixed Latency mode
228  Gtp7Core_Inst : entity work.Gtp7Core
229  generic map (
230  TPD_G => TPD_G,
234  STABLE_CLOCK_PERIOD_G => 4.0E-9,
239  PMA_RSV_G => PMA_RSV_G,
244  TX_PLL_G => TX_PLL_G,
245  RX_PLL_G => RX_PLL_G,
246  TX_EXT_DATA_WIDTH_G => 20,
247  TX_INT_DATA_WIDTH_G => 20,
248  TX_8B10B_EN_G => false,
249  RX_EXT_DATA_WIDTH_G => 20,
250  RX_INT_DATA_WIDTH_G => 20,
251  RX_8B10B_EN_G => false,
252  TX_BUF_EN_G => false,
253  TX_OUTCLK_SRC_G => "PLLREFCLK",
254  TX_DLY_BYPASS_G => '0',
255  TX_PHASE_ALIGN_G => "MANUAL",
256  RX_BUF_EN_G => false,
257  RX_OUTCLK_SRC_G => "OUTCLKPMA",
258  RX_USRCLK_SRC_G => "RXOUTCLK",
259  RX_DLY_BYPASS_G => '1',
260  RX_DDIEN_G => '0',
261  RX_ALIGN_MODE_G => "FIXED_LAT",
262  RXSLIDE_MODE_G => "PMA",
263  FIXED_COMMA_EN_G => "0111",
264  FIXED_ALIGN_COMMA_0_G => FIXED_ALIGN_COMMA_0_C,
265  FIXED_ALIGN_COMMA_1_G => FIXED_ALIGN_COMMA_1_C,
266  FIXED_ALIGN_COMMA_2_G => FIXED_ALIGN_COMMA_2_C,
267  FIXED_ALIGN_COMMA_3_G => "XXXXXXXXXXXXXXXXXXXX")
268  port map (
271  qPllClkIn => gtQPllClk,
275  gtTxP => gtTxP,
276  gtTxN => gtTxN,
277  gtRxP => gtRxP,
278  gtRxN => gtRxN,
280  rxOutClkOut => rxRecClk,
281  rxUsrClkIn => rxClk,
282  rxUsrClk2In => rxClk,
283  rxUserRdyOut => open,
284  rxMmcmResetOut => open,
285  rxMmcmLockedIn => '1',
286  rxUserResetIn => rxRst,
287  rxResetDoneOut => gtRxRstDone,
288  rxDataValidIn => dataValid,
289  rxSlideIn => '0', -- Slide is controlled internally
290  rxDataOut => gtRxDataReversed,
291  rxCharIsKOut => open, -- Not using gt rx 8b10b
292  rxDecErrOut => open, -- Not using gt rx 8b10b
293  rxDispErrOut => open, -- Not using gt rx 8b10b
294  rxPolarityIn => '0',
295  rxBufStatusOut => open,
296  txOutClkOut => open,
297  txUsrClkIn => txClk,
298  txUsrClk2In => txClk,
299  txUserRdyOut => open, -- Not sure what to do with this
300  txMmcmResetOut => open, -- No Tx MMCM in Fixed Latency mode
301  txMmcmLockedIn => '1',
302  txUserResetIn => gLinkTxSync.linkRst,
303  txResetDoneOut => gtTxRstDone,
304  txDataIn => gtTxDataReversed,
305  txCharIsKIn => (others => '0'), -- Not using gt rx 8b10b
306  txBufStatusOut => open,
307  loopbackIn => loopback);
308 end rtl;
in rxUsrClkInsl
Definition: Gtp7Core.vhd:167
TPD_Gtime := 1 ns
Definition: Gtp7Core.vhd:31
in txUserResetInsl
Definition: Gtp7Core.vhd:203
SIM_VERSION_Gstring := "1.0"
Definition: Gtp7Core.vhd:35
TX_EXT_DATA_WIDTH_Ginteger := 16
Definition: Gtp7Core.vhd:58
out encodedDataslv( 19 downto 0)
RX_EXT_DATA_WIDTH_Ginteger := 16
Definition: Gtp7Core.vhd:62
TX_INT_DATA_WIDTH_Ginteger := 20
Definition: Gtp7Core.vhd:59
RX_DLY_BYPASS_Gsl := '1'
Definition: Gtp7Core.vhd:76
in qPllLockInslv( 1 downto 0)
Definition: Gtp7Core.vhd:153
RX_OS_CFG_Gbit_vector := "0001111110000"
Definition: Gtp7Core.vhd:48
FIXED_ALIGN_COMMA_0_Gslv := "----------0101111100"
Definition: Gtp7Core.vhd:96
RXOUT_DIV_Ginteger := 2
Definition: Gtp7Core.vhd:43
in qPllRefClkLostInslv( 1 downto 0)
Definition: Gtp7Core.vhd:154
std_logic sl
Definition: StdRtlPkg.vhd:28
in dinslv( DATA_WIDTH_G- 1 downto 0)
RX_DDIEN_Gsl := '0'
Definition: Gtp7Core.vhd:77
in stableClkInsl
Definition: Gtp7Core.vhd:149
PMA_RSV_Gbit_vector := x"00000333"
in gtRxDataslv( 19 downto 0)
out rxCharIsKOutslv(( RX_EXT_DATA_WIDTH_G/ 8)- 1 downto 0)
Definition: Gtp7Core.vhd:183
RX_PLL_Gstring := "PLL1"
Definition: Gtp7Core.vhd:55
RX_OS_CFG_Gbit_vector := "0001111110000"
in gLinkRxClkEnsl := '1'
out gLinkRxGLinkRxType
TX_PHASE_ALIGN_Gstring := "AUTO"
Definition: Gtp7Core.vhd:70
TX_PLL_Gstring := "PLL0"
RX_CLK25_DIV_Ginteger := 5
in txCharIsKInslv(( TX_EXT_DATA_WIDTH_G/ 8)- 1 downto 0)
Definition: Gtp7Core.vhd:208
out txUserRdyOutsl
Definition: Gtp7Core.vhd:198
out gLinkRxGLinkRxType
out txBufStatusOutslv( 1 downto 0)
Definition: Gtp7Core.vhd:209
TX_CLK25_DIV_Ginteger := 5
Definition: Gtp7Core.vhd:46
out gtQPllResetslv( 1 downto 0)
in rxUserResetInsl
Definition: Gtp7Core.vhd:174
out gtTxNsl
Definition: Gtp7Core.vhd:161
TPD_Gtime := 1 ns
TX_CLK25_DIV_Ginteger := 5
SYNTH_RX_Gboolean := true
out qPllResetOutslv( 1 downto 0)
Definition: Gtp7Core.vhd:155
FIXED_ALIGN_COMMA_1_Gslv := "----------1010000011"
Definition: Gtp7Core.vhd:97
RXCDR_CFG_Gbit_vector := x"0000107FE206001041010"
in txMmcmLockedInsl := '1'
Definition: Gtp7Core.vhd:200
FLAGSEL_Gboolean := false
out dataOutsl
out doutslv( DATA_WIDTH_G- 1 downto 0)
out rxBufStatusOutslv( 2 downto 0)
Definition: Gtp7Core.vhd:187
SIM_GTRESET_SPEEDUP_Gstring := "FALSE"
Definition: Gtp7Core.vhd:34
in rxSlideInsl := '0'
Definition: Gtp7Core.vhd:179
in rxDataValidInsl := '1'
Definition: Gtp7Core.vhd:178
in gLinkTxGLinkTxType
RST_POLARITY_Gsl := '1'
in gLinkTxGLinkTxType
out rxDataOutslv( RX_EXT_DATA_WIDTH_G- 1 downto 0)
Definition: Gtp7Core.vhd:182
TX_BUF_EN_Gboolean := true
Definition: Gtp7Core.vhd:67
FIXED_COMMA_EN_Gslv( 3 downto 0) := "0011"
Definition: Gtp7Core.vhd:95
TX_PLL_Gstring := "PLL0"
Definition: Gtp7Core.vhd:54
SYNTH_TX_Gboolean := true
in gtQPllLockslv( 1 downto 0)
in txDataInslv( TX_EXT_DATA_WIDTH_G- 1 downto 0)
Definition: Gtp7Core.vhd:207
out rxUserRdyOutsl
Definition: Gtp7Core.vhd:169
RXCDR_CFG_Gbit_vector := x"0000107FE206001041010"
Definition: Gtp7Core.vhd:49
in rxMmcmLockedInsl := '1'
Definition: Gtp7Core.vhd:171
in qPllRefClkInslv( 1 downto 0)
Definition: Gtp7Core.vhd:151
in loopbackslv( 2 downto 0)
RX_OUTCLK_SRC_Gstring := "PLLREFCLK"
Definition: Gtp7Core.vhd:74
in gtRxRefClkBufgsl := '0'
Definition: Gtp7Core.vhd:156
RX_ALIGN_MODE_Gstring := "GT"
Definition: Gtp7Core.vhd:81
in gtQPllClkslv( 1 downto 0)
in gtQPllRefClkslv( 1 downto 0)
TPD_Gtime := 1 ns
in gtRxPsl
Definition: Gtp7Core.vhd:162
TPD_Gtime := 1 ns
RXSLIDE_MODE_Gstring := "PCS"
Definition: Gtp7Core.vhd:92
in gtRxNsl
Definition: Gtp7Core.vhd:163
in txUsrClkInsl
Definition: Gtp7Core.vhd:196
out decoderErrorLsl
in gLinkTxClkEnsl := '1'
FLAGSEL_Gboolean := false
out txMmcmResetOutsl
Definition: Gtp7Core.vhd:199
in qPllClkInslv( 1 downto 0)
Definition: Gtp7Core.vhd:152
in rxPolarityInsl := '0'
Definition: Gtp7Core.vhd:186
in rxUsrClk2Insl
Definition: Gtp7Core.vhd:168
RXLPM_INCM_CFG_Gbit := '1'
Definition: Gtp7Core.vhd:50
out rxDecErrOutslv(( RX_EXT_DATA_WIDTH_G/ 8)- 1 downto 0)
Definition: Gtp7Core.vhd:184
out rxDispErrOutslv(( RX_EXT_DATA_WIDTH_G/ 8)- 1 downto 0)
Definition: Gtp7Core.vhd:185
out txOutClkOutsl
Definition: Gtp7Core.vhd:195
out gtTxPsl
Definition: Gtp7Core.vhd:160
FIXED_ALIGN_COMMA_3_Gslv := "XXXXXXXXXXXXXXXXXXXX"
Definition: Gtp7Core.vhd:99
in gtQPllRefClkLostslv( 1 downto 0)
FLAGSEL_Gboolean := false
RX_PLL_Gstring := "PLL1"
in loopbackInslv( 2 downto 0) := "000"
Definition: Gtp7Core.vhd:214
RX_USRCLK_SRC_Gstring := "RXOUTCLK"
Definition: Gtp7Core.vhd:75
TX_DLY_BYPASS_Gsl := '1'
Definition: Gtp7Core.vhd:69
SIMULATION_Gboolean := false
Definition: Gtp7Core.vhd:37
TX_OUTCLK_SRC_Gstring := "PLLREFCLK"
Definition: Gtp7Core.vhd:68
in txUsrClk2Insl
Definition: Gtp7Core.vhd:197
SIMULATION_Gboolean := false
out rxMmcmResetOutsl
Definition: Gtp7Core.vhd:170
SIM_GTRESET_SPEEDUP_Gstring := "FALSE"
RST_POLARITY_Gsl := '1'
FIXED_ALIGN_COMMA_2_Gslv := "XXXXXXXXXXXXXXXXXXXX"
Definition: Gtp7Core.vhd:98
RXLPM_IPCM_CFG_Gbit := '0'
Definition: Gtp7Core.vhd:51
RX_BUF_EN_Gboolean := true
Definition: Gtp7Core.vhd:73
STABLE_CLOCK_PERIOD_Greal := 4.0E-9
Definition: Gtp7Core.vhd:39
out rxResetDoneOutsl
Definition: Gtp7Core.vhd:175
out rxOutClkOutsl
Definition: Gtp7Core.vhd:166
_library_ ieeeieee
Definition: GLinkTxToRx.vhd:18
PMA_RSV_Gbit_vector := x"00000333"
Definition: Gtp7Core.vhd:47
SIM_VERSION_Gstring := "4.0"
TX_8B10B_EN_Gboolean := true
Definition: Gtp7Core.vhd:60
RX_INT_DATA_WIDTH_Ginteger := 20
Definition: Gtp7Core.vhd:63
RX_CLK25_DIV_Ginteger := 5
Definition: Gtp7Core.vhd:45
TXOUT_DIV_Ginteger := 2
Definition: Gtp7Core.vhd:44
DATA_WIDTH_Ginteger range 1 to ( 2** 24):= 16
out txResetDoneOutsl
Definition: Gtp7Core.vhd:204
std_logic_vector slv
Definition: StdRtlPkg.vhd:29
RX_8B10B_EN_Gboolean := true
Definition: Gtp7Core.vhd:64