FPGA实现DCT-IV与FBMC多载波调制:SoC架构、定点量化与性能对比
1. 项目概述:当多载波调制遇上FPGA
在宽带电力线通信(PLC)这类复杂信道环境中搞实时信号处理,最头疼的就是如何在有限的硬件资源下,既要跑得快,又要算得准。多载波调制(MCM)技术,比如大家熟知的OFDM,通过把高速数据流拆分成一堆并行的低速子载波,是应对频率选择性衰落和符号间干扰的利器。但传统的基于DFT/FFT的方案,对同步误差敏感,还得加个循环前缀(CP)来抗多径,这又牺牲了宝贵的频谱效率。所以,学术界和工业界一直在寻找更优解,比如基于离散余弦变换(DCT)和滤波器组多载波(FBMC)的方案。
DCT方案,特别是DCT-IV型,天生只用实数运算,对载波频偏(CFO)的容忍度更高,频谱泄露也更小。而FBMC方案,通过精心设计的滤波器组,让子载波频谱形状更“瘦”、旁瓣更低,理论上可以完全不用CP,从而把频谱效率榨干。这两个听起来都很美好,但真要把它们从数学模型变成能实时跑起来的硬件,挑战就来了:计算复杂度高、数据吞吐量大、对定点量化误差敏感。
这时候,FPGA的优势就凸显出来了。它不像通用处理器(CPU)那样一条指令一条指令地串行执行,而是可以“摊开”电路,让成千上万个逻辑单元同时干活,这种并行性天生适合做FFT、滤波这类规则性强的信号处理运算。而且,你可以根据DCT或FBMC算法的具体需求,定制化地设计数据通路和计算单元,在速度、面积和功耗之间找到最佳平衡点。说白了,FPGA给了我们一个在硅片上“雕刻”出最适配算法结构的画布。
我这次要拆解的,就是一个基于Xilinx Virtex-6 FPGA的完整片上系统(SoC)实现。它不仅仅是在FPGA里扔进去一个DCT或FBMC的IP核,而是构建了一个包含软核处理器(MicroBlaze)、DMA控制器、内存控制器和可插拔式硬件加速器(即我们的调制解调器)的完整通信子系统。我们将深入对比DCT-IV-MCM和FBMC这两种架构,从系统设计思路、FPGA实现细节、资源消耗,一直到实际的板级测试和性能分析,看看在62.5 Msps的实时传输要求下,谁更能打,以及我们在实现过程中踩过哪些坑,又总结了哪些能直接“抄作业”的经验。
2. 核心思路与系统架构设计
2.1 为什么选择SoC架构?
很多人一上来就想在FPGA里写个纯粹的、只有数据通路的调制解调器。这在小规模验证时没问题,但一旦要构建一个能实际工作的系统,就会遇到一堆“杂事”:谁来初始化配置参数?数据从哪里来、到哪里去?如何监控系统状态?如果每次发数据都要软核处理器来搬运,那CPU就别干别的了。
所以,一个成熟的FPGA通信系统设计,必须考虑系统级的集成。我们采用的SoC架构(如图1所示)核心思想是解耦与专业化。把控制管理(由MicroBlaze软核负责)和高吞吐量数据搬移(由DMA负责)从核心信号处理单元中分离出来。DCT或FBMC的发射机/接收机被设计成符合AXI总线标准的高级外设(硬件加速器)。它们就像乐高积木一样,可以灵活地插入到这个SoC框架中。MicroBlaze只需要通过读写几个配置状态寄存器(CSR)来启动、停止或查询外设,大量的数据流则通过DMA在DDR3外部内存和硬件加速器之间直接搬运,完全不占用CPU资源。
这种架构的另一个巨大优势是可复用性。今天我可以测试DCT方案,明天想换FBMC,甚至未来想尝试全新的波形,我只需要重新设计这个“积木”(硬件加速器),而整个系统框架、驱动软件、测试流程都可以保持不变。这极大地加速了原型验证和算法迭代的周期。
2.2 DCT-IV-MCM方案原理与架构
DCT-IV-MCM的核心,是用DCT-IV变换替代了传统OFDM中的IFFT/FFT。其数学表达式如论文中公式(1)所示。但直接实现这个余弦变换计算量很大。一个关键的优化技巧是利用DCT与FFT之间的数学关系,将DCT运算转化为FFT运算,从而复用高度优化的FFT IP核。
具体来说,如论文图2和公式(2)-(5)所述,一个M点的DCT-IV运算可以分解为四个阶段:
- 预乘旋转因子:输入数据乘以一个复数旋转因子
e^{-jmπ/2M}。这步将实数信号扩展到了复数域,为后续FFT处理做准备。 - M点FFT运算:对上述结果执行标准的M点FFT。这是整个流程中计算量最大的部分,幸运的是,Xilinx提供的FFT IP核已经过极度优化,我们可以直接调用。
- 数据重排:将FFT输出的复数序列按照特定规则进行重排和取共轭操作。这个阶段主要是数据路由,逻辑资源消耗少。
- 后乘旋转因子并取实部:再次乘以一个旋转因子
e^{-jπ(2m+1)/4M},然后只取结果的实部,得到最终的时域DCT-IV输出。
在发射端,DCT-IV变换后还需要一个**对称扩展(SE)**模块。你可以把它理解为DCT领域的“循环前缀”。它复制时域信号的头尾一部分,以消除块间干扰(IBI)。接收端则先移除SE,再进行逆变换。
FPGA架构实现(发射机为例): 我们的硬件设计紧密对应上述四个阶段,并引入了**并行度(Rp)**的概念。Rp表示同时处理的样本数,也就是数据通路的“车道数”。Rp越高,吞吐量越大,但消耗的DSP48乘法器和寄存器也越多。我们需要根据目标采样率(62.5 Msps)和FPGA时钟频率,反推出最小的Rp需求。
以论文中M=256点为例,若系统时钟为100MHz,要达到62.5Msps的采样率,每个时钟周期需要输出0.625个样本。这意味着我们至少需要2条并行车道(Rp=2)才能满足实时性。在实际设计中,我们采用了更高的Rp以预留余量并简化控制逻辑。
图3所示的发射机架构,将SE模块和DCT的s4(后乘旋转因子)阶段巧妙地共享了同一块Block RAM。这是因为SE操作需要访问DCT输出序列的头尾,而s4阶段输出后,其数据流经的存储单元正好可以被SE复用。这种资源复用是FPGA设计节省面积的关键技巧。整个发射机流水线深度为1258个时钟周期,使用了49个乘法器。
注意:将DCT转化为FFT来实现,虽然利用了现成IP,但引入了复数运算,实际上增加了一些额外的乘法(预乘和后乘旋转因子)。在设计定点化方案时,这些旋转因子的量化精度需要格外关注,否则会引入不必要的误差。
2.3 FBMC方案原理与架构
FBMC的思路更激进:它不仅要换掉FFT,还要彻底扔掉“矩形窗”,给每个子载波套上一个频谱特性更好的滤波器(通常原型滤波器),从而极大提升频谱局域性,抑制带外泄漏。我们实现的是一种基于余弦调制滤波器组的FBMC系统。
如论文图5所示,FBMC发射机在DCT-IV变换模块的前后,增加了额外的处理环节:
- 子载波加权:每个子载波数据先乘以一个交替的+1/-1因子(θm),这是由滤波器组结构决定的。
- DCT-IV变换:与DCT方案共用相同的DCT-IV核心模块。
- 矩阵变换(I, J):将DCT-IV输出的实数序列,通过固定的实数矩阵运算(I和J),映射到滤波器组的多个支路上。这个运算本质上是增加了一种“过采样”和交织的结构。
- 多相滤波器组:这是FBMC的灵魂。每个支路上的数据经过一个原型滤波器的多相分量进行滤波,然后将所有支路的输出叠加起来。这个滤波器组的设计决定了系统的性能,其阶数和系数需要精心优化。
FBMC接收机是发射机的镜像过程,包含相同的多相滤波器组、逆矩阵变换、DCT-IV和去加权。
FPGA架构挑战: FBMC最大的挑战在于多相滤波器组的实现。一个高性能的原型滤波器可能长达几十甚至上百个抽头。如果为每个子载波支路都实例化一个独立的滤波器,资源消耗将是灾难性的。因此,必须采用时域复用策略。
我们的做法是:将高速串行的数据流写入一个大型的循环缓冲区。然后,用一个高度并行的乘累加(MAC)单元,依次从缓冲区中读取与每个支路滤波器抽头对应的数据,进行卷积运算。由于滤波器系数是固定的,可以预先存储在ROM中。通过精巧的地址生成逻辑和控制状态机,让这一个MAC单元在时间上“轮流”为所有支路服务。这本质上是用时间换面积,通过提高MAC单元的工作频率来满足整体吞吐率要求。
2.4 两种方案的对比与选型思考
在项目开始前,我们面临选择:DCT-IV-MCM还是FBMC?下面这个表格从几个工程关键维度进行了对比:
| 特性维度 | DCT-IV-MCM方案 | FBMC方案 | 工程意义 |
|---|---|---|---|
| 核心复杂度 | 中等。核心是DCT-IV(通过FFT实现),外加简单的SE。 | 高。核心是DCT-IV + 矩阵运算 +高阶多相滤波器组。 | FBMC的滤波器组是资源消耗大户,设计和验证周期更长。 |
| 频谱效率 | 较高。仍需SE,但长度通常短于OFDM的CP。 | 理论上最高。无需CP,靠滤波器形状抑制干扰。 | 在频谱资源紧张的场景,FBMC优势明显。但在PLC中,信道噪声是主要矛盾,此优势需结合具体环境评估。 |
| 同步敏感性 | 对载波频偏(CFO)相对不敏感。 | 对定时同步误差更敏感,但对CFO也有一定鲁棒性。 | DCT方案在终端时钟精度差异大的场景可能更稳定。 |
| FPGA资源消耗 | 主要消耗在FFT IP和少量旋转乘法器。 | 显著更高。除FFT外,滤波器组消耗大量DSP48和Block RAM。 | 在资源受限的FPGA上,DCT方案更容易实现,成本更低。 |
| 实现灵活性 | 结构相对固定,参数化主要是变换点数M和SE长度。 | 灵活性高。可更换不同性能的原型滤波器,但一旦更换需重新设计滤波器组硬件。 | FBMC更适合作为技术预研和性能探索的平台。 |
| 带外泄漏 | 一般。基于DCT,旁瓣衰减优于DFT,但不如FBMC。 | 极低。滤波器组可实现极高的带外抑制。 | 在存在严格电磁兼容(EMC)要求的场合,FBMC是必选项。 |
我们的决策:最终,我们决定在同一个SoC平台上实现两者。原因有三:第一,作为研究项目,我们需要第一手的对比数据;第二,两者的DCT-IV核心模块可以复用,减少了部分工作量;第三,SoC的框架设计使得切换测试非常方便。对于产品化,则需要根据目标市场的具体需求(成本、性能、功耗)来最终抉择。
3. FPGA实现细节与核心模块解析
3.1 定点量化:精度与资源的博弈
FPGA里处理的是二进制数,不是无限精度的浮点数。因此,将浮点算法模型转化为定点硬件实现,是成败的关键一步。量化不当,轻则性能下降,重则系统无法正常工作。
量化策略: 我们采用全局仿真引导的量化方法。首先在MATLAB/Simulink中建立浮点参考模型。然后,为模型中的每一个信号节点(特别是乘法器、加法器的输入输出)确定位宽(整数位+小数位)。原则是:在保证最终输出信噪比(SNR)满足要求的前提下,尽可能减少位宽。
- 确定动态范围:通过大量随机数据仿真,统计每个信号的最大值和最小值,确定需要的整数位宽,防止运算溢出。
- 确定小数精度:这是一个迭代过程。我们从小位宽开始(如12位),逐步增加小数位,观察系统整体性能(如MSE、SNR)的变化曲线。当性能提升趋于平缓时,就找到了一个较好的平衡点。例如,DCT旋转因子的相位精度对性能影响很大,我们最终给其分配了18位(Q2.16格式,即2位整数,16位小数)。
- 特殊处理FFT IP核:Xilinx FFT IP核有其内部的定点格式。我们需要确保输入到IP核的数据格式与其配置匹配,并理解其输出数据的缩放特性(如是否进行了除以N的操作)。
实操心得:
- 建立自动化测试平台:我们编写了脚本,能自动将浮点测试向量转换为定点激励文件,灌入FPGA仿真,并抓取输出结果与浮点参考对比。这大大加快了量化迭代速度。
- 关注“数据路径”和“控制路径”:数据路径(Datapath)上的信号位宽要精确控制。控制路径(如状态机、计数器)的位宽可以宽松一些,以节省逻辑资源。
- 利用DSP48E1的特性:Virtex-6的DSP48E1 Slice支持25x18位的乘法。我们的定点方案尽量让乘法操作的两个操作数位宽之和不超过43位,以在一个DSP单元内完成单次乘法,避免拆分运算带来的延迟和额外逻辑。
3.2 关键模块的硬件设计技巧
1. 可配置DCT-IV/FFT模块:我们没有从头写FFT,而是实例化了Xilinx的FFT IP核(LogiCORE IP)。关键配置如下:
- 变换点数:设置为256点,与PLC标准子载波数对齐。
- 数据格式:选择定点数,输入输出位宽根据我们的量化方案设定。
- 架构:选择流水线、流式I/O(Pipelined, Streaming I/O)。这种架构可以持续不断地接收和输出数据,吞吐量高,非常适合我们的实时流处理场景。
- 缩放调度:选择“块浮点”缩放。FFT每级蝶形运算后都可能溢出,IP核内部会自动进行右移缩放。我们通过仿真确定了最优的缩放方案,在防止溢出和保持精度之间取得平衡。
2. 对称扩展(SE)模块的优化实现:SE操作本质是数据的复制和拼接。最直观的实现是用一个双端口RAM作为缓冲区,先存入整个DCT输出块,然后按特定顺序(公式6)读出。但这样会引入至少一个块长的延迟。 我们的优化是:利用DCT输出是顺序流出的特性,设计一个前瞻缓存(Look-ahead Buffer)。当数据流出的同时,我们就将开头和结尾的样本存入一个小的FIFO。当需要输出扩展部分时,直接从FIFO中读取。这样,SE模块可以与DCT模块紧密流水,几乎不增加额外延迟。
3. FBMC多相滤波器组的复用架构:这是整个项目中最具挑战的部分。假设我们有M=256个子载波,原型滤波器长度L=4M=1024抽头,采用4倍过采样。那么整个滤波器组有4M个支路,每个支路对应一个多相分量(长度为L/4M=1?这里需要澄清:对于过采样滤波器组,通常是将原型滤波器的冲激响应按长度4M进行分相,得到4M个多相分量,每个分量实际上是一个短滤波器)。 直接实现需要4M个滤波器实例,不可行。
我们的架构如图5中“Polyphase Filter Bank”部分所示,其核心是一个时分复用(TDM)的卷积引擎:
- 系数存储器:将4M个多相滤波器的系数(每个可能只有几个抽头)按特定顺序存储在多个Block RAM中。
- 数据缓冲区:输入数据流被写入一个大型的循环缓冲区(Circular Buffer)。
- 地址生成单元(AGU):这是控制核��。它根据当前时钟周期和滤波器支路索引,精确计算出需要从数据缓冲区中读取哪个地址的数据,以及从系数存储器中读取哪组系数。
- 并行MAC单元:我们实例化了多个DSP48E1 Slice构成一个高度并行的MAC阵列。每个周期,AGU将一组数据和多组系数同时喂给MAC阵列,在一个周期内完成多个支路的乘累加运算。
- 累加与输出:MAC的结果被累加到对应的支路累加器中。当所有支路都完成一轮计算后,累加器结果被输出,并清零,开始下一轮计算。
通过精细设计AGU的状态机,并充分利用Block RAM的双端口特性,我们让这个卷积引擎以数倍于数据速率的时钟频率运行,从而实时完成了理论上需要海量硬件的滤波任务。
3.3 系统集成与AXI总线接口
为了让我们的硬件加速器能嵌入SoC,必须为其设计标准的AXI4-Stream接口用于高速数据流,以及AXI4-Lite接口用于控制寄存器访问。
- AXI4-Stream接口设计:这是数据通道。我们将其设计为与内部处理流水线深度解耦。使用FIFO作为跨时钟域和数据率匹配的缓冲区。
TVALID/TREADY握手信号必须严格按照协议实现,防止数据丢失或死锁。我们的经验是,将FIFO的“几乎满”和“几乎空”阈值设置得保守一些,为控制逻辑留出足够的反应时间。 - AXI4-Lite接口设计:这是控制通道。我们定义了一组寄存器,包括:控制寄存器(启动/复位)、状态寄存器(忙/错误标志)、配置寄存器(如变换点数M、SE长度α、滤波器系数表基地址等)。MicroBlaze上运行的驱动软件通过读写这些寄存器来操作硬件加速器。
- DMA配置:在SoC中,DMA是数据搬运的引擎。我们需要根据硬件加速器的吞吐能力(如每时钟周期处理Rp个样本)来配置DMA的突发传输长度和地址增量。确保DMA的爆发传输不会压垮加速器的输入FIFO,也不会让输出FIFO饿死。通常我们会将DMA的传输长度设置为处理块大小的整数倍。
4. 板级测试、性能分析与问题排查
4.1 测试平台搭建
理论仿真通过后,就要上板“炼狱”了。我们的测试平台基于Xilinx VC707开发板(搭载Virtex-6 FPGA),并连接了高速ADC(AD9467)和DAC(FMC204)子卡。
- 数字回环测试:这是第一步,也是最关键的一步。将发射机的输出直接连接到接收机的输入,在FPGA内部构成一个数字回路。这个测试的目的是验证定点化方案和硬件逻辑的正确性,排除模拟通道的影响。我们通过MicroBlaze生成伪随机序列,发送后接收,比较误码率。理想情况下应为零。
- 模拟回环测试:通过SMA线缆将DAC输出连接到ADC输入。这一步引入了数模/模数转换器(DAC/ADC)的量化噪声、非线性失真,以及板级噪声。这是验证系统在非理想条件下性能的关键。
- 真实PLC信道测试:将系统接入实际的电力线网络(注意:实验必须在安全隔离的条件下进行,并使用专用的PLC耦合器)。这是最终考验,会面临强烈的脉冲噪声、频率选择性衰落和时变性。
4.2 性能结果与对比分析
我们按照论文中的方法,测试了浮点模型、定点模型和硬件实测三种情况下的性能。关键指标包括信噪比(SNR)、均方误差(MSE)和符号错误率(SER)。
数字回环(理想信道)结果: 如表2所示,在理想信道下,DCT和FBMC方案的硬件实测MSE都低于3×10⁻⁵,证明了定点化设计和硬件逻辑的正确性。定点模型的SNR相比浮点模型有下降,这是预期的精度损失。而硬件实测的SNR比定点模型还略差一点,原因在于:我们仿真用的FFT模型是理想的,而Xilinx FFT IP核内部为了优化资源,其蝶形运算的舍入方式与我们的定点模型有细微差异,这导致了额外的误差。
模拟回环(SMA电缆)结果: 如表3和图9所示,性能出现明显下降。通过频谱分析仪观察,我们发现DAC输出路径上的耦合变压器是罪魁祸首。它的频率响应在3MHz以下严重衰减,并非理想平坦。这导致低频子载波的能量被削弱,SNR下降。这个坑告诉我们:在系统级设计中,模拟前端(AFE)的性能至关重要,甚至可能成为瓶颈。FPGA算法做得再好,AFE不行也是白搭。在后续处理中,我们不得不丢弃受影响的低频子载波。
资源消耗对比: 如表1所示,FBMC发射机/接收机对DSP48E Slice的消耗远超DCT方案(约多出40%),这主要归因于庞大的多相滤波器组。Block RAM的消耗也显著增加,用于存储滤波器系数和中间数据。而DCT方案的主要资源消耗在FFT IP核上,相对更“省”。
4.3 常见问题与调试实录
在调试过程中,我们遇到了无数问题,以下是几个最具代表性的:
问题1:数据流断流,系统卡死。
- 现象:DMA显示传输完成,但硬件加速器输出FIFO一直为空,或者AXI-Stream接口
TREADY信号一直为低。 - 排查:
- 首先检查控制状态机是否卡在某个状态。通过ChipScope(现在叫Vivado ILA)抓取状态机寄存器。
- 发现是输入数据FIFO的“空”信号异常置起,导致处理模块饿死。
- 追溯发现,AXI4-Stream主模块(DMA)在突发传输最后一个数据时,
TLAST信号与TVALID的时序不符合我们的预期。我们的FIFO控制逻辑在见到TLAST时提前进行了复位操作。
- 解决:修改FIFO控制逻辑,确保只在
TLAST有效且数据被成功写入(TVALID & TREADY)后的下一个周期才进行状态转换。教训:对IP核或外部接口的时序行为一定要做充分的仿真和边界情况测试。
问题2:FBMC输出信号频谱出现奇怪的杂散。
- 现象:在模拟回环测试中,用频谱仪观察FBMC发射信号,发现在某些固定频点有较高的杂散。
- 排查:
- 首先怀疑是滤波器系数定点化引入的误差。用MATLAB对定点系数进行频谱分析,未发现异常。
- 在FPGA内部,用ILA抓取滤波器组MAC单元的中间结果,发现累加器在某些时刻会溢出。
- 分析发现,我们的定点方案为累加器设置的位宽是足够的,但忽略了滤波器系数和数据在特定组合下,部分乘积的瞬时值可能非常大,虽然累加最终不会溢出,但中间乘积的位宽不够。
- 解决:在乘法器之后、送入累加器之前,增加一级饱和处理(Saturation)或保护位(Guard Bits)。确保任何中间结果都不会溢出。教训:定点仿真不能只关注最终输出,必须监控关键运算节点的动态范围,尤其是存在大量乘累加的信号路径。
问题3:系统性能随温度升高而恶化。
- 现象:长时间运行后,测得的SER逐渐升高。
- 排查:
- 怀疑是时钟抖动(Jitter)增加。但测量时钟源,未见明显异常。
- 检查电源纹波,发现FPGA核心电压在高温下有轻微下降和噪声增加。
- 使用 Vivado 的硬件管理器监测 FPGA 内部传感器的温度和电压,发现结温已接近芯片规格上限。
- 解决:
- 硬件上:改善散热,增加风扇或散热片。
- 设计上:重新进行时序分析,在高温模型(85°C)下检查建立/保持时间余量。发现某些跨时钟域路径的余量不足。通过添加输出寄存器(pipeline stage)和调整约束,修复了时序问题。
- 降额使用:在性能允许的情况下,略微降低系统时钟频率(如从100MHz降到95MHz),可以大幅改善高温下的稳定性。
- 教训:FPGA设计必须考虑最恶劣的工作条件(高温、低电压)。静态时序分析(STA)必须覆盖各种工艺角(Process Corner)和温度电压条件。
5. 工程总结与扩展思考
经过这个从算法到芯片的完整项目,我最深的体会是:通信算法工程师和FPGA硬件工程师必须紧密协作。算法人员需要理解硬件实现的约束(如定点精度、并行度、资源上限),而硬件人员需要理解算法的数学本质和性能目标。双方共同确定的系统架构和接口规范,是项目成功的基石。
对于DCT-IV-MCM和FBMC的抉择,我的结论是:没有绝对的好坏,只有适合与否。如果你的项目对成本、功耗和开发周期敏感,且信道条件尚可,DCT-IV-MCM是一个稳健而高效的选择。如果你的目标是追求极致的频谱效率、对抗强烈的邻道干扰,并且有充足的硬件资源和研发时间,那么FBMC值得投入。
这个SoC架构的成功,证明了其作为多波形通信原型平台的潜力。未来,我们可以很容易地将这个“硬件加速器”插槽,替换为5G NR的DFT-s-OFDM、或是雷达通信一体化(RadCom)的波形发生器。MicroBlaze和DMA构成的系统框架是通用的。
最后,分享一个关于资源评估的小技巧。在项目早期,不要只看FPGA厂商提供的资源利用率报告百分比。更重要的是评估关键路径的时序和Block RAM/DSP的利用率模式。例如,如果DSP利用率达到80%,但它们是均匀分布的,可能问题不大。但如果某个模块集中消耗了60%的Block RAM,这可能会成为布局布线的瓶颈,导致无法布线。早期进行层次化、模块化的资源预估和规划,能避免在项目后期陷入痛苦的优化泥潭。
