Wi-Fi 5 收发机是一整套信号处理:帧检测、频偏校正、FFT、信道估计、解映射、 解交织、维特比译码。我们起步用的参考实现是给厂商评估板写的,而目标是一块定制板卡:数据转换器 是更新的一代,接口位宽不一样,也没有现成的板级支持包。
发射输出经一根 SMA 线缆直接接回同一颗芯片的接收输入,所以整条无线链路就是这根线。这样这个 实验是诚实的:载荷回来不对,就是我们自己的问题。
需要补上的两处差异
参考设计和我们的硬件之间隔着两件事。转换器是更新的一代,多出参考平台上没有的配置项,而这些 配置项的默认值并不是按我们的用法选的。接口位宽也对不上:参考核每拍走 8 个采样,我们的转换器 接口每拍走 2 个,于是两侧各加一个重组模块,发端串化,收端拼回。
第一道坎:仿真全过,板子不认
接收机先在仿真里对着基准逐位验证过:1037 个载荷字节,完全一致。另做一次综合后网表仿真, 结论相同。上板之后,状态寄存器报告解码成功。
那个状态字就是陷阱。不看标志位、直接要真正解出的载荷字节,板子只给回 29 个。更麻烦的是结果 还会变:往设计里加一点采集逻辑,布局跟着变,报告出来的速率也跟着变。
破局的一步,是不再仿源码,转而去仿工具真正造出来的东西。从布局布线后的设计里抽出网表拿去 仿真,逐字节复现了板上的错误。从这一刻起,定位就不需要硬件了:拿这份网表和行为级模型逐个模块 边界比对,一层层往里收。
里面叠着三个缺陷,前一个盖住后一个。符号扩展位被接地。一个输出位宽从 16 位砍到 8 位。一张 查找表被吸收进块存储器后,输出冻住,地址却还在往前走。
这些变换在源码里根本不存在,所以源码级仿真从原理上就看不见。三个修法都落在设计生成的那一 侧,没有手改一行生成代码。之后板上取回全部 1037 个字节,零差错。
第二道坎:帧头全对,数据是噪声
链路跑起来之后,出现一个更奇怪的症状。帧头每次都正确解出,格式、速率、长度、校验全部自洽。 后面的数据却是噪声,而且每次采到的噪声都不一样。
五种解释被逐个提出、实现、推翻。位宽重组滑移。前导码劣化。信噪比偏低,后来查明是量法错了。 发射增益。时钟漂移。每一轮都要一次完整重建。
根因是一个配置项。在这一代转换器上,数据通路模式的默认值会把复数转实数输出所需的镜像抑制 滤波器整个旁路掉。镜像没被抑制,就落在有用信号两侧,把占用带宽撑到约三倍。低阶、稳健的帧头符号 扛得住这种自干扰,密集的数据符号扛不住;而干扰相位每次不同,所以破坏看起来像随机。
改掉这一个配置项,镜像从只低 9.5 dB 压到低 33 dB,下一次采集数据就解通了。
还有一处同类修正。在单转换器的实数中频环回里,接收侧本振必须取与发射侧相反的符号。同号就会 锁到镜像边带,子载波全部换位。这一处也是查混频器参考资料定下来的,不是试出来的。
做完之后测到了什么
24 种帧格式与调制速率组合,全部在同一个比特流上解通,运行时切换,不重建也不重烧。验证越过了 状态标志:把接收机解出的输出采回主机,与理想参考走同一条离线链路比对,先比符号判决,再比载荷 字节。
模拟通路也单独做了鉴定,与任何调制信号无关。一个校准单音走完转换器和线缆回来,高出噪底 50 dB,没有镜像,这样在讨论解码之前就先把线缆和转换器排除掉。
我们从中拿走了什么
两次失败形状相同:便宜的检查全部通过,硬件依然不认;而两次真正该做的下一步,都不是再猜一次, 是换一类证据。
对构建期缺陷,那类证据是工具真正产出的网表。它的代价只是从构建已有的产物里抽一次,却把一次 昂贵的硬件迭代变成一次离线比对。
对转换器配置,那类证据是厂商自己的驱动源码。读它只要几分钟,一次重建接近一小时,而在真正把 源码读透之前,已经花掉了五次。当一个设计换到更新一代的器件上,诚实的第一步是把新一代多出来的 每一个配置项清一遍,逐项对照一份已知可用的参考,而不是只查当前假设关心的那一项。
还有,状态标志不等于结果。一个寄存器说帧解出来了,在有人要求接收机交出真正恢复的字节之前, 已经烧掉了一整轮硬件迭代。





