1. 项目概述:为什么我们需要一个“更快”的极化码解码器?
在5G和正在到来的6G时代,我们总在谈论两个核心需求:更高的可靠性和更低的延迟。想象一下,你正在通过远程手术系统操作一台精密仪器,或者一辆自动驾驶汽车需要瞬间做出避障决策,这些场景下,数据包不仅不能出错,还必须“准时”到达。这就是URLLC(超可靠低延迟通信)要解决的终极难题。而信道编码,作为无线通信的“纠错保镖”,其性能直接决定了这个难题能否被攻克。
极化码,自2009年被Arikan教授提出以来,因其在理论上能逼近香农极限且编解码复杂度相对较低,迅速成为5G标准中控制信道的编码方案。它的核心思想很巧妙:通过一种称为“信道极化”的数学变换,将N个相同的信道变成一组“好信道”和“坏信道”。信息只通过那些几乎无差错的“好信道”传输,而“坏信道”则固定发送已知的比特(称为冻结比特)。解码时,最经典的算法是连续消除(SC)解码,它像走一棵深度为log₂(N)的二叉树,从根到叶逐比特判决,但这个过程本质上是串行的,导致解码延迟随着码长增加而线性增长,难以满足毫秒甚至亚毫秒级的URLLC要求。
为了加速,学术界提出了简化SC(SSC)和快速简化SC(fast-SSC)算法。它们不再傻傻地遍历每一个叶子节点,而是能识别出整棵子树的结构。比如,当一棵子树下面全是冻结比特(Rate-0节点)时,直接输出一串0;当全是信息比特(Rate-1节点)时,直接对输入做硬判决。更进一步,还能识别出重复(REP)节点和单奇偶校验(SPC)节点,实现一步解码。这就像在迷宫中,你不是检查每一个岔路,而是直接认出某些死胡同或直通出口的走廊,大大加快了速度。
然而,传统极化码有个“天生”的限制:它只能由2x2的二进制核通过克罗内克积构造,这导致其码长N必须是2的幂次方(如128, 256, 512...)。现实通信系统需要灵活的码长来适配不同的数据包大小和信道条件。为了得到非2的幂次方的码长(比如1500字节的数据包),传统做法是“打孔”或“缩短”——从一个更大的2的幂次方“母码”中删除一些比特。但这就像为了做一件M码的衣服,先做一件XL的再剪掉一部分,不仅浪费布料(增加解码复杂度),剪裁方式(打孔/缩短模式)还直接影响衣服的合身度(纠错性能)。
多核极化码的出现,优雅地解决了这个问题。它允许在构造生成矩阵时,混合使用不同维度的核,比如2x2的二进制核(T2)和3x3的三元核(T3)。这样,码长N可以是2^a * 3^b的形式,提供了极大的灵活性。更重要的是,研究表明,对于相同的目标码长(如N=48),多核构造在纠错性能上显著优于打孔和缩短方法,同时解码复杂度(需要计算的LLR数量)也更低。这相当于直接为你量身定制了一件M码的衣服,用料更省,穿着更舒适。
但挑战也随之而来。现有的多核解码器硬件实现,大多基于基础SC算法,延迟依然很高。将高效的fast-SSC算法扩展到多核(尤其是混合二进制和三元核)场景,并设计出对应的低延迟硬件架构,就成了一个既有理论价值又有迫切工程需求的问题。这正是我们这次要深入探讨的核心:如何设计并实现一个支持多核极化码的、基于fast-SSC算法的低延迟FPGA解码器。
2. 核心思路与算法创新:如何“修剪”多核极化树?
要理解我们的优化,首先得看看fast-SSC算法是如何工作的。它将解码过程建模为一棵“极化树”。树的叶子节点对应最终的比特,中间节点对应编解码过程中的中间状态。传统的SC解码需要访问每一个节点,而fast-SSC算法的精髓在于“识别并合并”——它能识别出整棵子树属于某种特殊类型(如R0, R1, REP, SPC),然后直接计算该子树的输出,无需深入其内部。
2.1 从单核到多核:解码函数的扩展
在纯二进制极化码中,消息在节点间传递依赖三个核心函数:f、g和Combine(对应论文中的f_b, g_b, C_b)。f函数用于计算向左子节点传递的对数似然比(LLR),g函数在获得左子节点的硬判决后计算向右子节点传递的LLR,Combine函数则合并左右子节点的判决结果。
当引入三元核(3x3)后,树结构从二叉树变成了三叉树。一个父节点现在有三个子节点:左(left)、中(center)、右(right)。因此,消息传递函数也需要扩展:
- f_T: 计算向左子节点传递的LLR,现在是三个输入LLR的最小和操作。
- g_T1, g_T2: 分别用于计算向中子节点和右子节点传递的LLR,公式中需要结合已解码的左子节点或左、中子节点的比特。
- C_T: 合并左、中、右三个子节点的硬判决比特,得到父节点的判决。
硬件设计的关键在于,我们需要一个统一的数据通路(Datapath),能够通过配置来执行这些不同的函数,而不是为每种核单独设计一条路径。
2.2 节点合并模式的“组合拳”
仅仅支持多核的基础函数还不够。fast-SSC算法的威力在于识别更复杂的节点合并模式,从而跳过大量中间计算。我们这项工作的核心贡献,就是系统性地定义并实现了五组(Group A-E)高效的节点合并模式,特别是针对长码和混合核场景进行了深度优化。
Group A & B & C:针对长码的深度合并这些组处理的是由多个层级节点合并而成的“超级节点”。它们的目标是消除部分串行解码步骤。
- Group A (如 R0tSPC, R0t-1REPSPC): 这类模式的特点是,一个节点的左侧连续多个分支都是R0(全冻结)节点,只有最右侧的分支是一个有信息的节点(如SPC或R1)。解码时,我们可以利用左侧全为零的特性,简化右侧节点的LLR计算。例如,在
R0tSPC节点中,右侧是一个SPC节点。由于左侧输入已知为零,传递给右侧SPC节点的LLR可以提前进行模加(Modulo Sum)操作,从而并行计算多个SPC子块的奇偶校验,大幅减少步骤。 - Group B (如 REPtSPC, REPtR1): 这类模式合并了多个REP节点和一个SPC或R1节点。我们的创新在于提出了一种更快的解码算法。传统方法可能需要先解码REP节点,编码,再解码SPC节点。我们通过数学变换,将REP节点的信息比特计算和SPC节点的奇偶校验计算解耦并并行化。具体来说,我们先并行计算出所有t个REP节点的信息比特,然后将其编码为一个短序列,最后利用这个编码结果直接并行计算SPC节点的输出比特,避免了中间的串行等待。
- Group C (如 REPSPCt, R0R1t): 这是对已有合并模式(如REPSPC)的进一步泛化,支持更深的子树合并。我们为
REPSPCt设计了一种直接算法,可以并行计算部分和比特,最后再进行一次整体的奇偶校验,而不是逐级合并。
实操心得:模式识别的代价与收益识别这些复杂模式本身需要额外的逻辑和预计算(离线进行)。在FPGA实现中,我们需要在“模式识别带来的延迟减少”和“识别逻辑增加的硬件复杂度/关键路径延迟”之间做权衡。我们的策略是,只为那些在典型码长码率下出现频率高的模式(通过统计分析得到,如表1所示)实现专门的硬件模块。对于出现频率低的模式,则回退到基础的逐节点解码,这样总体收益最大。
Group D:基础函数的流水线合并这组优化非常“接地气”。我们发现,在解码过程中,大量的f、g、Combine基础操作是连续出现的。例如,在深度优先遍历树时,可能会连续执行多个Combine操作。与其逐个执行,不如将它们合并为一个宏操作,如Cb_t(连续t个Combine)。我们在数据通路中为这些连续操作设计了专用的处理单元,它们可以在一个或少数几个时钟周期内完成原本需要t个周期的工作,相当于实现了指令级并行。虽然单个操作延迟很低,但因其执行频率极高(可占总体指令的26%),这种优化对降低总延迟的贡献非常可观。
Group E:三元核特有的高效模式这是针对混合核场景的独家优化。在多核极化树中,当三元核和二进制核混合时,会产生一些特有的、频繁出现的子树结构。我们识别出了两种高效模式:R0R1R0和R02R1R0。
- R0R1R0模式: 想象一个三元节点,它的左、右子节点是R0(全零),中子节点是R1(全信息)。对于这种结构,我们推导出了直接计算公式。中子节点(R1)的判决可以基于父节点的LLR以及左右子节点LLR的最小值快速得出。然后,整个节点的输出可以直接由这个R1节点的判决结果复制得到,完全跳过了对左右R0节点的遍历。
- R02R1R0模式: 这是更复杂的一种变体,但原理类似。我们通过分析树结构,推导出了将中间R1节点的解码与最终输出直接关联的公式,实现了多步合并为一步。
这些针对三元核的专用模式,是降低混合核解码延迟的关键。它们不是通用的,但正因为其特异性,才能实现极致的优化。
3. 硬件架构设计与FPGA实现细节
有了高效的算法,下一步就是将其“铸造”到硅片(或FPGA逻辑单元)上。我们的硬件架构基于经典的fast-SSC解码器框架,但进行了全方位的扩展和优化,以支持多核和新的节点合并模式。
3.1 整体架构与数据流
解码器可以看作一个由控制器驱动的专用处理器。
- 指令内存: 存放离线生成的解码“程序”。这个程序是一系列指令序列,每条指令告诉ALU接下来执行哪个函数(如
f_T,SPC,R03R1等)以及相关参数(如节点大小)。指令长度仅为6比特,非常紧凑。 - 控制器: 取指、译码,并协调各个模块的工作。
- 处理单元(ALU): 这是解码器的核心,实现了我们之前讨论的所有函数(表3)。它从α-RAM读取LLR值,从β-RAM读取部分和比特,执行计算,并将结果写回相应的内存。
- 内存子系统: 这是设计的关键和瓶颈所在。
- 信道LLR内存 (Channel α RAM): 存储从信道接收到的初始LLR。为了隐藏数据加载时间,我们采用双缓冲(Double Buffering)设计。当解码器在处理当前帧时,下一帧的LLR可以同时被加载到另一个内存块中,实现流水线操作。
- 内部LLR内存 (Internal α RAM): 存储解码过程中产生的中间LLR值。我们采用了类似[18]中的分块存储策略,根据当前处理的是二进制节点还是三元节点,动态调整访问位宽,以匹配处理单元
Pe的并行度。 - 部分和内存 (β RAM): 存储解码过程中产生的硬判决比特(部分和)。我们使用了三个双端口RAM,分别对应三元节点的左、中、右子节点(对于二进制节点,则使用左和中RAM)。这种设计便于
Combine操作的数据访问。 - 输出内存: 独立于β-RAM,用于存储最终解码出的码字,并通过较窄的总线输出,避免阻塞解码流水线。
3.2 关键功能模块的硬件实现
让我们深入几个核心功能模块,看看它们是如何在硬件上被高效实现的。
SPC(单奇偶校验)节点解码器: 这是最复杂的模块之一。其核心是一个“比较-选择”电路,用于找到可靠性最低(LLR绝对值最小)的比特位置。对于小尺寸(Nν_SPC ≤ 8)的SPC节点,我们采用全组合逻辑,在一个时钟周期内完成所有操作:计算所有比特的硬判决,计算奇偶校验和,找到最小LLR位置,并在必要时翻转该比特。对于大尺寸SPC节点,我们插入精心优化的流水线级,在面积和速度之间取得平衡。在多核支持下,我们分别实现了二进制SPC(SPCb)和三元SPC(SPCt)的变体。
REPSPC节点解码器: 其架构如图6所示。这是一个纯组合逻辑模块,输入到输出在一个时钟周期内完成。它内部包含一个REP解码器、两个并行的SPC解码器(分别假设REP输出全0和全1)以及相应的选择逻辑。关键路径在于g函数 -> SPC -> Combine。通过并行计算两条假设路径,最后根据REP的实际结果进行选择,避免了串行计算带来的延迟。
R0tR1节点解码器(以R03R1为例): 如图7所示,这是一个非常优雅的设计。对于R03R1节点(左侧3级R0,右侧一个R1节点),其输出是右侧R1节点的两个比特(β0, β1)的重复。我们发现,β0和β1可以直接通过将所有奇数索引和偶数索引的输入LLR分别相加,然后取符号位来获得。硬件上只需要两组加法器树和符号检测器,无需饱和检查,纯组合逻辑实现,单周期完成。
REPtSPC/R0tSPC节点解码器: 这些模块(如图8,9所示)的实现体现了面积与速度的折衷。以R02SPC为例,它需要先将输入LLR按模4分组并累加,然后将结果送入一个小的SPC核(处理4个输入)。这里引入了一级流水线寄存器来打破长关键路径(加法器树 -> 饱和 -> SPC逻辑)。虽然增加了一个时钟周期的延迟,但换来了更高的工作频率,总体上是划算的。R02REPSPC的设计思路类似,但使用了一个REPSPC核作为子模块。
统一的Group B/C解码器: 为了节省硬件资源,我们为Group B(REPtR1/SPC)和Group C(REP/R0-R1t/SPCt)的多种模式设计了一个可配置的统一模块(如图10,11所示)。通过一组控制信号(如REP_flag,PC_flag)来选择当前是哪种节点类型,并复用内部的REP、SPC、奇偶校验等子模块。这种资源共享策略显著减少了逻辑单元(LUT)的使用量,是FPGA设计中的常用技巧。
3.3 量化与性能权衡
在硬件上,我们无法用无限精度的浮点数表示LLR。必须进行定点量化。我们采用Q(Qi, Qc, Qf)格式,其中Qi是内部LLR的位宽,Qc是信道LLR的位宽,Qf是小数部分位宽。
通过仿真(如图12所示),我们发现对于P(1024,512)码,采用(5,4)的量化方案(即内部5比特,信道4比特)其误码性能已经非常接近浮点仿真结果,硬件实现代价却小得多。
此外,我们提供了“无损”和“有损”两种解码模式。无损模式会禁用Group C中那些可能引入微小性能损失的模式(如REPSPCt),确保纠错性能与原始fast-SSC算法完全一致。有损模式则启用所有节点合并模式,以获得最低的延迟,但可能会带来0.1-0.2 dB的性能损失(如图12(b))。在实际系统设计中,可以根据URLLC业务对延迟和可靠性的具体容忍度来灵活选择模式。
4. 性能评估与结果分析
理论再好,也要靠实测数据说话。我们在Xilinx FPGA平台上实现了整个解码器,并使用Vivado 2019.1进行综合、布局布线和性能评估。
4.1 延迟优化效果
我们对比了提出的算法与原始fast-SSC算法以及我们前序工作[19]的延迟(以所需时钟周期数衡量)。
- 纯二进制长码: 对于码长N=1024,码率R=1/2的极化码,在并行度
Pe=120时,我们的算法相比fast-SSC降低了52.3%的延迟。更重要的是,随着码长增加,优化效果更显著。对于N=32768的长码,相比[19](主要针对短码优化),我们的新算法带来了37.8%的额外延迟降低。这是因为长码的解码延迟主要消耗在LLR传递(f,g,C函数)上,而我们的Group D优化(基础函数合并)正好针对了这一瓶颈。 - 码率无关性: 如表5所示,fast-SSC及其衍生算法的延迟主要取决于冻结比特的图样,而与码率R没有简单的单调关系。在某些码率(如R=1/8或7/8)下,由于频繁出现R0或R1节点,延迟天然就更低。我们的算法在所有码率下都保持了最低延迟。
- 多核混合码: 这是本文的重点。对于码长N=1536(由1个三元核和9个二进制核构成)的混合核极化码,在
Pe=240时,相比传统的多核SC解码器[18],我们实现了惊人的84.6%的延迟降低。这充分证明了我们提出的多核fast-SSC算法和针对三元核的特有模式(Group E)的巨大威力。
4.2 吞吐量与资源消耗
我们以P(1024,512)码为例,在Xilinx FPGA上对比了多种先进解码器架构,结果汇总于表8。
- 吞吐量: 在
Pe=120,最大时钟频率约300 MHz的条件下,我们的多核解码器实现了432 Mbps的信息吞吐量。这比最快的fast-SSC变体高出66.8%,比我们之前的工作[19]高出9.9%。高吞吐源于低延迟和高时钟频率的结合。 - 资源消耗:
- LUT(查找表): 我们的设计消耗的LUT数量与[6],[9]相当,但比专注于内存优化的[13]多22.5%,这是因为我们实现了更丰富的指令集和功能模块。与[19]相比,由于增加了多核支持和新功能,LUT增加了19.6%。
- 寄存器(Register): 消耗量适中,与其他设计处于同一量级。比[19]多25.6%,主要用于流水线寄存器和状态存储。
- 块内存(BRAM): 我们的设计比[6]和[9]节省了6%-8.2%的RAM,这得益于树修剪减少了对中间值的存储。但比极致内存优化的[13]多用了1.2倍的RAM。多核架构本身需要额外的存储来管理更复杂的树结构。
- 关键路径与频率: 我们的设计最大时钟频率略低于[6]和[9],主要是因为增加了多路选择器和更复杂的路由,以支持多核和多种节点模式,这稍微增加了关键路径的延迟。
4.3 与组合逻辑SC解码器的对比
文献[12]提出了一种全组合逻辑的SC解码器,其思路是将整个解码网络展开成纯组合电路,理论上一个时钟周期就能出结果,吞吐量极高。我们的对比显示,其吞吐量是我们设计的1.87倍,且内存占用少一半。然而,这是以巨大的面积为代价的:其LUT用量是我们的8倍,寄存器用量是4倍。这种面积开销对于许多资源受限的终端设备或需要支持多通道的基站侧来说是难以接受的。我们的半并行架构在面积、功耗和性能之间取得了更好的平衡,更具实用价值。
5. 实现中的挑战与避坑指南
将这样一个复杂的算法映射到高效的硬件上,绝非易事。这里分享一些从项目实践中获得的宝贵经验。
5.1 并行度(Pe)的选择艺术
并行度Pe(Processing Elements的数量,实际为2P)是解码器设计中最关键的参数之一。它代表了同时能处理多少个LLR或比特。
- Pe太小: 计算资源不足,解码一个节点需要很多个时钟周期,延迟高,吞吐量低。
- Pe太大: 硬件资源(逻辑和内存带宽)消耗剧增,但性能提升会进入瓶颈期。利用率公式
α_sp = log2(N) / (4Pe + log2(N/4Pe))表明,即使Pe较小,对于长码也能达到较高的吞吐利用率。盲目增大Pe不仅浪费资源,还可能因为布线拥塞导致时钟频率下降。
我们的经验: 对于最大支持码长N=32768的解码器,经过综合仿真权衡,Pe=120和Pe=240是两个性价比很高的选择。它们能在合理的资源消耗下,为从短码到长码的各种码长提供较高的吞吐量。在实际项目中,需要根据目标码长范围、目标吞吐率和FPGA芯片资源来精确确定Pe值。
5.2 内存架构的设计哲学
内存访问是解码器性能的另一个主要瓶颈。我们的设计遵循了几个原则:
- 双缓冲与流水线: 信道LLR加载时间必须被解码时间隐藏。双缓冲内存是实现“计算-传输”重叠的关键。确保加载下一帧数据的同时,不影响当前帧解码的内存访问。
- 位宽匹配与分块: 内部α-RAM和β-RAM的位宽必须与处理单元Pe的位宽匹配。对于混合核,三元节点需要同时访问三个子节点的数据,我们采用多bank设计,每个bank宽度为P或P_b/t,通过一个交叉开关(Router)来灵活调度数据,确保每个周期都能喂饱ALU。
- 输出解耦: 最终码字输出使用独立的内存和较窄的总线。这样,解码器在输出上一帧结果的同时,可以立即开始下一帧的解码,避免了输出阻塞。
5.3 验证策略:确保功能正确性
在如此复杂的硬件设计中,验证工作可能比设计本身更耗时。
- 分层验证: 首先用高级语言(如Python/C++)实现算法模型,并生成大量测试向量(包括LLR输入和期望的比特输出)。然后,对每个硬件模块(如SPC、REPSPC等)进行独立的RTL仿真,对比输出。
- 协同仿真: 将整个解码器的RTL模型与软件参考模型连接起来,进行大批量随机帧的仿真。在测试平台中,模拟真实的信道(AWGN,BPSK调制),生成含噪的LLR输入给RTL解码器,并将其输出与软件解码结果对比。
- 资源与时序约束: 综合后必须仔细检查时序报告,确保关键路径满足时钟要求。对于高速设计,可能需要手动调整流水线级数或对关键模块进行物理位置约束。
5.4 灵活性与可配置性
一个实用的解码器不能只针对一种特定的码长或核序列。我们的设计通过“指令”来实现高度可配置。
- 离线预计算: 针对每一种目标码长、码率和核序列,我们用一个独立的软件程序预先分析其极化树结构,识别出所有可用的节点合并模式,并生成对应的指令序列。这个指令序列就像这个特定码的“解码微程序”。
- 运行时加载: 解码器上电后,将对应码字的指令序列加载到指令RAM中。控制器按序执行这些指令,即可完成解码。这意味着同一套硬件,可以通过加载不同的指令,来解码不同参数(N, R, 核序列)的极化码,极大地增强了灵活性。
这个项目从算法创新到硬件实现,最终在FPGA上验证了其显著的性能提升。它不仅仅是一个学术研究,更是面向未来6G URLLC应用的一次扎实的工程探索。通过算法与硬件的协同优化,我们证明了在保持优异纠错性能的前提下,大幅降低极化码解码延迟是可行的,这为未来超低延迟通信系统的实现提供了有力的硬件支撑。