
封面
一套参数配置驱动的软件无线电部署框架,换个参数就换个设计
以 802.11a 为例:同步前端跑在 FPGA 上,其余交给主机,空口图像链路逐比特恢复
这篇讲的是一套把生成的硬件部署到软件无线电上的框架。它是参数配置驱动的:一个生成器、一套拼接和构建脚本、一条从烧写到主机校验的流水线,对每个设计都一样,换个设计只改一个参数文件。下面拿一个 802.11a 接收机当例子,把它真正跑到一颗便宜的板子上。这颗板子叫 ADALM-Pluto,核心是一颗很小的 Zynq-7010,配一颗 AD9363 射频芯片,通过 USB 接主机。

真实部署:手里这块蓝色的就是 ADALM-Pluto,背后是实时链路分析器
坦白地说:这颗 Zynq 芯片的 FPGA 资源太有限,装不下整台接收机。所以我们这次部署只能把对速率最敏感的同步前端放进 FPGA,剩下的解码只能交给主机来处理。下面这段画面,是从真实芯片上采下来、再在浏览器里回放的:星座图从 BPSK 一路收敛到 64-QAM,图像随着每个包被解出来,一点点拼回来。先看效果,再讲怎么搭的。

链路分析器回放真实采集的数据,从 BPSK 一路走到 64-QAM
跑通了:空口两根天线连续收,图像逐比特恢复,从 BPSK 到 64-QAM 八种速率全过。下面讲两件事:这套框架长什么样,以及怎么把一整套接收机拆到三层处理器上。
一套参数配置驱动的流程,一次只换一组参数;把同步放进 FPGA、其余交给主机。
1一套流程,换个参数就换个设计
这套框架的核心是一条固定的流水线:从一个参数文件出发,自动生成封装、拼进 Pluto 原厂的设计里、构建出比特流、打包成固件、烧写上板,最后在主机上拿基准结果校验。换一个设计,比如从 Wi-Fi 换到 5G 的同步信号,只改那个参数文件,生成器、拼接、构建、烧写脚本一行都不用动。

一套流程,任意设计:只换一组参数
为了不让上板一上来就栽跟头,我们一级一级点亮:先只回读一段已知数据,把整条工具链验通;再验实际采样数据怎么进来、时钟和缓冲对不对;最后才把设计本身放上去。每一级都是一道硬件关,先在板上过了关,才动下一级。上层一出问题,底层没点亮根本没法查。

逐级点亮,每一级都是一道硬件关
2三层处理器:同步放进 FPGA,其余交给主机
这颗芯片上其实有三层算力:一块 FPGA 逻辑(PL)、一个跑着嵌入式 Linux 的 ARM 处理器(PS),还有 USB 另一头的主机(Host)。为什么非得分三层?因为整台接收机加上无线电自己的接口逻辑,根本塞不进这块小芯片:光完整的接收机就要约 8500 个 LUT,射频接口又要约 8500 个,而整颗器件总共才 17600 个。两个一起放,放不下。
于是这么分:
- ▶FPGA(PL)
放最吃速率的同步前端,包检测、频偏校正、精定时、采样环和 FFT,输出频域符号 - ▶处理器(PS)
负责把数据搬出来,DMA 引擎、射频芯片的驱动,还有连到主机的 USB 桥 - ▶主机(Host)
接着做接收机的后端,信道估计、均衡、软解映射、卷积译码,最后把图像拼回来
FPGA 到处理器走 DMA,处理器到主机走 USB。关键是,FPGA 和主机两侧跑的是同一个基准模型,所以这么一拆,整条链路还是逐比特一致。

三层处理器:同步放进 FPGA,其余交给主机
这不是示意图。下面是 Vivado 里真实的工程截图:我们的同步核(绿框)确确实实嵌在了 Pluto 原厂的 FPGA 设计里,旁边是射频接口、送往处理器的 DMA,还有那颗 Zynq 处理器。

Vivado 工程截图:同步核嵌入 Pluto 的 FPGA 设计
3结果:每种速率都逐比特恢复
开头那段画面,回放的就是空口实测:一张图进、原样一张图出,在两根天线上做,采到的采样直接从无线电上存下来,没有任何后期修饰。下面每个数字,都是 FPGA 同步加主机解码这条完整链路一起跑出来的。

空口实测,64-QAM:真实芯片上的星座图与重建出来的图像
- ▶图像 100% 正确
交付的图像逐比特一致,八种速率全部如此 - ▶零误码
标准波形 38400 比特,逐比特恢复 - ▶有线 100%
换成 SMA 线、干净配置下连跑 90 秒,1390 个包一个不丢 - ▶空口 99.88%
原始单包成功率 831 / 832,差的那一个是真实信道抖动,不是主机丢数据 - ▶162.7 MHz
同步核布局布线收敛的时钟,板上以 100 MHz 运行(12.5 Msps × 8) - ▶八种速率
从 BPSK 到 64-QAM,全部逐比特一致
这里几个百分比,得分清楚,别混在一起:
ℹ Note
交付的图像是 100% 正确的:每一片都重发很多遍,校验会挑出干净的一份,所以无论哪种速率,最后拼出来的图都逐比特一致。空口 99.88% 说的是"原始单包"的成功率(832 个里收对 831 个);差的那一个,是真实无线信道的一次抖动(多径、噪声、2.4G 干扰),实测当时主机 0 次卡顿,所以它不是主机丢数据,而是空中那一下没收干净,协议靠重发补回了。换成 SMA 线、干净配置时,连原始单包都是 100%(1390/1390)。
4能带走的方法
这套框架的价值,是把"把生成的硬件搬上软件无线电"这件事,做成一条可复制的流程:换个设计只改一组参数。具体的 Wi-Fi 只是个例子,里面这两条最通用:芯片装不下,就按算力分层,把最吃速率的留在 FPGA,其余沿一个又窄又单向的接口交给处理器和主机;上板则一级一级点亮,每一级都先在真实硬件上过了关,再动下一级。这些才是值得带到下一个设计里去的东西。
夜雨聆风