目录
一、理论基础
码长较长的低速LDPC编码在信噪比较低的应用场合呈现出其他编码无法匹敌的优势,已经证明非规则的LDPC码性能甚至优于Turbo码高速LDPC编码性能也比较好.尤其是在磁记录等一些应用场合,码长较短的高速LDPC编码有着较为广阔的应用前景。在不久的将来,LDPC编码将用于更多高速高质量的通信场合。而UWB通信技术因其传输速率高、功耗低等优点在短距离的网络中得到越来越多的关注。特别是UWB无线通信因其具有良好的时域可分辨性尤其适合于密集多径环境中的短距离多用户接入。在LDPC码的解码过程中,变量节点处理单元(VNU)起着至关重要的作用。
首先,VNU的作用在于根据接收到的校验节点信息和已知的变量节点信息,计算出每个变量节点的信息。这一过程是LDPC码解码的关键步骤,也是纠正错误的基础。
在LDPC码中,每个节点都由一个或多个比特组成,比特的值由发送方确定,并通过某种方式传递给接收方。VNU的核心功能就是对这些接收到的比特信息进行处理,以恢复或纠正原始发送的比特信息。
VNU的基本原理可以用数学公式进行描述。假设接收到的校验节点信息为C,已知的变量节点信息为X,那么可以通过以下公式计算每个变量节点的信息:
X = C + (S - T) % 2
其中,S和T分别为一个二进制加法树中的两个输入信号,% 2表示取模运算。这个公式中的加法和取模运算都是在二进制系统下进行的。
这个公式只是VNU工作的一个方面。在实际操作中,VNU还需要对接收到的数据进行分析和处理,如进行数据分类、数据解码、数据存储等操作。这些操作的具体实现方式和步骤会因为LDPC码的类型和应用场景的不同而有所差异。
此外,VNU在处理数据时还需要考虑到一些其他因素,如信道噪声、信号干扰等。这些因素可能会导致接收到的数据出现错误,因此在计算每个变量节点的信息时,需要对这些因素进行考虑和处理。这也是VNU在实现过程中需要解决的一个重要问题。
VNU的功能为计算"变量一校验"信息以及更新后验对数似然比。其硬件实现图如图2所示,3个"校验一变量"信息和1个比特初始化信息相加减去相对应的1个"校验一变量"信息所得到的值舍人 处理后作为查找表运算的输入,查找表用于计算公式. 变量节点处理单元(Variable Node processing Unit,VNU),其主要功能是处理从变量节点的信息到校验节点的信息。VNU模块的输入数据为校验节点传递给变量节点的信息。在VNU更新过程中,其主要涉及到垂直更新过程,译码判决过程两个环节。VNU模块的实现结构如下图所示:
从图可知,VNU更新模块模块的工作流程为:四个数据vnu_din0,vnu_din1,vnu_din2,vnu_din3分别做二级加法树运算得到求和结果,每一级加法计算延迟一个clock时钟周期,因此二级加法树总共延迟2个clock。同时,这四个信号通过延迟模块Delay与求和的结果做减法运算。此处,为了保持参与减法运算的输入数据保持同步,让输入的数据和输出的数据保存同步,防止时序混乱,vnu_din0,vnu_din1,vnu_din2,vnu_din3四个输入信号通过2个clock的延迟模块之后与求和结果进行减法。选择器模块则用于区分迭代初始阶段和开始迭代阶段的输出选择,当迭代开始前,则通过选择模块输出初始值,之后输出实时更新的迭代输出结果。由于在做加法计算过程中,如果输入的数据幅度过大,那么加法结果可能出现幅度超出当前位宽下的最大值,因此通过限幅模块,防止结果溢出。该模型最后输出四个返回值vnu_dout0,vnu_dout1,vnu_dout2,vnu_dout3。每次迭代完成之后,得到当前迭代之后的判决输出值。
总之,VNU是LDPC码解码的关键单元,其基本原理在于通过分析接收到的校验节点信息和已知的变量节点信息,利用数学公式进行计算,从而恢复或纠正原始发送的比特信息。实现VNU的过程涉及到硬件设计、算法优化等多个方面,需要根据具体的应用场景和要求进行设计和优化。
二、核心程序
module VNU_6(
output reg signed [31:0] Q1,
output reg signed [31:0] Q2,
output reg signed [31:0] Q3,
output reg signed [31:0] Q4,
output reg signed [31:0] Q5,
output reg signed [31:0] Q6,
input signed [31:0] R1,
input signed [31:0] R2,
input signed [31:0] R3,
input signed [31:0] R4,
input signed [31:0] R5,
input signed [31:0] R6,
input signed [31:0] L,
output P,
input clk,
input rst);
reg signed [31:0] P_sample;
assign P = P_sample[31]? 1'b1 : 1'b0;
always@(posedge clk or posedge rst)
begin
if(rst)
begin
P_sample = L;
Q1 = L;
Q2 = L;
Q3 = L;
Q4 = L;
Q5 = L;
Q6 = L;
end
else
begin
P_sample = R1 + R2 + R3 + R4 + R5 + R6 + L;
........................................
三、仿真测试结果
A14-43