SURF  1.0
PrbsPkg.vhd
Go to the documentation of this file.
1 -------------------------------------------------------------------------------
2 -- File : PrbsPkg.vhd
3 -- Company : SLAC National Accelerator Laboratory
4 -- Created : 2013-12-10
5 -- Last update: 2014-01-22
6 -------------------------------------------------------------------------------
7 -- Description: PseudoRandom Binary Sequence (PRBS) Package
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 
24 package PrbsPkg is
25 --! @file
26  --! @ingroup base_general
27 
28  -- Randomizers based on the ITU-T O.150 Standard
29  function getPrbs1xTap (input : slv; tap0 : natural) return slv;
30  function getPrbs2xTap (input : slv; tap0, tap1 : natural) return slv;
31  function getPrbs3xTap (input : slv; tap0, tap1, tap2 : natural) return slv;
32  function getPrbs4xTap (input : slv; tap0, tap1, tap2, tap3 : natural) return slv;
33  function getGaloisPrbs4xTap (input : slv; tap0, tap1, tap2, tap3 : natural) return slv;
34 
35  -- Randomizer based LTC2270 IC
36  function getXorRand (input : slv; tap : natural) return slv; -- NOTE: same function for encoding and decoding
37 
38 end PrbsPkg;
39 
40 package body PrbsPkg is
41 -------------------------------------------------------------------------------
42  function getPrbs1xTap (input : slv; tap0 : natural) return slv is
43  variable retVar : slv(input'left downto 0) := (others => '0');
44  begin
45 
46  --check for a valid tap location
47  assert (tap0 <= input'left) report "PrbsPkg: getPrbs1xTap's tap0 input is out of range" severity failure;
48 
49  -- shift register
50  for i in (input'left - 1) downto 0 loop
51  retVar(i) := input(i+1);
52  end loop;
53 
54  -- calculate the "xor'd" feedback
55  retVar(input'left) := input(0) xor input(tap0);
56 
57  --return the result
58  return retVar;
59 
60  end function;
61 -------------------------------------------------------------------------------
62  function getPrbs2xTap (input : slv; tap0, tap1 : natural) return slv is
63  variable retVar : slv(input'left downto 0) := (others => '0');
64  begin
65 
66  --check for a valid tap location
67  assert (tap0 <= input'left) report "PrbsPkg: getPrbs2xTap's tap0 input is out of range" severity failure;
68  assert (tap1 <= input'left) report "PrbsPkg: getPrbs2xTap's tap1 input is out of range" severity failure;
69 
70  -- shift register
71  for i in (input'left - 1) downto 0 loop
72  retVar(i) := input(i+1);
73  end loop;
74 
75  -- calculate the "xor'd" feedback
76  retVar(input'left) := input(0) xor input(tap0) xor input(tap1);
77 
78  --return the result
79  return retVar;
80 
81  end function;
82 -------------------------------------------------------------------------------
83  function getPrbs3xTap (input : slv; tap0, tap1, tap2 : natural) return slv is
84  variable retVar : slv(input'left downto 0) := (others => '0');
85  begin
86 
87  --check for a valid tap location
88  assert (tap0 <= input'left) report "PrbsPkg: getPrbs3xTap's tap0 input is out of range" severity failure;
89  assert (tap1 <= input'left) report "PrbsPkg: getPrbs3xTap's tap1 input is out of range" severity failure;
90  assert (tap2 <= input'left) report "PrbsPkg: getPrbs3xTap's tap2 input is out of range" severity failure;
91 
92  -- shift register
93  for i in (input'left - 1) downto 0 loop
94  retVar(i) := input(i+1);
95  end loop;
96 
97  -- calculate the "xor'd" feedback
98  retVar(input'left) := input(0) xor input(tap0) xor input(tap1) xor input(tap2);
99 
100  --return the result
101  return retVar;
102 
103  end function;
104 -------------------------------------------------------------------------------
105  function getPrbs4xTap (input : slv; tap0, tap1, tap2, tap3 : natural) return slv is
106  variable retVar : slv(input'left downto 0) := (others => '0');
107  begin
108 
109  --check for a valid tap location
110  assert (tap0 <= input'left) report "PrbsPkg: getPrbs3xTap's tap0 input is out of range" severity failure;
111  assert (tap1 <= input'left) report "PrbsPkg: getPrbs3xTap's tap1 input is out of range" severity failure;
112  assert (tap2 <= input'left) report "PrbsPkg: getPrbs3xTap's tap2 input is out of range" severity failure;
113  assert (tap3 <= input'left) report "PrbsPkg: getPrbs3xTap's tap3 input is out of range" severity failure;
114 
115  -- shift register
116  for i in (input'left - 1) downto 0 loop
117  retVar(i) := input(i+1);
118  end loop;
119 
120  -- calculate the "xor'd" feedback
121  retVar(input'left) := input(tap0) xor input(tap1) xor input(tap2) xor input(tap3);
122 
123  --return the result
124  return retVar;
125 
126  end function;
127 -------------------------------------------------------------------------------
128  function getGaloisPrbs4xTap (input : slv; tap0, tap1, tap2, tap3 : natural) return slv is
129  variable retVar : slv(input'left downto 0) := (others => '0');
130  begin
131 
132  --check for a valid tap location
133  assert (tap0 <= input'left) report "PrbsPkg: getGaloisPrbs3xTap's tap0 input is out of range" severity failure;
134  assert (tap1 <= input'left) report "PrbsPkg: getGaloisPrbs3xTap's tap1 input is out of range" severity failure;
135  assert (tap2 <= input'left) report "PrbsPkg: getGaloisPrbs3xTap's tap2 input is out of range" severity failure;
136  assert (tap3 <= input'left) report "PrbsPkg: getGaloisPrbs3xTap's tap3 input is out of range" severity failure;
137 
138  -- shift register
139  for i in 0 to (input'left-1) loop
140  retVar(i) := input(i+1);
141  end loop;
142  retVar(retVar'left) := '0';
143 
144  for i in 0 to (input'left) loop
145  if (i = tap0 or i = tap1 or i = tap2 or i = tap3) then
146  retVar(i) := retVar(i) xor input(0);
147  end if;
148  end loop;
149 
150  --return the result
151  return retVar;
152 
153  end function;
154 -------------------------------------------------------------------------------
155  function getXorRand (input : slv; tap : natural) return slv is -- NOTE: same function for encoding and decoding
156  variable retVar : slv(input'left downto 0) := (others => '0');
157  begin
158 
159  --check for a valid tap location
160  assert (tap <= input'left) report "PrbsPkg: getXorRand's tap input is out of range" severity failure;
161 
162  -- Encoder/Decoder
163  for i in input'left downto 0 loop
164  if i = tap then
165  retVar(i) := input(i);
166  else
167  retVar(i) := input(i) xor input(tap);
168  end if;
169  end loop;
170 
171  --return the result
172  return retVar;
173 
174  end function;
175 -------------------------------------------------------------------------------
176 end package body PrbsPkg;
slv getPrbs1xTapinput,tap0,
Definition: PrbsPkg.vhd:29
_library_ ieeeieee
Definition: Heartbeat.vhd:18
slv getPrbs2xTapinput,tap0,tap1,tap0,tap1,
Definition: PrbsPkg.vhd:30
slv getXorRandinput,tap,
Definition: PrbsPkg.vhd:36
slv getGaloisPrbs4xTapinput,tap0,tap1,tap2,tap3,tap0,tap1,tap2,tap3,tap0,tap1,tap2,tap3,tap0,tap1,tap2,tap3,
Definition: PrbsPkg.vhd:33
slv getPrbs4xTapinput,tap0,tap1,tap2,tap3,tap0,tap1,tap2,tap3,tap0,tap1,tap2,tap3,tap0,tap1,tap2,tap3,
Definition: PrbsPkg.vhd:32
slv getPrbs3xTapinput,tap0,tap1,tap2,tap0,tap1,tap2,tap0,tap1,tap2,
Definition: PrbsPkg.vhd:31
std_logic_vector slv
Definition: StdRtlPkg.vhd:29