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,