AMC13
Firmwares for the different applications of the AMC13 uTCA board made at Boston University
 All Classes Files Variables
DaqLSCXG.vhd
1 
2 library IEEE;
3 use IEEE.STD_LOGIC_1164.ALL;
4 use ieee.std_logic_unsigned.all;
5 use work.amc13_pack.all;
6 use work.mydefs.all;
7 
8 
9 library UNISIM;
10 use UNISIM.VComponents.all;
11 
12 entity DaqLSCXG is
13  Port ( sys_reset : in STD_LOGIC; -- active high reset of all logic but GTX
14  sys_clk : in STD_LOGIC;
15  sfp_pd : in array3x2;
16  DRP_clk : in STD_LOGIC;
17  LinkWe : in STD_LOGIC_VECTOR (2 downto 0);
18  LinkCtrl : in STD_LOGIC_VECTOR (2 downto 0);
19  LinkData : in array3x64;
20  srcID : in array3x16;
21  LinkDown : out STD_LOGIC_VECTOR (2 downto 0);
22  LinkFull : out STD_LOGIC_VECTOR (2 downto 0);
23  --
24 -- ack_cnt : out STD_LOGIC_VECTOR (2 downto 0); -- 1 ck pulse (txusrclk) indicating a received acknowledge
25 -- pckt_cnt : out STD_LOGIC_VECTOR (2 downto 0); -- 1 ck pulse (txusrclk) indicating a transmit packet
26 -- retransmit_cnt : out STD_LOGIC_VECTOR (2 downto 0); -- 1 ck pulse (txusrclk) indicating a retransmit packet
27 -- event_cnt : out STD_LOGIC_VECTOR (2 downto 0); -- 1 ck pulse (sys_clk) indicating a sent event
28  sync_loss : out STD_LOGIC_VECTOR (2 downto 0); -- goes to '1' (rxusrclk) when SERDES is out of synch
29  status_ce : in std_logic_VECTOR (2 downto 0); -- not implemented yet
30  status_addr : in STD_LOGIC_VECTOR (15 downto 0); -- not implemented yet
31  status_port : out array3x64; -- first 32 bits are hard-wired
32  --
33  txusrclk_o : out STD_LOGIC; -- reconstructed tx clock, to be used to clock sending circuitry
34  rxusrclk_o : out STD_LOGIC; -- reconstructed rx clock, to be used to clock receiving circuitry
35  --
36  gtx_reset : in std_logic; -- full reset of GTX only
37  gtx_refclk_p : in std_logic; -- iob for refclk neg
38  gtx_refclk_n : in std_logic; -- iob for refclk neg
39  sfp_rxn : in std_logic_VECTOR (2 downto 0); -- sfp iobs
40  sfp_rxp : in std_logic_VECTOR (2 downto 0);
41  sfp_txn : out std_logic_VECTOR (2 downto 0);
42  sfp_txp : out std_logic_VECTOR (2 downto 0)
43  );
44 end DaqLSCXG;
45 
46 architecture Behavioral of DaqLSCXG is
47 
48 -- Local signals
49 
50 signal gtx_txfsmresetdone : std_logic_vector(2 downto 0);
51 signal gtx_rxfsmresetdone : std_logic_vector(2 downto 0);
52 signal gtx_data_valid: std_logic_vector(2 downto 0);
53 signal sys_reset_bar : std_logic;
54 signal txusrclk, txusrclk2 : std_logic;
55 --signal txdll_locked, rxdll_locked, dll_reset, rxdll_reset, txdll_reset, txplllkdet, rxplllkdet: std_logic;
56 --signal txclkfromserdes, rxclkfromserdes, rxclkfromserdes_bufg : std_logic;
57 signal serdes_in_sync : std_logic_vector(2 downto 0);
58 signal txdata, rxdata : array3x32;
59 signal rxcharisk, txcharisk, rxchariscomma, gtx_rxnotintable : array3x4;
60 --signal rxlossofsync : std_logic_vector(1 downto 0);
61 --signal rxbufstatus : std_logic_vector(2 downto 0);
62 signal rxbyteisaligned, rxenrealign, rxbyterealign, rxcommadet : std_logic_vector(2 downto 0);
63 --signal gtxrefclk, drp_clk : std_logic;
64 signal gtx_cpllfbclklost, gtx_cplllock, gtx_cpllrefclklost : std_logic;
65 signal gtx_rxresetdone, gtx_txresetdone : std_logic_vector(2 downto 0);
66 signal gtx_qpllrefclklost : std_logic;
67 signal gtx_qplllock : std_logic;
68 
69 signal gtx_rxbyteisaligned_is_stable : std_logic_vector(2 downto 0);
70 signal gtx_rxcdrlock : std_logic_vector(2 downto 0);
71 signal stable_count : array3x16 ;
72 signal data_valid_cnt : array3x9 ;
73 signal serdes_status : array3x32 := (others => (others => '0'));
74 
75 COMPONENT SLINK_opt
76  PORT(
77  reset : IN std_logic;
78  SYS_CLK : IN std_logic;
79  LINKWe : IN std_logic;
80  LINKCtrl : IN std_logic;
81  LINKData : IN std_logic_vector(63 downto 0);
82  src_ID : IN std_logic_vector(15 downto 0);
83  inject_err : IN std_logic_vector(17 downto 0);
84  read_CE : IN std_logic;
85  Addr : IN std_logic_vector(15 downto 0);
86  clock : IN std_logic;
87  serdes_init : IN std_logic;
88  clock_r : IN std_logic;
89  SD_Data_i : IN std_logic_vector(31 downto 0);
90  SD_Kb_i : IN std_logic_vector(3 downto 0);
91  status_data : OUT std_logic_vector(63 downto 0);
92  LINKDown : OUT std_logic;
93  LINK_LFF : OUT std_logic;
94  SD_Data_o : OUT std_logic_vector(31 downto 0);
95  SD_Kb_o : OUT std_logic_vector(3 downto 0);
96  Serdes_status : in std_logic_vector(31 downto 0)
97 -- ack_cnt : OUT std_logic;
98 -- pckt_cnt : OUT std_logic;
99 -- retransmit : OUT std_logic;
100 -- cnt_evt : OUT std_logic
101  );
102 END COMPONENT;
103 
104 COMPONENT serdes5_wrapper
105  PORT(
106  refclk : IN std_logic;
107  DRPclk : IN std_logic;
108  sfp_pd : IN array3x2;
109  txusrclk_out : OUT std_logic;
110  qplllock : OUT std_logic;
111  gtx_reset : IN std_logic;
112  data_valid : IN std_logic_vector(2 downto 0);
113  sfp_rxp : IN std_logic_vector(2 downto 0);
114  sfp_rxn : IN std_logic_vector(2 downto 0);
115  rxmcommaalignen : IN std_logic_vector(2 downto 0);
116  rxpcommaalignen : IN std_logic_vector(2 downto 0);
117  txcharisk : IN array3x4;
118  txdata : IN array3x32;
119  txfsmresetdone : OUT std_logic_vector(2 downto 0);
120  rxfsmresetdone : OUT std_logic_vector(2 downto 0);
121  rxcdrlock : OUT std_logic_vector(2 downto 0);
122  rxnotintable : OUT array3x4;
123  rxbyteisaligned : OUT std_logic_vector(2 downto 0);
124  rxbyterealign : OUT std_logic_vector(2 downto 0);
125  rxcommadet : OUT std_logic_vector(2 downto 0);
126  rxchariscomma : OUT array3x4;
127  rxcharisk : OUT array3x4;
128  rxresetdone : OUT std_logic_vector(2 downto 0);
129  txresetdone : OUT std_logic_vector(2 downto 0);
130  rxdata : OUT array3x32;
131  sfp_txp : OUT std_logic_vector(2 downto 0);
132  sfp_txn : OUT std_logic_vector(2 downto 0)
133  );
134 END COMPONENT;
135 
136 begin
137 txusrclk2 <= txusrclk;
138 g_SLINK_opt : for i in 0 to 2 generate
139  Inst_SLINK_opt: SLINK_opt
140  PORT MAP(
141 
142 -- FROM FED logic
143  reset => sys_reset_bar, -- needs an active low reset
144  SYS_CLK => sys_clk,
145 
146 
147 -- DATA interface from FED
148 
149 
150  LINKWe => not LinkWe (i),
151  LINKCtrl => LinkCtrl(i),
152  LINKData => LinkData(i),
153  src_ID => srcID(i),
154  inject_err => (others =>'0'),
155  read_CE => '0',
156  Addr => status_addr ,
157  status_data => status_port (i),
158  LINKDown => LinkDown(i),
159  LINK_LFF => LinkFull(i),
160 
161 -- SERDES interface
162 
163  clock => txusrclk2, -- clk tx from SERDES
164  serdes_init => serdes_in_sync (i), -- status that comes back from GTX
165  SD_Data_o => TXDATA(i), -- data sent to serdes (32 bit)
166  SD_Kb_o => TXCHARISK(i), -- control K associated to SD_Data_o (4 bits)
167  clock_r => txusrclk2, -- reconstructed clock from SERDES
168  SD_Data_i => RXDATA(i), -- return data from SERDES 32 bit
169  SD_Kb_i => RXCHARISK(i), -- return control K associated to SD_Data_i (4 bits)
170  serdes_status => serdes_status (i)
171 -- Status for user logic (to be removed later)
172 
173 -- ack_cnt => ack_cnt(i), -- pulse indicating a received acknoledge
174 -- pckt_cnt => pckt_cnt(i), -- pulse indicating a transmit packet
175 -- retransmit => retransmit_cnt(i), -- pulse indicating a retransmit packet
176 -- cnt_evt => event_cnt(i) -- pulse indicating a sent event
177 );
178 end generate;
179 i_serdes5_wrapper: serdes5_wrapper PORT MAP(
180  refclk => gtx_refclk_p,
181  DRPclk => DRP_clk,
182  sfp_pd => sfp_pd,
183  txusrclk_out => txusrclk,
184  qplllock => gtx_qplllock,
185  gtx_reset => gtx_reset,
186  data_valid => gtx_data_valid,
187  sfp_rxp => sfp_rxp,
188  sfp_rxn => sfp_rxn,
189  txfsmresetdone => gtx_txfsmresetdone ,
190  rxfsmresetdone => gtx_rxfsmresetdone ,
191  rxcdrlock => gtx_rxcdrlock,
192  rxnotintable => gtx_rxnotintable ,
193  rxmcommaalignen => rxenrealign,
194  rxpcommaalignen => rxenrealign,
195  rxbyteisaligned => rxbyteisaligned ,
196  rxbyterealign => rxbyterealign ,
197  rxcommadet => rxcommadet,
198  rxchariscomma => rxchariscomma ,
199  rxcharisk => rxcharisk,
200  rxresetdone => gtx_rxresetdone ,
201  txresetdone => gtx_txresetdone ,
202  txcharisk => txcharisk,
203  txdata => txdata,
204  rxdata => rxdata,
205  sfp_txp => sfp_txp,
206  sfp_txn => sfp_txn
207  );
208 
209 
210 txusrclk_o <= txusrclk;
211 rxusrclk_o <= txusrclk;
212 sys_reset_bar <= not(sys_reset);
213 
214 
215 
216 process (txusrclk)
217 begin
218  if txusrclk='1' and txusrclk'event then
219  for i in 0 to 2 loop
220  if rxbyteisaligned(i)='0' then
221  stable_count(i) <= (others => '0');
222  gtx_rxbyteisaligned_is_stable(i) <='0';
223  else
224  stable_count(i) <= stable_count(i) + 1;
225  if stable_count(i) = x"ffff" then
226  gtx_rxbyteisaligned_is_stable(i) <= '1';
227  end if;
228  end if;
229 
230  if(gtx_rxnotintable(i) /= x"0")then
231  gtx_data_valid(i) <= '0';
232  data_valid_cnt(i) <= (others => '0');
233  else
234  if(data_valid_cnt(i)(8) = '1')then
235  gtx_data_valid(i) <= '1';
236  else
237  data_valid_cnt(i) <= data_valid_cnt(i) + 1;
238  end if;
239  end if;
240  end loop;
241  serdes_in_sync <= gtx_rxfsmresetdone and gtx_txfsmresetdone and gtx_rxbyteisaligned_is_stable;
242  sync_loss <= not(serdes_in_sync);
243  rxenrealign <= not(rxbyteisaligned);
244  end if;
245 end process;
246 
247 
248 --serdes_in_sync <= gtx_rxfsmresetdone and gtx_txfsmresetdone and gtx_rxcdrlock_is_stable;
249 --
250 --sync_loss <= not(serdes_in_sync);
251 --
252 --rxenrealign <= not(rxbyteisaligned);
253 g_status : for i in 0 to 2 generate
254  serdes_status(i)(0) <= gtx_qplllock;
255  serdes_status(i)(1) <= gtx_qpllrefclklost;
256  serdes_status(i)(2) <= gtx_txresetdone(i);
257  serdes_status(i)(3) <= gtx_rxresetdone(i);
258 
259  serdes_status(i)(4) <= gtx_rxcdrlock(i);
260  serdes_status(i)(5) <= rxbyteisaligned(i);
261  serdes_status(i)(6) <= rxbyterealign(i);
262  serdes_status(i)(7) <= rxcommadet(i);
263 
264  serdes_status(i)(11 downto 8) <= rxchariscomma(i);
265  serdes_status(i)(15 downto 12) <= rxcharisk(i);
266 
267  serdes_status(i)(16) <= gtx_cpllfbclklost;
268  serdes_status(i)(17) <= gtx_cplllock;
269  serdes_status(i)(18) <= gtx_cpllrefclklost;
270  serdes_status(i)(31 downto 19) <= (others => '0');
271 end generate;
272 gtx_cpllfbclklost <= '0';
273 gtx_cplllock <= '1';
274 gtx_cpllrefclklost <= '0';
275 gtx_qpllrefclklost <= '0';
276 
277 
278 
279 end Behavioral;
280