1 ------------------------------------------------------------------------------- 2 -- File : Jesd204bPkg.vhd 3 -- Company : SLAC National Accelerator Laboratory 4 -- Created : 2016-07-11 5 -- Last update: 2017-07-06 6 ------------------------------------------------------------------------------- 7 -- Description: JESD204B Package File 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 ------------------------------------------------------------------------------- 19 use ieee.std_logic_1164.
all;
26 --! @ingroup protocols_jesd204b 28 -- Constant definitions 29 -------------------------------------------------------------------------- 30 -- Number of bytes in MGT word (2 or 4). 33 -- 8B10B characters (8-bit values) 43 -- Register or counter widths 48 -- AXI packet size at power up 53 -- Ramp step or square wave period slv width (max 16) 56 -- Scrambler/Descrambler PBRS taps for 1 + x^14 + x^15 60 -------------------------------------------------------------------------- 71 data => (others => '0'), 72 dataK => (others => '0'), 84 data => (others => '0'), 85 dataK => (others => '0'));
98 -------------------------------------------------------------------------- 102 -- Output variable index from SLV (use in variable length shift register) 105 -- Detect position of first non K character (Swapped) 108 -- Detect position of first non K character 111 -- Byte swap slv (bytes int 2 or 4) 114 -- Swap little and big endians (bytes int 2 or 4) 117 -- Align the data within the data buffer according to the position of the byte alignment word 120 -- Align the character within the buffer according to the position of the byte alignment word 123 -- Convert standard logic vector to integer 126 -- Convert integer to standard logic vector 127 function intToSlv(data_int : ; bytes_int : positive)
return ;
129 -- Output offset binary zero 139 dataIn :
in slv(
15 downto 0);
140 lfsrIn :
in slv(
14 downto 0);
141 dataOut :
inout slv(
15 downto 0);
142 lfsrOut :
inout slv(
14 downto 0));
149 -------------------------------------------------------------------------- 150 -- Detect K character 153 if(bytes_int =
2) then 154 if(data_slv
(7 downto 0) =
K_CHAR_C and 155 data_slv
(15 downto 8) =
K_CHAR_C and 156 charisk_slv =
(charisk_slv'
range => '
1'
) 162 elsif(bytes_int =
4) then 163 if(data_slv
(7 downto 0) =
K_CHAR_C and 164 data_slv
(15 downto 8) =
K_CHAR_C and 165 data_slv
(23 downto 16) =
K_CHAR_C and 166 data_slv
(31 downto 24) =
K_CHAR_C and 167 charisk_slv =
(charisk_slv'
range => '
1'
) 178 -- Output variable index from SLV (use in variable length shift register) 183 i := to_integer
((index_slv
));
188 -- Detect position of first non K character 191 -- GT word is 2 bytes 192 if(bytes_int =
2) then 193 if(data_slv
(7 downto 0) /=
K_CHAR_C and 197 elsif(data_slv
(7 downto 0) /=
K_CHAR_C and 198 data_slv
(15 downto 8) =
K_CHAR_C and 205 -- GT word is 4 bytes wide 206 elsif(bytes_int =
4) then 207 if(data_slv
(7 downto 0) /=
K_CHAR_C and 208 data_slv
(15 downto 8) /=
K_CHAR_C and 209 data_slv
(23 downto 16) /=
K_CHAR_C and 213 elsif(data_slv
(7 downto 0) /=
K_CHAR_C and 214 data_slv
(15 downto 8) /=
K_CHAR_C and 215 data_slv
(23 downto 16) /=
K_CHAR_C and 216 data_slv
(31 downto 24) =
K_CHAR_C and 220 elsif(data_slv
(7 downto 0) /=
K_CHAR_C and 221 data_slv
(15 downto 8) /=
K_CHAR_C and 222 data_slv
(23 downto 16) =
K_CHAR_C and 223 data_slv
(31 downto 24) =
K_CHAR_C and 224 charisk_slv
(3 downto 2) =
"11" 227 elsif(data_slv
(7 downto 0) /=
K_CHAR_C and 228 data_slv
(15 downto 8) =
K_CHAR_C and 229 data_slv
(23 downto 16) =
K_CHAR_C and 230 data_slv
(31 downto 24) =
K_CHAR_C and 231 charisk_slv
(3 downto 1) =
"111" 238 return (bytes_int-
1 downto 0 => '
1'
);
243 -- Detect position of first non K character (Swapped bits/bytes) 246 -- GT word is 2 bytes 247 if(bytes_int =
2) then 248 if(data_slv
(7 downto 0) /=
K_CHAR_C and 252 elsif(data_slv
(7 downto 0) =
K_CHAR_C and 253 data_slv
(15 downto 8) /=
K_CHAR_C and 260 -- GT word is 4 bytes wide 261 elsif(bytes_int =
4) then 262 if(data_slv
(7 downto 0) /=
K_CHAR_C and 263 data_slv
(15 downto 8) /=
K_CHAR_C and 264 data_slv
(23 downto 16) /=
K_CHAR_C and 268 elsif(data_slv
(7 downto 0) =
K_CHAR_C and 269 data_slv
(15 downto 8) /=
K_CHAR_C and 270 data_slv
(23 downto 16) /=
K_CHAR_C and 271 data_slv
(31 downto 24) /=
K_CHAR_C and 275 elsif(data_slv
(7 downto 0) =
K_CHAR_C and 276 data_slv
(15 downto 8) =
K_CHAR_C and 277 data_slv
(23 downto 16) /=
K_CHAR_C and 278 data_slv
(31 downto 24) /=
K_CHAR_C and 279 charisk_slv
(1 downto 0) =
"11" 282 elsif(data_slv
(7 downto 0) =
K_CHAR_C and 283 data_slv
(15 downto 8) =
K_CHAR_C and 284 data_slv
(23 downto 16) =
K_CHAR_C and 285 data_slv
(31 downto 24) /=
K_CHAR_C and 286 charisk_slv
(2 downto 0) =
"111" 293 return (bytes_int-
1 downto 0 => '
1'
);
295 end detectPosFuncSwap;
297 -- Byte swap slv (bytes int 2 or 4) 301 if(bytes_int =
2) then 302 return data_slv
(7 downto 0) & data_slv
(15 downto 8);
303 elsif(bytes_int =
4) then 304 return data_slv
(7 downto 0) & data_slv
(15 downto 8) & data_slv
(23 downto 16) & data_slv
(31 downto 24);
310 -- Swap little or big endian (bytes int 2 or 4) 314 if(bytes_int =
2) then 316 elsif(bytes_int =
4) then 317 return data_slv
(15 downto 0) & data_slv
(31 downto 16);
323 -- Align the data within the data buffer according to the position of the byte alignment word 326 if(bytes_int =
2) then 327 if (position_slv
(1 downto 0) =
"01") then 328 return data_slv
(31 downto 16);
329 elsif (position_slv
(1 downto 0) =
"10") then 330 return data_slv
(31-
8 downto 16-
8);
332 return data_slv
(31 downto 16);
334 elsif(bytes_int =
4) then 335 if (position_slv
(3 downto 0) =
"0001") then 336 return data_slv
(63 downto 32);
337 elsif (position_slv
(3 downto 0) =
"0010") then 338 return data_slv
(63-
1*
8 downto 32-
1*
8);
339 elsif (position_slv
(3 downto 0) =
"0100") then 340 return data_slv
(63-
2*
8 downto 32-
2*
8);
341 elsif (position_slv
(3 downto 0) =
"1000") then 342 return data_slv
(63-
3*
8 downto 32-
3*
8);
344 return data_slv
(63 downto 32);
351 -- Align the char within the buffer according to the position of the byte alignment word 354 if(bytes_int =
2) then 355 if (position_slv
(1 downto 0) =
"01") then 356 return char_slv
(3 downto 2);
357 elsif (position_slv
(1 downto 0) =
"10") then 358 return char_slv
(3-
1 downto 2-
1);
360 return char_slv
(3 downto 2);
362 elsif(bytes_int =
4) then 363 if (position_slv
(3 downto 0) =
"0001") then 364 return char_slv
(7 downto 4);
365 elsif (position_slv
(3 downto 0) =
"0010") then 366 return char_slv
(7-
1 downto 4-
1);
367 elsif (position_slv
(3 downto 0) =
"0100") then 368 return char_slv
(7-
2 downto 4-
2);
369 elsif (position_slv
(3 downto 0) =
"1000") then 370 return char_slv
(7-
3 downto 4-
3);
372 return char_slv
(7 downto 4);
379 -- Convert standard logic vector to integer 382 return to_integer
((data_slv
));
385 -- Convert integer to standard logic vector 386 function intToSlv(data_int : ; bytes_int : positive)
return is 388 return (to_unsigned
(data_int, bytes_int
));
391 -- Output zero sample data depending on word size and Frame size 393 constant SAMPLES_IN_WORD_C : positive :=
(bytes_int/F_int
);
394 variable vSlv :
slv((bytes_int*
8)-
1 downto 0);
397 vSlv :=
(others => '
0'
);
399 for I
in (SAMPLES_IN_WORD_C-
1) downto 0 loop 400 vSlv
(I*
8*F_int+
8*F_int-
1) := '
1';
409 variable vOutput :
(input'
range);
411 vOutput := -
(input
);
415 -- Output zero sample data depending on word size and Frame size 417 constant SAMPLES_IN_WORD_C : positive :=
(bytes_int/F_int
);
418 variable vSlv :
slv((bytes_int*
8)-
1 downto 0);
423 for I
in (SAMPLES_IN_WORD_C-
1) downto 0 loop 424 vSlv
(I*
8*F_int+
8*F_int-
1 downto I*
8*F_int
) := invSigned
(vSlv
(I*
8*F_int+
8*F_int-
1 downto I*
8*F_int
));
431 -- lfsr(14:0)=1+x^14+x^15 433 dataIn :
in slv(
15 downto 0);
434 lfsrIn :
in slv(
14 downto 0);
435 dataOut :
inout slv(
15 downto 0);
436 lfsrOut :
inout slv(
14 downto 0))
is 438 lfsrOut
(0) := lfsrIn
(0) xor lfsrIn
(1) xor lfsrIn
(2) xor lfsrIn
(3) xor lfsrIn
(4) xor lfsrIn
(5) xor lfsrIn
(6) xor lfsrIn
(7) xor lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13);
439 lfsrOut
(1) := lfsrIn
(0) xor lfsrIn
(1) xor lfsrIn
(2) xor lfsrIn
(3) xor lfsrIn
(4) xor lfsrIn
(5) xor lfsrIn
(6) xor lfsrIn
(7) xor lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
440 lfsrOut
(2) := lfsrIn
(1) xor lfsrIn
(2) xor lfsrIn
(3) xor lfsrIn
(4) xor lfsrIn
(5) xor lfsrIn
(6) xor lfsrIn
(7) xor lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
441 lfsrOut
(3) := lfsrIn
(2) xor lfsrIn
(3) xor lfsrIn
(4) xor lfsrIn
(5) xor lfsrIn
(6) xor lfsrIn
(7) xor lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
442 lfsrOut
(4) := lfsrIn
(3) xor lfsrIn
(4) xor lfsrIn
(5) xor lfsrIn
(6) xor lfsrIn
(7) xor lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
443 lfsrOut
(5) := lfsrIn
(4) xor lfsrIn
(5) xor lfsrIn
(6) xor lfsrIn
(7) xor lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
444 lfsrOut
(6) := lfsrIn
(5) xor lfsrIn
(6) xor lfsrIn
(7) xor lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
445 lfsrOut
(7) := lfsrIn
(6) xor lfsrIn
(7) xor lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
446 lfsrOut
(8) := lfsrIn
(7) xor lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
447 lfsrOut
(9) := lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
448 lfsrOut
(10) := lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
449 lfsrOut
(11) := lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
450 lfsrOut
(12) := lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
451 lfsrOut
(13) := lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
452 lfsrOut
(14) := lfsrIn
(0) xor lfsrIn
(1) xor lfsrIn
(2) xor lfsrIn
(3) xor lfsrIn
(4) xor lfsrIn
(5) xor lfsrIn
(6) xor lfsrIn
(7) xor lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(14);
454 dataOut
(0) := dataIn
(0) xor lfsrIn
(14);
455 dataOut
(1) := dataIn
(1) xor lfsrIn
(13) xor lfsrIn
(14);
456 dataOut
(2) := dataIn
(2) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
457 dataOut
(3) := dataIn
(3) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
458 dataOut
(4) := dataIn
(4) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
459 dataOut
(5) := dataIn
(5) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
460 dataOut
(6) := dataIn
(6) xor lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
461 dataOut
(7) := dataIn
(7) xor lfsrIn
(7) xor lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
462 dataOut
(8) := dataIn
(8) xor lfsrIn
(6) xor lfsrIn
(7) xor lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
463 dataOut
(9) := dataIn
(9) xor lfsrIn
(5) xor lfsrIn
(6) xor lfsrIn
(7) xor lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
464 dataOut
(10) := dataIn
(10) xor lfsrIn
(4) xor lfsrIn
(5) xor lfsrIn
(6) xor lfsrIn
(7) xor lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
465 dataOut
(11) := dataIn
(11) xor lfsrIn
(3) xor lfsrIn
(4) xor lfsrIn
(5) xor lfsrIn
(6) xor lfsrIn
(7) xor lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
466 dataOut
(12) := dataIn
(12) xor lfsrIn
(2) xor lfsrIn
(3) xor lfsrIn
(4) xor lfsrIn
(5) xor lfsrIn
(6) xor lfsrIn
(7) xor lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
467 dataOut
(13) := dataIn
(13) xor lfsrIn
(1) xor lfsrIn
(2) xor lfsrIn
(3) xor lfsrIn
(4) xor lfsrIn
(5) xor lfsrIn
(6) xor lfsrIn
(7) xor lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
468 dataOut
(14) := dataIn
(14) xor lfsrIn
(0) xor lfsrIn
(1) xor lfsrIn
(2) xor lfsrIn
(3) xor lfsrIn
(4) xor lfsrIn
(5) xor lfsrIn
(6) xor lfsrIn
(7) xor lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13) xor lfsrIn
(14);
469 dataOut
(15) := dataIn
(15) xor lfsrIn
(0) xor lfsrIn
(1) xor lfsrIn
(2) xor lfsrIn
(3) xor lfsrIn
(4) xor lfsrIn
(5) xor lfsrIn
(6) xor lfsrIn
(7) xor lfsrIn
(8) xor lfsrIn
(9) xor lfsrIn
(10) xor lfsrIn
(11) xor lfsrIn
(12) xor lfsrIn
(13);
473 end package body Jesd204bPkg;
std_logic_vector JesdCharAlignchar_slv,position_slv,bytes_int,
array(natural range <> ) of slv(( GT_WORD_SIZE_C* 8)- 1 downto 0) sampleDataArray
array(natural range <> ,natural range <> ) of slv(( GT_WORD_SIZE_C* 8)- 1 downto 0) sampleDataVectorArray
std_logic_vector invSignedinput,
positive := 16 PER_STEP_WIDTH_C
array(natural range <> ) of slv(( TX_STAT_WIDTH_C)- 1 downto 0) txStatuRegisterArray
slv( GT_WORD_SIZE_C- 1 downto 0) dataK
positive := 6 TX_STAT_WIDTH_C
array(natural range <> ) of slv(( RX_STAT_WIDTH_C)- 1 downto 0) rxStatuRegisterArray
positive := 19+ 2* GT_WORD_SIZE_C RX_STAT_WIDTH_C
slv( 23 downto 0) := x"00_01_00" AXI_PACKET_SIZE_DEFAULT_C
std_logic detKcharFuncdata_slv,charisk_slv,bytes_int,
integer slvToIntdata_slv,
std_logic_vector outSampleZeroF_int,bytes_int,
std_logic_vector endianSwapSlvdata_slv,bytes_int,
array(natural range <> ) of jesdGtTxLaneType jesdGtTxLaneTypeArray
std_logic_vector invDatadata,F_int,bytes_int,
NaturalArray :=( 0=> 14, 1=> 15) JESD_PRBS_TAPS_C
slv( 7 downto 0) := x"1C" R_CHAR_C
array(natural range <> ) of slv(( GT_WORD_SIZE_C)- 1 downto 0) alignTxArray
array(natural range <> ) of natural NaturalArray
std_logic varIndexOutFuncshft_slv,index_slv,
slv( 7 downto 0) := x"7C" A_CHAR_C
slv( 7 downto 0) := x"BC" K_CHAR_C
slv( GT_WORD_SIZE_C- 1 downto 0) dispErr
positive := 4 GT_WORD_SIZE_C
std_logic_vector byteSwapSlvdata_slv,bytes_int,
std_logic_vector intToSlvdata_int,bytes_int,
positive := 5 SYSRF_DLY_WIDTH_C
jesdScramblerdataIn,lfsrIn,dataOut,lfsrOut,
jesdGtRxLaneType :=(data =>( others => '0'),dataK =>( others => '0'),dispErr =>( others => '0'),decErr =>( others => '0'),rstDone => '0',cdrStable => '0') JESD_GT_RX_LANE_INIT_C
slv( 7 downto 0) := x"FC" F_CHAR_C
std_logic_vector detectPosFuncdata_slv,charisk_slv,bytes_int,
slv( GT_WORD_SIZE_C- 1 downto 0) decErr
std_logic_vector JesdDataAligndata_slv,position_slv,bytes_int,
array(natural range <> ) of slv(( GT_WORD_SIZE_C* 8+ GT_WORD_SIZE_C* 2)- 1 downto 0) fixLatDataArray
array(natural range <> ) of jesdGtRxLaneType jesdGtRxLaneTypeArray
slv(( GT_WORD_SIZE_C* 8)- 1 downto 0) data
jesdGtTxLaneType :=(data =>( others => '0'),dataK =>( others => '0')) JESD_GT_TX_LANE_INIT_C
std_logic_vector detectPosFuncSwapdata_slv,charisk_slv,bytes_int,