技术案例 · 802.11a 接收机

一台 AI 自动生成的 Wi-Fi 接收机,逐比特验证

一台完整的 802.11a 接收机,从 MATLAB 参考设计变成了没有人手写过一行的 FPGA 硬件。 最有说服力的一关:把 MATLAB 自己生成的标准波形喂进去,它能一比特不差地收回来。

AlgoSilicon 工程团队 · 2026

MATLAB 有一个参考设计,叫做 Image Transmission and Reception Using 802.11 Waveform and SDR。它给了一整套 802.11a 的发送和接收链路:把一张图片切成数据包,调制成 Wi-Fi 波形发出去,接收端再同步、纠错,把原图一字不差地拼回来。

真要把这台接收机搬到 FPGA 上,对照 MATLAB 代码一行行写成 RTL 或 HLS C,繁琐到这个项目 可以一拖好几年。于是我们换了一条路:让算法到硅的自动化流程读懂这套参考设计,直接生成接收机。 大概几天时间,整条 802.11a 接收链路就从数学模型自动生成了 Verilog,目标平台是 ADALM-Pluto 软件无线电上那块很小的 Zynq-7010 FPGA。

这就带出一个合理的问题:既然没有工程师手写过这套硬件,凭什么相信它是对的?这正是值得讲清楚的地方。

分层生成,逐层核对

这套流程不是一步到位地写硬件。它把接收机分成三层来构建,并让机器逐层对照上一层核对:

关键不在于"软件生成了代码",而在于每相邻两层之间都由机器逐比特自动核对,而不是嘴上保证。 定点硬件本来就不可能去比浮点的小数末位,它也不需要。它的硬指标只有一个:把发送的比特精确收回。

三层生成与核对:数学模型、周期级模型、Verilog RTL,逐层交叉核对
分三层生成,每一层都由机器交叉核对:浮点模型与 MATLAB 波形吻合,周期级模型与之逐位一致,RTL 又与周期级模型逐位一致。

接收机做了哪些事

输入是射频前端(Pluto 上的 AD9363)下变频之后送出的一串基带 I/Q 采样,并不是天线信号。 接收机把这串采样变成干净的数据比特,每一步都对应 802.11a 标准:它检测每一个包并校正载波频偏, 用 64 点 FFT 解调每个 OFDM 符号并对每个子载波做均衡,把符号软解调成似然值并解交织, 再用维特比译码卷积码、解扰,恢复出净荷。

接收机框图:同步、OFDM 解调与均衡、软解调、译码与解扰,跨两个时钟域
接收机信号链,从基带 I/Q 采样到数据比特。维特比译码器运行在自己较慢的时钟域,由异步 FIFO 跨接。
BPSK、QPSK、16-QAM、64-QAM 的接收星座图,星点紧密聚集在理想点
四种调制方式的接收星座图。星点紧密聚集在理想位置,是同步、均衡与解调正确的直观标志。

信号本身长什么样

有两张图刻画链路本身。发射频谱显示了 OFDM 的特征:64 个子载波填满 20 MHz 信道里 约 16.6 MHz 的带宽。误码率曲线则显示每种调制随信道变差时的表现:星座越密,承载的比特越多, 但要保持干净所需的信噪比也越高。

生成的 802.11a 波形发射功率谱密度,20 MHz 信道内约占用 16.6 MHz
生成的 802.11a 波形发射频谱:64 个子载波拼成 OFDM 信号,占用 20 MHz 信道里约 16.6 MHz 的带宽。
BPSK、QPSK、16-QAM、64-QAM 经过完整接收链路的误码率随信噪比曲线
经过完整接收链路的误码率随信噪比曲线。空心标记位于测量分辨率下限:在该点 1,600 比特内未见错误。

证据:一张图进去,同一张图出来

最有说服力的是端到端测试。我们把 MATLAB WLAN 工具箱生成的波形,经过 12 比特 ADC 模型, 再交给定点硬件译码。在 24 个包、共 38,400 比特上,接收机把发送的比特一个不差地收了回来。 发送的图片被精确地拼回原样。

0 误码 / 38,400 比特
MATLAB 生成的 802.11a 波形,由定点接收机恢复
发送的原图与 FPGA 接收机恢复出的图像,完全一致
发送的原图(左)与接收机恢复出的图像(右)。逐比特恢复意味着两者逐像素完全一致。

在真实采集的信号上看它运行

同样的"一张图进、同一张图出"测试,在两根天线上做了空口实测,并把采集到的采样直接从射频 设备上保存了下来。下面的链路分析器在浏览器中回放这段真实的片上采集数据,不连接任何硬件。 随着数据速率从 BPSK 提升到 64-QAM,星座图逐步收敛,信道响应与频谱同步更新,图像也随着每个 数据包被译码而逐步重建。

链路分析器回放真实采集的 802.11a 数据:星座图、信道响应、频谱与恢复图像,覆盖每一种数据速率
链路分析器在每一种数据速率上回放真实空口采集的数据。星座图、信道响应、频谱与 恢复出的图像,全部来自保存下来的片上采样。

启动交互演示

分到三层处理器上,才塞进 Pluto

这台接收机又小又便于移植。作为完整设计在 Zynq-7010 上做一次完整布局布线,它以 162.7 MHz 的接收时钟收敛,占用 8,514 个 LUT、8,233 个触发器、5.5 块 BRAM 和 43 个 DSP;在 Zynq UltraScale+ RFSoC 上表征时,同一套设计达到 309.6 MHz,为更高速的标准留出了时钟余量。

但 ADALM-Pluto 的芯片太小。完整的接收机(约 8,500 个逻辑单元)加上无线电自己的接口逻辑 (又约 8,500 个),一起放不进这颗器件总共的 17,600 个。于是部署被拆到三层:对速率最敏感的 同步前端和 FFT 留在 FPGA 逻辑(PL)里;嵌入式 ARM 处理器(PS)用它的 DMA 引擎、射频驱动和 USB 桥负责搬运数据;更重的后端(信道估计、均衡、软解映射、Viterbi 译码)放到主机上跑。 FPGA 经 DMA 把频域符号交给处理器,处理器再经 USB 流给主机,两端跑同一个基准模型,所以这一拆 从头到尾都逐比特一致。

三层处理器:同步前端与 FFT 在 FPGA,数据搬运在嵌入式处理器,接收机后端在主机
部署拆到三层:只有同步前端放得进 FPGA,其余交给主机,两级接口分别走 DMA 和 USB。
Pluto 的 Vivado 工程截图:同步核嵌入其中,旁边是射频接口、DMA 和 Zynq 处理器
真实的 Vivado 工程:我们的同步核(PL)嵌进 Pluto 原厂的 FPGA 设计里,旁边是射频接口、DMA 和 Zynq 处理器(PS)。

这样在空中两根天线上跑,交付的图像在每一种数据率下都逐比特恢复。有线连续 90 秒的运行里, 每个包都译出来了(1390 个里 1390 个);空口的原始单包成功率是 99.88%(832 里 831),差的那一个 是真实信道抖动、不是主机丢数据,协议会重发补回,所以图像照样完整。

为什么这件事可以复用

这里没有任何东西是针对某一张图片或某一个包的。同一套流程可以接过一份信号处理参考, 比如另一个标准、一条发射链路、一个自定义 OFDM 链路,用同样的方式、在每一层做同样的逐比特核对, 生成一台经过验证的接收机或发射机。这台接收机以无线 PHY IP 核的形式提供;它背后的方法, 也以设计服务的形式提供。

查看无线 PHY IP

完整规格、实测时钟与资源数据,以及接收机信号链,都在产品页上。也欢迎就自定义 无线链路与我们沟通。

无线 PHY 产品