5G NR LDPC编译码

5G NR LDPC编译码
LDPCLow-Density Parity-Check Code低密度奇偶校验码。了解LDPC的编译码首先要了解稀疏矩阵H与tanner图。1、校验矩阵H1 的个数非常少绝大多数都是 0。5G NR BG1基图1的架构有22 列 是留给系统比特信息位46列的校验位。如果提升因子是384的话那H矩阵的大小就是总行数校验方程数 46 *384 17,664 行总列数总比特数 68 *384 26,112 列。在这个 17664 *26112的超级大矩阵里前 22 *384 8,448列对应的是你输入的系统信息比特。后 46 *384 17,664 列对应的是计算出来的校验比特。那提升因子384是什么意思呢它的意思是再BG1里的46*68的每个元素都是384*384的矩阵。如果基图里的元素是-1或者手册里留空它对应的是一个 的384*384全 0 矩阵里面全都是 0。如果基图里的元素是0它对应的是一个 384*384的单位矩阵主对角线上全是 1其余全是 0。如果基图里的元素是一个正整数P比如 23它对应的是一个 把单位矩阵循环右移 P比如 23位后得到的矩阵。2、tanner图任何一个 矩阵都可以画成一张 Tanner 图。图上只有两类节点它们之间绝不互连只能跨类别连接变量节点 (Variable Nodes, V-nodes) 对应 矩阵的列代表接收到的信号数据比特。校验节点 (Check Nodes, C-nodes) 对应 矩阵的行代表约束条件方程。如果矩阵的第 行第 列是 1就在第 个校验节点和第 个变量节点之间连一条线。举一个例子。假设我们在空中传输了 4 个比特的数据它们分别是 x1, x2, x3, x4。 为了防止传输错我们在发射前给它们加了 2 个约束条件校验方程。规定所有参与方程的比特相加必须是偶数也就是异或结果为 0变量节点(Variable Node, 简称 V 节点)x1, x2, x3, x4负责接收来自手机天线信道的原始物理信号并结合校验节点给它的反馈决定自己到底是0还是1。校验节点(Check Node, 简称 C 节点)就是那些约束方程校验条件。在上面的例子里一共有 2 个校验节点方程 A 和 方程 B。负责检查和它相连的几个变量节点看它们加起来符不符合偶校验异或为 0的规则。如果不符合它就要想办法“纠正”犯错的节点。Tanner 图把方程组画成一张“网”.LDPC怎么实现高效编译码的呢LDPC低密度/稀疏校验矩阵决定了这种编码纠错性能的‘上限’而 QC准循环结构则是决定它能够成功在芯片上落地、跑出 Gbps 极速吞吐量的‘钥匙’。稀疏校验矩阵LDPC提供强大的纠错能力。它的作用 保证矩阵 H里的1足够稀疏每个比特只参与极少数的校验方程。带来的好处 使得译码可以用“信念传播BP”或者“最小和Min-Sum”这种局部迭代的算法。这种算法的复杂度与码长仅仅成线性关系。这让大码长、超强纠错性能在理论上变得可行性能逼近香农极限。准循环QC解决硬件实现的困难它的作用 将随机的1规整化。强制要求矩阵必须由一个个 Z * Z如 384*384的全 0 块或循环移位块拼成。硬件不需要存储几万*几万的完整大矩阵只需要存一个几十 *几十的“基图Base Graph”和移位参数P。超高并行 硬件可以开辟 Z位宽的并行总线配合桶形移位器通过组合逻辑电路实现能在 1 个时钟周期内完成整个块的错位对齐让 Z个比特同时进行处理。什么是桶形移位器多路选择器MUX。每一个输出管脚比如out[0]后面都接了一个巨大的 384选1 的多路开关384-to-1 MUX。这个开关的 384 个输入端分别接着in[0]、in[1]...in[383]错位引过来的导线。这个开关的控制端连着门牌号参数 P。编码的过程编码输出 系统比特原样输出校验比特极致性能全并行架构 —— 只需 2 ~ 3 个时钟周期算校验位只需要 2~3 个 clk速度快到飞起但代价是在 FPGA 内部会消耗比较多的组合逻辑资源LUT。资源折中流水线串行/半并行架构 —— 大约需要 23 ~ 48 个时钟周期。算完这 46 组校验位大概需要 46 个时钟周期左右。如果你的 FPGA 时钟是 300MHz46 个周期也仅仅只有 0.15 微秒us对整个通信系统的时延来说依然是微乎其微的完全不卡脖子。译码的过程译码的算法是要用Min-Sum 算法最小和算法对标准 “BPBelief Propagation置信度传播算法” 的一种极致硬件简化。Min-Sum 算法是怎么简化的符号部分 把所有输入 LLR 的正负号乘起来。绝对值部分 直接找出所有输入 LLR 绝对值里的“最小值”。这就是 Min-Sum最小和 名字的由来核心就在于一个Min找最小值。因为 Min-Sum 每次都简单粗暴地直接取最小值这会导致算出来的 LLR 分数比理论上的标准 BP 算法偏大了一点点。这会带来大约0.2 dB 的误码率性能损失。为了在“计算简单”和“性能完美”之间取得平衡工程上引入了一个补丁叫Normalized Min-Sum归一化最小和算法完全不变依然是用比较器找出最小值。只是在最终输出前把这个最小值乘以一个固定的缩放因子 alpha通常在 0.7 到 0.85 之间。比如刚才算出来是 1.2我们乘以 0.75变成 0.9 输出出去。就这么一个小小的乘法补丁就能把那 0.2 dB 的损失活生生追回 0.15 dB 以上几乎逼近了标准 BP 算法的极限性能举个例子比如BG1,46*68,384*384的提升因子。校验节点位17664个节点。那第一次每个节点算出来不同的系统比特与校验比特的0还是1的概率同上面的一样然后把这个17664个校验节点里相同比特的LLR相加。LDPC 编译码的本质就是利用‘局部已知’的确定性去消灭‘局部未知’的不确定性。每一个比特都不是孤立存在的它的对错交由和它绑定在同一个方程里的其他‘目击证人’其余比特共同通过数学奇偶性推导出来译码的迭代次数以及怎么算成功在 FPGA 或 C 语言实现译码时每一轮迭代其实都包含两个雷打不动的标准动作动作一校验节点更新CNU。 各个朋友圈独立“找最小值、算符号”这就是前面讨论的 Min-Sum 计算。动作二变量节点更新VNU。 这就是你说的“LLR 相加”。 每一个变量节点把信道传来的原始把握和所有它参加的朋友圈吐回来的最新意见全部加在一起。用于尝试收敛判决终极相加 每一轮相加完变量节点都会顺便产生一个“终极分数”。译码器会拿着这个终极分数的正负号去尝试乘一下矩阵H即 c*H^T 0。如果全过关了说明这轮相加已经把所有错都纠正了译码可以提前下班提前终止迭代不用非得跑满 8 次5G 芯片里通常把最大迭代次数设为 6 次、8 次或 10 次。几个问题1、编码译码都需要桶形移位器吗编码也会用到桶形移位器去对齐系统位但编码器只需在刚开始计算时让数据“单向流过”一次。而译码阶段因为要有时分复用的 68 次流水且还要来回迭代 8 轮这就意味着数据在 RAM 和计算单元之间“每荡一次秋千”桶形移位器就要拼命切一次开关。因此它 95% 的工作寿命都在服务于译码器。2、译码的桶形移位器怎么理解如果输入的LLR为6bit那译码就是每次移位384个LLR,68次流水迭代8次。可以理解为编码的桶形移位器是生成校验方程译码的移位寄存器是把LLR的位置对应到该有的位置中去。射频和解调模块负责在前方冲锋陷阵把噪声干扰转化为一串串带有信心强弱的 LLR 软信息而译码加速器则坐在后方手握 3GPP 标准的移位密码本利用分级桶形移位器作为立交桥每时每刻都在疯狂地调制和重组这些 LLR 的输出顺序。顺序调对一次方程就解开一层。只有把 LLR 还原到本来的位置并排的 CNU 才能正确地找出最小值、相加、迭代最终把被噪声中的弱信号从悬崖边救回来。译码的过程中需要考虑的问题1、饱和截断在电脑里用 MATLAB 仿真时数据是浮点数Float/Double一个 LLR 分数算出来可以是128.5也可以因为信心爆棚算出来10054.2。浮点数没有上限可以无限大。但是到了 FPGA 里为了省资源、跑出高吞吐我们必须把数据硬生生压缩到固定的位宽里。一旦位宽固定了硬件世界就存在一个绝对的“天花板”和“地板”。如果在第 3 轮迭代相加时一个系统比特的表现非常好由于周围朋友圈都在夸它它的 LLR 分数一路上涨从原始的20累加到了35。在普通的二进制加法器电路里如果不做任何特殊处理35存进 6-bit 寄存器时会发生溢出回绕Wrap-around。硬件在读这个补码时一看到最高位是1就会把它当成一个负数一翻译100011变成了-29这个比特本来是个纯洁的0而且信心高达35。结果就因为加法器溢出在硬件电路里瞬间被扭曲成了“我有极大的把握我是 1-29” 这叫数值逆转它会像病毒一样顺着 Tanner 图把周围的朋友圈全部带歪导致误码率BER性能雪崩。为了防止这种颠倒黑白的惨剧发生硬件工程师必须在加法器后面接一段饱和逻辑Saturation Logic。针对 6-bit 系统如果算出来是35超过31强行截断为31如果算出来是120超过31强行截断为31如果算出来是-45跌破-32强行截断为-32这样一来虽然我们损失了一部分“到底有多确定”的精度从 35 变成了 31但它牢牢保住了数据的正负号极性它保证了优秀的比特依然是优秀的绝对不会发生判决逆转。2、块大小Z动态切换与内存寻址速率匹配模块De-rate matching、BRAM 存储管理必须写一套极其严密的状态机FSM。你要根据高层下发的配置动态计算每一帧的地址步长。一旦地址算错或者有效数据指示TSTRB或TKEEP没给对IP 核读到不规整的数据就会直接挂死Hang住。3、LLR的符号位Min-Sum 算法对符号位有极度严格的数学定义通常标准里默认 0 映射为正1 映射为负-。4、吞吐量Throughput与迭代次数的动态平衡5G 物理层有极其严苛的物理层时延限制尤其是 URLLC 超低时延场景。LDPC 译码是一个“弹性耗时”的模块信道好时 迭代 2 轮方程就全解开了提前终止Early Termination亮起绿灯耗时极短。信道极差时 它会死磕到底一直迭代到你设定的最大轮数比如 8 轮或 12 轮才绝望地放弃。在系统设计时你必须做最坏的打算。如果全场所有的译码块CB全部卡死在最大迭代次数比如 12 轮后级的速率匹配和 HARQ 缓冲区会不会被压爆溢出需要在 MATLAB 里做一个吞吐量仿真算好在最大迭代次数下IP 核的平均输入流水线需要卡多大的间距Backpressure反压信号TREADY的处理防止前级解调源源不断的数据把译码 RAM 给撑爆。5. Vivado 时序收敛Timing Closure5G LDPC 译码核是 FPGA 里的资源吞噬兽和时序杀手。由于它内部含有 384 路庞大的桶形移位器布线和比较器树在 300MHz~400MHz 的高频下非常容易发生 Setup Time建立时间违例。别把外围逻辑和 IP 核贴得太近 灌入 IP 核前的数据一定要至少打 1~2 拍寄存器Pipeline Register从 IP 核出来的译码结果Hard Decision也必须先打拍再送给后级。用寄存器把 IP 核的超长组合逻辑链条隔断。位置约束Pblock 如果芯片整体资源很满你可能需要在 Vivado 里为这个 LDPC IP 核专门划定一个区域Pblock Constraint让编译器把相关的 RAM 和 LUT 尽量死死地挤在一起避免信号跨越半个芯片去连线导致线延时Routing Delay爆炸。