手机一开机,最先做的一件事就是找基站。它并不知道附近有哪些小区、每个小区的编号是 多少,于是扫过整段频谱,去捕捉每个小区每隔一小段时间发出来的一小块同步信号。在 5G 里这块信号 叫 SSB,它把主同步、辅同步和广播信道打包在一起,占 4 个 OFDM 符号、240 个子载波。
把这台小区搜索接收机手写到 FPGA 上,繁琐到项目一直搁着。我们换了个做法:让算法到硅的自动 流程直接对着参考设计生成整台接收机,目标是 Kria KV260。然后拿一段真实录下来的 5G 下行喂给它, 这段信号是 30 kHz 子载波间隔,里面含着三个小区。
分层生成,每一层都对照
这套流程不是一步写出硬件的。它把接收机分成三层,每一层都让机器去跟上一层对照:一份浮点 基准模型,输出跟 3GPP 的定义和 MATLAB 5G 工具箱吻合;一份周期级定点模型,逐比特对照基准模型; 以及最后的 Verilog RTL,逐比特对照周期级模型。相邻两层之间的等价,都是机器核对的,不是嘴上 保证的。
接收机做了哪些事
输入是一段基带 I/Q 采样。把它变成一个小区编号和译好的广播消息,要走四步。开机时接收机并不 知道小区属于哪一组,于是同时拿三个候选的主同步序列做相关。每一个都是复数匹配滤波,而复数匹配 滤波又拆成三路实数子相关,所以前端并行跑着九个折叠相关器去找同步峰。之后能量测量加峰值定位把 这块信号切出来,256 点 FFT 恢复出 240 个子载波,广播译码再把消息读出来。
切成两层,才能实时跑
这条链子不是整块塞进 FPGA 的。检测和解调是定速的流式运算,每一拍都在动,适合 fabric。广播 译码是控制密集的活:要在 336 个辅同步候选里搜,还要跑极化码列表译码,这类东西在 CPU 上更省。 所以设计切在整条链路最窄的接口,也就是恢复出来的频谱,两半各自跑在合适的地方。前端送出的是 16 位定点频谱,但主机这一侧照样能把广播消息 CRC 校验通过地译出来,因为导频均衡和极化码的编码增益 足够把量化噪声吃掉。
从三个真实小区里读出来
验证分两头。一头是拿 MATLAB 5G 工具箱当独立裁判,上千个符合标准的同步块,每个都带着已知的 小区编号和广播消息,译出来逐比特核对。另一头是拿真实录下来的信号:接收机把这段信号里的三个小区 全都读到了同一份广播消息,系统帧号都是 788、子载波间隔都是 30 kHz。这一致性本身就是检验,因为 同一片区域里同步的几个小区,广播消息本就该一致。
这次还纠正了参考脚本里的一个错误。它把加扰域的净荷没解扰就拿去解析,得出来的帧号是错的、 而且每个小区还各不相同。补上标准规定的解扰和解交织之后,三个小区才对上。
弱到什么程度还能解
真实信号只是一个工作点。要测稳健性,用 MATLAB 工具箱生成 1460 个多样化向量,覆盖全部 1008 个小区编号、所有 SSB 位置、任意广播消息、两种子载波间隔,再加白噪声扫频、载波频偏、频率选择性 衰落。干净信道下 300 个随机配置全部逐比特正确。白噪声扫频下,误块率在每资源单元 -2 dB 以上为 零,到 -6 dB 附近才开始明显掉,这正是低码率广播信道该有的抗噪门限。
比商用参考更省
九个相关器是盲检必需的算力,资源也主要花在这上面。每一个都以框架里最高效的折叠 FIR 生成, 所以在同一颗芯片上,检测器比商用高层次综合参考实现少用 38% 查找表、少用 75% 触发器,块存储 1 比 7。整机,检测器加解调,在 KV260 上布局布线收敛于 256 MHz,部署 overlay 在 200 MHz 链路速率 下时序收敛。
在真实硅片上,参考信号通过 DMA 灌进 KV260 前端,算出来的频谱读回来跟参考模型比对:2540 拍, 零误差。
在真实采集的信号上看它跑
下面的分析器回放一串多样化的同步块,走的是 KV260 前端频谱在主机上的同一条译码链路,没有 服务器、不接电台。随着信道变差,星座点从紧凑的 QPSK 一圈圈散开成噪声云,信号质量的历史曲线跟着 爬高,广播译码一路逐比特正确,直到抗噪极限才失败。
为什么这件事可以复用
这次做的是一台 5G 接收机,但整个方法里没有一处是 5G 专属的。从标准定义,到带时序的定点 模型,再到生成的电路,每一层都跟上一层逐位等价,而且这个等价是机器核对的。前端跑在 fabric、 译码放在主机,是切在整条链路最窄的接口上,这个按算力分工的思路对任何一条又长又不均匀的信号 处理链都成立。更省的资源也不是手工抠出来的:流程把每个相关器映射到最高效的硬件结构,所以才能 比商用工具综出来的还小。能带走的是这套方法,不是这一台接收机。



