3. PRBS码型的数学原理:线性反馈移位寄存器(LFSR)
PRBS码型说白了就是个“伪随机”序列。为什么叫伪随机?因为它看起来杂乱无章,但本质上是有规律的。我做了这么多年高速信号测试,可以说搞懂LFSR,就等于掌握了PRBS的命门。
你想想看,如果完全随机,接收端怎么知道发的是什么?没法比对,就测不准误码率。LFSR就是那个能生成“可控随机”序列的核心引擎。
3.1 LFSR的核心结构
线性反馈移位寄存器,名字听着唬人,结构其实很简单。就三个东西:
- 寄存器组:一串D触发器,每个存1比特
- 反馈函数:用异或门把某些位的输出拉回来
- 时钟驱动:每个时钟沿,所有数据向右挪一位
举个例子,一个3阶LFSR就是3个寄存器串在一起。我习惯叫它“移位链”。每次时钟来,数据右移,最左边补进来的不是0,而是某些位的异或结果。
| 组件 | 作用 | 说明 |
|---|---|---|
| D触发器 | 存储1比特状态 | 级数n决定PRBS序列长度 |
| 异或门 | 实现线性反馈 | 抽头位置由本原多项式确定 |
| 时钟 | 同步移位操作 | 速率决定了码型的符号率 |
3.2 反馈多项式:LFSR的灵魂
刚才提到“抽头位置”,这就是关键。我记得刚做信号完整性那会儿,拿着示波器看PRBS7的眼图,总觉得哪里不对。后来发现是抽头选错了,序列长度根本不完整。
反馈多项式长这样:
G(x) = x^n + x^a + x^b + ... + 1
这里n是阶数,a、b是抽头位置。拿PRBS7举例:
G(x) = x^7 + x^6 + 1
什么意思?就是把第7位和第6位的输出异或后,反馈到输入端。就这么简单。
本原多项式:只有选择本原多项式作为反馈函数,LFSR才能遍历除全零外的所有状态。这是PRBS能产生最大长度序列的根本原因。
3.3 最大长度序列的秘密
为什么会是最大长度?我解释给你听。n级寄存器总共有2^n种状态。全零状态是个死胡同——所有位都是0,异或结果还是0,出不来了。
所以有效状态数就是2^n - 1。PRBS序列长度就是2^n - 1。这个数很重要,选眼图分析的码型长度时你得心里有数。
| 阶数 n | 序列长度 2^n-1 | 常用场景 |
|---|---|---|
| 7 | 127 | PCIe 3.0, USB 3.0 |
| 9 | 511 | SATA, 短距背板 |
| 15 | 32767 | 10G Ethernet |
| 23 | 8388607 | 长距光纤通信 |
| 31 | 2147483647 | 高速背板, 通道应力测试 |
3.4 抽头位置的选择
这里我特别想说一个我曾经掉进去的坑。抽头位置不是随便选的,必须查标准。IEEE标准里写得清清楚楚。比如PRBS7只能用x^7 + x^6 + 1,换了就完蛋。
我的习惯:工程上直接查标准表,别自己算。我见过有人用Matlab求本原多项式,结果求出来的跟标准不匹配,眼图测出来全是错的。
为什么必须用本原多项式?因为只有它才能保证:
- 序列长度最大(2^n - 1)
- 0和1的数量近似相等
- 游程分布符合随机特性
你想想看,眼图分析要的就是这种“看似随机但可预测”的特性。码型太长,示波器的存储深度不够;码型太短,又测不到真实的通道响应。
3.5 代码实现:从数学到硬件
我习惯用Python验证LFSR的逻辑。下面这个代码虽然简单,但能帮你理解状态跳转的过程。
def lfsr(seed, taps, n_bits):
# seed: 初始状态
# taps: 抽头位置列表
# n_bits: 生成的码元数
state = seed & 0x7F # 只取低7位
output = []
for _ in range(n_bits):
# 输出最低位
output.append(state & 1)
# 计算反馈位
fb = 0
for t in taps:
fb ^= (state >> (t-1)) & 1
# 状态移位
state = (state >> 1) | (fb << 6)
return output
# PRBS7: 抽头 [7, 6]
seq = lfsr(0x01, [7, 6], 127)
注意看那个反馈位的计算。我刚开始写的时候总搞错位序,每次都拿示波器对比波形才放心。
注意:初始状态不能是全零。如果seed=0x00,反馈永远是0,整个序列就死了。我建议用0x01,稳妥。
3.6 LFSR的状态迁移图
下面这张图展示了3阶LFSR的状态迁移过程。你仔细看,它是个循环,从任何非零状态出发,最终都会回到起点。
我每次做PRBS相关的调试,都会把这个图放在手边。它让我直观地看到:一旦误入全零状态,整个序列就废了。这也是为什么LFSR的初始化必须避开全零。
3.7 实际应用中的权衡
你问选几阶LFSR最合适?我给不了标准答案。但有个经验:阶数越高,序列越长,越接近真随机。问题是成本也高——寄存器多了,功耗上去了。
我建议的选型思路:
- 看协议标准:PCIe、USB、以太网都有明确规定
- 看通道带宽:低频通道用短序列够了,高频必须长序列
- 看示波器存储深度:PRBS31需要2Gpts,普通示波器扛不住
避坑指南:我曾经为了省事,用PRBS7测100Gbps链路,结果眼图完全不收敛。后来换了PRBS31才抓到真正的通道损伤。序列太短,测不到长尾衰落。
嗯,你如果刚开始接触PRBS,我建议从PRBS7或者PRBS9开始练手。这两个序列短、实现简单,示波器也能轻松捕获。跑通了再往高阶走。