PRBS(Pseudo-Random Binary Sequences)是通过LFSR和特征函数 伪随机数发生器产生的伪随机数序列,通常用于高速数字通信测试。
基本电路(单比特输出)
prbs N表示用N比特lfsr尝试伪随机数序列,常用的有N=7,9,11,15,32等。伪随机序列的长度为 2 N − 1 2^{N-1} 2N−1。 那么如何搭建电路产生这些伪随机数呢?以PRBS7,生成多项式为 G ( x ) = x 7 + x 6 + 1 G(x)=x^7 + x^6+1 G(x)=x7+x6+1,对应External Feedback LFSR电路如下图,其中1~7表示移位寄存器。
这样的电路一个周期只能产生一比特输出,如果需要每T产生伪序列中的两个,那么该如何实现?或者我想输出是6,7两个寄存器,下一拍更新时,希望是如图电路移位两拍的结果。
两比特输出
生成多项式还对应生成多项式还有对应的特征矩阵M。假设x1-7分别对应图中1~7个寄存器的输出,则下一拍x’1-7的值可以通过矩阵M,由当前拍x1-7的值得到。
[ x 7 ′ x 6 ′ x 5 ′ x 4 ′ x 3 ′ x 2 ′ x 1 ′ ] = [ 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 ] [ x 7 x 6 x 5 x 4 x 3 x 2 x 1 ] \left[ \begin{matrix} x_7' \\ x_6'\\x_5'\\x_4'\\x_3'\\x_2'\\x_1'\\ \end{matrix} \right] = \left[ \begin{matrix} 0 & 1 & 0& 0& 0& 0& 0\\ 0 & 0 & 1& 0& 0& 0& 0\\ 0 & 0 & 0& 1& 0& 0& 0\\ 0 & 0 & 0& 0& 1& 0& 0\\ 0 & 0 & 0& 0& 0& 1& 0\\ 0 & 0 & 0& 0& 0& 0& 1\\ 1 & 1 & 0& 0& 0& 0& 0\\ \end{matrix} \right] \left[ \begin{matrix} x_7 \\ x_6 \\ x_5\\ x_4\\ x_3\\ x_2\\ x_1 \end{matrix} \right] x7′x6′x5′x4′x3′x2′x1′ = 0000001100000101000000010000000100000001000000010 x7x6x5x4x3x2x1
如果一次更新要得到两拍后的结果,那么映射关系等于M^2,即
通过该映射关系,可以很容易写出x’1-7的更新逻辑。
x 7 ′ = x 5 x 6 ′ = x 4 x 5 ′ = x 3 x 4 ′ = x 2 x 3 ′ = x 1 x 2 ′ = x 7 ⊕ x 6 x 1 ′ = x 6 ⊕ x 5 \begin{align} x'_7 &= x_5 \\ x'_6 &= x_4 \\ x'_5 &= x_3 \\ x'_4 &= x_2 \\ x'_3 &= x_1 \\ x'_2 &= x_7 \oplus x_6 \\ x'_1 &= x_6 \oplus x_5\\ \end{align} x7′x6′x5′x4′x3′x2′x1′=x5=x4=x3=x2=x1=x7⊕x6=x6⊕x5
十比特输出
如果需要一次产生10比特的伪随机序列,又该如何实现呢?初值固定后,这些伪随机序列也是固定的,因此每T产生此序列的10个数也是固定的,那么该如何做到呢?
基本电路只有7个寄存器,该如何一次性输出十个数呢?如果这样想,就容易落入死胡同。换个思路,通过生成矩阵,只要确定初值,我们可以得到移位任意拍的输出逻辑。所以下一拍x’7 表示移位10次后的结果,x’6表示移位11次后的结果,x’1表示移位16次的结果,另外准备3个寄存器x’0,x’-1,x’-2,分别表示移位17,18,19次的结果。我们只需要关心下一拍的更新逻辑!
所以根据 M 10 M^{10} M10我们可以得到如下更新逻辑:
x 7 ′ = x 4 ⊕ x 3 x 6 ′ = x 3 ⊕ x 2 x 5 ′ = x 2 ⊕ x 1 x 4 ′ = x 7 ⊕ x 6 ⊕ x 1 x 3 ′ = x 7 ⊕ x 5 x 2 ′ = x 6 ⊕ x 4 x 1 ′ = x 5 ⊕ x 3 x 0 ′ = x 4 ⊕ x 2 x − 1 ′ = x 3 ⊕ x 1 x − 2 ′ = x 7 ⊕ x 6 ⊕ x 2 \begin{align} x'_7 &= x_4 \oplus x_3 \\ x'_6 &= x_3 \oplus x_2 \\ x'_5 &= x_2 \oplus x_1 \\ x'_4 &= x_7 \oplus x_6 \oplus x_1 \\ x'_3 &= x_7 \oplus x_5 \\ x'_2 &= x_6 \oplus x_4 \\ x'_1 &= x_5 \oplus x_3\\ x'_0 &= x_4 \oplus x_2\\ x'_{-1} &= x_3 \oplus x_1\\ x'_{-2} &= x_7 \oplus x_6 \oplus x_2 \\ \end{align} x7′x6′x5′x4′x3′x2′x1′x0′x−1′x−2′=x4⊕x3=x3⊕x2=x2⊕x1=x7⊕x6⊕x1=x7⊕x5=x6⊕x4=x5⊕x3=x4⊕x2=x3⊕x1=x7⊕x6⊕x2
同理对于其他PRBS,都可以生成任意比特的输出。
原文