3 use IEEE.STD_LOGIC_1164.
ALL;
4 use ieee.std_logic_unsigned.
all;
9 use UNISIM.VComponents.
all;
12 Port ( sys_reset : in ;
-- active high reset of all logic but GTX
16 LinkWe : in (1 downto 0);
17 LinkCtrl : in (1 downto 0);
18 LinkData : in array2x64;
20 LinkDown : out (1 downto 0);
21 LinkFull : out (1 downto 0);
23 sync_loss : out (1 downto 0);
-- goes to '1' (rxusrclk) when SERDES is out of synch
24 status_ce : in (1 downto 0);
-- not implemented yet
25 status_addr : in (15 downto 0);
-- not implemented yet
26 status_port : out array2x64;
-- first 32 bits are hard-wired
28 txusrclk_o : out ;
-- reconstructed tx clock, to be used to clock sending circuitry
29 rxusrclk_o : out ;
-- reconstructed rx clock, to be used to clock receiving circuitry
31 gtx_reset : in ;
-- full reset of GTX only
32 gtx_refclk : in ;
-- iob for refclk neg
33 sfp_rxn : in (1 downto 0);
-- sfp iobs
34 sfp_rxp : in (1 downto 0);
35 sfp_txn : out (1 downto 0);
36 sfp_txp : out (1 downto 0)
44 signal gtx_txfsmresetdone : (1 downto 0);
45 signal gtx_rxfsmresetdone : (1 downto 0);
46 signal gtx_data_valid: (1 downto 0);
47 signal sys_reset_bar : ;
48 signal txusrclk, txusrclk2 : ;
49 --signal txdll_locked, rxdll_locked, dll_reset, rxdll_reset, txdll_reset, txplllkdet, rxplllkdet: ;
50 --signal txclkfromserdes, rxclkfromserdes, rxclkfromserdes_bufg : ;
51 signal serdes_in_sync : (1 downto 0);
52 signal txdata, rxdata : array2x32;
53 signal rxcharisk, txcharisk, rxchariscomma, gtx_rxnotintable : array2x4;
54 --signal rxlossofsync : (1 downto 0);
55 --signal rxbufstatus : (2 downto 0);
56 signal rxbyteisaligned, rxenrealign, rxbyterealign, rxcommadet : (1 downto 0);
57 --signal gtxrefclk, drp_clk : ;
58 signal gtx_cpllfbclklost, gtx_cplllock, gtx_cpllrefclklost : ;
59 signal gtx_rxresetdone, gtx_txresetdone : (1 downto 0);
60 signal gtx_qplllock, gtx_qpllrefclklost : ;
61 signal gtx_rxcdrlock, gtx_rxcdrlock_is_stable : (1 downto 0);
62 signal stable_count : array2x16 ;
63 signal data_valid_cnt : array2x9 ;
64 signal serdes_status : array2x32 := (others => (others => '0'));
65 signal gtx_rxbyteisaligned_is_stable : (1 downto 0);
73 LINKData :
IN (
63 downto 0);
74 src_ID :
IN (
15 downto 0);
75 inject_err :
IN (
17 downto 0);
77 Addr :
IN (
15 downto 0);
81 SD_Data_i :
IN (
31 downto 0);
82 SD_Kb_i :
IN (
3 downto 0);
83 status_data :
OUT (
63 downto 0);
86 SD_Data_o :
OUT (
31 downto 0);
87 SD_Kb_o :
OUT (
3 downto 0);
88 Serdes_status :
in (
31 downto 0)
100 data_valid :
IN (
1 downto 0);
101 sfp_rxp :
IN (
1 downto 0);
102 sfp_rxn :
IN (
1 downto 0);
103 rxmcommaalignen :
IN (
1 downto 0);
104 rxpcommaalignen :
IN (
1 downto 0);
105 txcharisk :
IN array2x4;
106 txdata :
IN array2x32;
107 txfsmresetdone :
OUT (
1 downto 0);
108 rxfsmresetdone :
OUT (
1 downto 0);
109 rxcdrlock :
OUT (
1 downto 0);
110 rxnotintable :
OUT array2x4;
111 rxbyteisaligned :
OUT (
1 downto 0);
112 rxbyterealign :
OUT (
1 downto 0);
113 rxcommadet :
OUT (
1 downto 0);
114 rxchariscomma :
OUT array2x4;
115 rxcharisk :
OUT array2x4;
116 rxresetdone :
OUT (
1 downto 0);
117 txresetdone :
OUT (
1 downto 0);
118 rxdata :
OUT array2x32;
119 sfp_txp :
OUT (
1 downto 0);
120 sfp_txn :
OUT (
1 downto 0)
125 txusrclk2 <= txusrclk;
126 g_SLINK_opt : for i in 0 to 1 generate
131 reset => sys_reset_bar,
-- needs an active low reset
135 -- DATA interface from FED
138 LINKWe =>
not LinkWe
(i
),
139 LINKCtrl => LinkCtrl
(i
),
140 LINKData => LinkData
(i
),
142 inject_err =>
(others =>'0'
),
144 Addr => status_addr ,
145 status_data => status_port
(i
),
146 LINKDown => LinkDown
(i
),
147 LINK_LFF => LinkFull
(i
),
151 clock => txusrclk2,
-- clk tx from SERDES
152 serdes_init => serdes_in_sync
(i
),
-- status that comes back from GTX
153 SD_Data_o => TXDATA
(i
),
-- data sent to serdes (32 )
154 SD_Kb_o => TXCHARISK
(i
),
-- control K associated to SD_Data_o (4 bits)
155 clock_r => txusrclk2,
-- reconstructed clock from SERDES
156 SD_Data_i => RXDATA
(i
),
-- return data from SERDES 32
157 SD_Kb_i => RXCHARISK
(i
),
-- return control K associated to SD_Data_i (4 bits)
158 serdes_status => serdes_status
(i
)
162 refclk => gtx_refclk,
165 txusrclk_out => txusrclk,
166 qplllock => gtx_qplllock,
167 gtx_reset => gtx_reset,
168 data_valid => gtx_data_valid,
171 txfsmresetdone => gtx_txfsmresetdone ,
172 rxfsmresetdone => gtx_rxfsmresetdone ,
173 rxcdrlock => gtx_rxcdrlock,
174 rxnotintable => gtx_rxnotintable ,
175 rxmcommaalignen => rxenrealign,
176 rxpcommaalignen => rxenrealign,
177 rxbyteisaligned => rxbyteisaligned ,
178 rxbyterealign => rxbyterealign ,
179 rxcommadet => rxcommadet,
180 rxchariscomma => rxchariscomma ,
181 rxcharisk => rxcharisk,
182 rxresetdone => gtx_rxresetdone ,
183 txresetdone => gtx_txresetdone ,
184 txcharisk => txcharisk,
192 txusrclk_o <= txusrclk;
193 rxusrclk_o <= txusrclk;
194 sys_reset_bar <= not(sys_reset);
200 if txusrclk='1' and txusrclk'event then
202 if rxbyteisaligned(i)='0' then
203 stable_count(i) <= (others => '0');
204 gtx_rxbyteisaligned_is_stable(i) <='0';
206 stable_count(i) <= stable_count(i) + 1;
207 if stable_count(i) = x"ffff" then
208 gtx_rxbyteisaligned_is_stable(i) <= '1';
211 if(gtx_rxnotintable(i) /= x"0")then
212 gtx_data_valid(i) <= '0';
213 data_valid_cnt(i) <= (others => '0');
215 if(data_valid_cnt(i)(8) = '1')then
216 gtx_data_valid(i) <= '1';
218 data_valid_cnt(i) <= data_valid_cnt(i) + 1;
222 serdes_in_sync <= gtx_rxfsmresetdone and gtx_txfsmresetdone and gtx_rxbyteisaligned_is_stable;
223 sync_loss <= not(serdes_in_sync);
224 rxenrealign <= not(rxbyteisaligned);
232 g_status : for i in 0 to 1 generate
233 serdes_status(i)(0) <= gtx_qplllock;
234 serdes_status(i)(1) <= gtx_qpllrefclklost;
235 serdes_status(i)(2) <= gtx_txresetdone(i);
236 serdes_status(i)(3) <= gtx_rxresetdone(i);
238 serdes_status(i)(4) <= gtx_rxcdrlock(i);
239 serdes_status(i)(5) <= rxbyteisaligned(i);
240 serdes_status(i)(6) <= rxbyterealign(i);
241 serdes_status(i)(7) <= rxcommadet(i);
243 serdes_status(i)(11 downto 8) <= rxchariscomma(i);
244 serdes_status(i)(15 downto 12) <= rxcharisk(i);
246 serdes_status(i)(16) <= gtx_cpllfbclklost;
247 serdes_status(i)(17) <= gtx_cplllock;
248 serdes_status(i)(18) <= gtx_cpllrefclklost;
249 serdes_status(i)(31 downto 19) <= (others => '0');
251 gtx_cpllfbclklost <= '0';
253 gtx_cpllrefclklost <= '0';
254 gtx_qpllrefclklost <= '0';