案例研究 · WI-FI 5 收发机

把 Wi-Fi 5 收发机搬上定制 RFSoC 板卡,以及路上的两道坎

一套为别家评估板写的参考收发机,搬到我们自己的板卡上,用一根线缆把发射接回接收。24 种 格式与速率组合在同一个比特流上全部解通,载荷逐字节一致。走到这一步,中间有两次失败,而每一次 仿真都报告一切正常。

AlgoSilicon 工程团队 · 2026

Wi-Fi 5 收发机是一整套信号处理:帧检测、频偏校正、FFT、信道估计、解映射、 解交织、维特比译码。我们起步用的参考实现是给厂商评估板写的,而目标是一块定制板卡:数据转换器 是更新的一代,接口位宽不一样,也没有现成的板级支持包。

发射输出经一根 SMA 线缆直接接回同一颗芯片的接收输入,所以整条无线链路就是这根线。这样这个 实验是诚实的:载荷回来不对,就是我们自己的问题。

定制板卡与把发射接回接收的 SMA 线缆,后面显示器上是实时仪表盘
板卡、那根就是整条链路的线缆,以及正在读取接收机的实时仪表盘。

需要补上的两处差异

参考设计和我们的硬件之间隔着两件事。转换器是更新的一代,多出参考平台上没有的配置项,而这些 配置项的默认值并不是按我们的用法选的。接口位宽也对不上:参考核每拍走 8 个采样,我们的转换器 接口每拍走 2 个,于是两侧各加一个重组模块,发端串化,收端拼回。

一颗芯片上的完整链路:发射机、位宽重组、DAC、SMA 线缆、ADC、位宽重组、接收机,外加主机采集通路
整条链路在一颗芯片上。主机可以把任意一级取回来比对。
实际部署构建的框图:处理系统、RF 数据转换器、Wi-Fi 5 收发机、采集模块、到主机的 DMA 通路,以及时钟与多片同步
真正被布线并烧写的那份构建的框图,直接从工程导出,不是重画的。编号依次是处理系统、 数据转换器、收发机、采集窗口、到主机的通路,以及时钟。点击可放大。

第一道坎:仿真全过,板子不认

接收机先在仿真里对着基准逐位验证过:1037 个载荷字节,完全一致。另做一次综合后网表仿真, 结论相同。上板之后,状态寄存器报告解码成功。

那个状态字就是陷阱。不看标志位、直接要真正解出的载荷字节,板子只给回 29 个。更麻烦的是结果 还会变:往设计里加一点采集逻辑,布局跟着变,报告出来的速率也跟着变。

四层验证:RTL 仿真通过,独立网表仿真通过,上板只解出 29 字节,从布线后设计抽出的网表仿真复现了板上错误
每一层便宜的验证都过了。最后和板子说法一致的,是从布线后设计里抽出来的那份网表。

破局的一步,是不再仿源码,转而去仿工具真正造出来的东西。从布局布线后的设计里抽出网表拿去 仿真,逐字节复现了板上的错误。从这一刻起,定位就不需要硬件了:拿这份网表和行为级模型逐个模块 边界比对,一层层往里收。

里面叠着三个缺陷,前一个盖住后一个。符号扩展位被接地。一个输出位宽从 16 位砍到 8 位。一张 查找表被吸收进块存储器后,输出冻住,地址却还在往前走。

一个负数样本的高位本应全部置起,与同一样本在实际网表中被接地的两位对照
第一个缺陷。只有负数样本被破坏,所以星座图看着接近却是错的。

这些变换在源码里根本不存在,所以源码级仿真从原理上就看不见。三个修法都落在设计生成的那一 侧,没有手改一行生成代码。之后板上取回全部 1037 个字节,零差错。

第二道坎:帧头全对,数据是噪声

链路跑起来之后,出现一个更奇怪的症状。帧头每次都正确解出,格式、速率、长度、校验全部自洽。 后面的数据却是噪声,而且每次采到的噪声都不一样。

五种解释被逐个提出、实现、推翻。位宽重组滑移。前导码劣化。信噪比偏低,后来查明是量法错了。 发射增益。时钟漂移。每一轮都要一次完整重建。

左侧五个被推翻的假设,每个都要一次重建;右侧是一次厂商驱动源码检索
五个看似合理的假设逐一被推翻。答案一直在厂商的驱动源码里。

根因是一个配置项。在这一代转换器上,数据通路模式的默认值会把复数转实数输出所需的镜像抑制 滤波器整个旁路掉。镜像没被抑制,就落在有用信号两侧,把占用带宽撑到约三倍。低阶、稳健的帧头符号 扛得住这种自干扰,密集的数据符号扛不住;而干扰相位每次不同,所以破坏看起来像随机。

改掉这一个配置项,镜像从只低 9.5 dB 压到低 33 dB,下一次采集数据就解通了。

两张由转换器原始采集数据算出的频谱:修复后的 Wi-Fi 5 信号占用干净的 20 MHz,以及高出噪底 50 dB 的校准单音
两条曲线都由板上采回的原始采样直接算出,不是画的。

还有一处同类修正。在单转换器的实数中频环回里,接收侧本振必须取与发射侧相反的符号。同号就会 锁到镜像边带,子载波全部换位。这一处也是查混频器参考资料定下来的,不是试出来的。

做完之后测到了什么

24 种帧格式与调制速率组合,全部在同一个比特流上解通,运行时切换,不重建也不重烧。验证越过了 状态标志:把接收机解出的输出采回主机,与理想参考走同一条离线链路比对,先比符号判决,再比载荷 字节。

实测结果:24 种格式与速率组合全部解通,2080 个星座判决位零差错,192 个载荷字节零差错,单音环回信噪比 50 dB,星座聚合度 0.976
这里每一个数字都来自同一次实验中的工具报告或板上采集。

模拟通路也单独做了鉴定,与任何调制信号无关。一个校准单音走完转换器和线缆回来,高出噪底 50 dB,没有镜像,这样在讨论解码之前就先把线缆和转换器排除掉。

打开交互式回放

我们从中拿走了什么

两次失败形状相同:便宜的检查全部通过,硬件依然不认;而两次真正该做的下一步,都不是再猜一次, 是换一类证据。

对构建期缺陷,那类证据是工具真正产出的网表。它的代价只是从构建已有的产物里抽一次,却把一次 昂贵的硬件迭代变成一次离线比对。

对转换器配置,那类证据是厂商自己的驱动源码。读它只要几分钟,一次重建接近一小时,而在真正把 源码读透之前,已经花掉了五次。当一个设计换到更新一代的器件上,诚实的第一步是把新一代多出来的 每一个配置项清一遍,逐项对照一份已知可用的参考,而不是只查当前假设关心的那一项。

还有,状态标志不等于结果。一个寄存器说帧解出来了,在有人要求接收机交出真正恢复的字节之前, 已经烧掉了一整轮硬件迭代。

有板卡要调试?

我们把全新的无线与 FPGA 板卡从裸硬件带到一个能跑、可测量的系统,一层一层验证过 去。告诉我们你要立起来的是什么。

设计服务