跳转至

第三章:编码解码原理

深入解析 WiFi 信道编码技术:Scrambler、BCC 卷积码、LDPC 码、交织的完整原理与实现


3.1 编码概述

3.1.1 编码流程

WiFi 发送端编码流程:

┌─────────────────────────────────────────────────────────┐
│              WiFi 发送端编码流程                          │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  MAC 帧 ──► Scrambler ──► 编码器 ──► 交织 ──► 星座映射   │
│    │            │           │         │         │       │
│    │            │           │         │         ▼       │
│    │            │           │         │    OFDM 调制     │
│    │            │           │         │                │
│    ▼            ▼           ▼         ▼                │
│  扰码      去直流      纠错编码   抗突发                 │
│  随机化      平衡      (BCC/LDPC)  错误                  │
│                                                         │
└─────────────────────────────────────────────────────────┘

接收端解码流程 (逆向):

OFDM 解调 ──► 解映射 ──► 去交织 ──► 解码器 ──► Descrambler ──► MAC 帧

3.1.2 编码方案演进

┌─────────────────────────────────────────────────────────┐
│              WiFi 编码方案演进                            │
├──────────┬─────────┬─────────┬─────────┬─────────┬──────┤
│  标准    │ 802.11a │ 802.11n │ 802.11ac│ 802.11ax│802.11│
│          │ /g      │         │         │         │ be   │
├──────────┼─────────┼─────────┼─────────┼─────────┼──────┤
│ 编码类型 │   BCC   │ BCC+    │ BCC+    │ BCC+    │BCC+  │
│          │         │ LDPC    │ LDPC    │ LDPC    │LDPC  │
│ 卷积码率 │ 1/2,2/3 │ 1/2-5/6 │ 1/2-5/6 │ 1/2-5/6 │1/2-  │
│          │ 3/4,5/6 │         │         │         │ 5/6  │
│ LDPC 码率 │   -     │ 1/2,3/4 │ 1/2,3/4 │ 1/2,3/4 │1/2-  │
│          │         │ 2/3,5/6 │ 2/3,5/6 │ 2/3,5/6 │ 5/6  │
│ 最大码块 │   -     │ 648/1296│ 648/1296│ 648/1296│ 648/ │
│  长度    │         │ /1944   │ /1944   │ /1944   │ 1296 │
│          │         │ bits    │ bits    │ bits    │ /1944│
└──────────┴─────────┴─────────┴─────────┴─────────┴──────┘

BCC (Binary Convolutional Code):
├─ 约束长度 K=7
├─ 码率可调 (通过打孔)
└─ Viterbi 解码

LDPC (Low Density Parity Check):
├─ 接近香农极限
├─ 迭代解码
└─ 高信噪比下性能优

3.2 Scrambler (扰码器)

3.2.1 扰码器原理

扰码器目的:

1
2
3
4
5
6
7
8
9
问题:
├─ 长串 0 或 1 导致接收端时钟恢复困难
├─ 频谱能量集中,不符合频谱模板
└─ DC 分量过大,影响交流耦合电路

解决方案:
├─ 使用伪随机序列与数据异或
├─ 使输出数据接近随机分布
└─ 频谱能量均匀分布

WiFi 扰码器多项式:

生成多项式:S(x) = x⁷ + x⁴ + 1

LFSR 结构:

    ┌───┐    ┌───┐    ┌───┐    ┌───┐    ┌───┐    ┌───┐    ┌───┐
    │ D7│───►│ D6│───►│ D5│───►│ D4│───►│ D3│───►│ D2│───►│ D1│
    └─┬─┘    └─┬─┘    └─┬─┘    └─┬─┘    └─┬─┘    └─┬─┘    └─┬─┘
      │        │        │        │        │        │        │
      │        │        │        └───┐    │        │        │
      │        │        │            │    │        │        │
      │        │        │      ┌─────┴────┴────┐   │        │
      │        │        │      │   XOR Gate   │   │        │
      │        │        │      └──────┬───────┘   │        │
      │        │        │             │           │        │
      │        │        │         ┌───────┐       │        │
      │        │        └────────►│  XOR  │◄──────┘        │
      │        │                  └───┬───┘                │
      │        │                      │                    │
      │        └──────────────────────┼────────────────────┘
      │                               │
      │                               ▼
      │                           输出位
      └──────────────────────────────┘
              反馈到 D7 输入

初始值:由 SERVICE 字段的 bits 0-6 指定 (非全 0)

3.2.2 Scrambler Verilog 实现

module wifi_scrambler (
    input wire clk,
    input wire reset_n,
    input wire data_in,
    output reg data_out,
    input wire enable,
    input wire [6:0] init_value  // 初始值 (SERVICE[6:0])
);

// 7 位 LFSR 寄存器
reg [6:0] lfsr;

// 扰码多项式:x^7 + x^4 + 1
// 反馈抽头:bit 6 和 bit 3 (对应 x^7 和 x^4)
wire feedback;
assign feedback = lfsr[6] ^ lfsr[3];

// LFSR 更新
always @(posedge clk or negedge reset_n) begin
    if (!reset_n) begin
        lfsr <= init_value;  // 使用传入的初始值
    end else if (enable) begin
        lfsr <= {lfsr[5:0], feedback};  // 左移,反馈到最低位
    end
end

// 扰码输出:数据与 LFSR 最高位异或
always @(posedge clk) begin
    if (enable) begin
        data_out <= data_in ^ lfsr[6];
    end
end

endmodule

// 解扰器 (与扰码器相同结构)
module wifi_descrambler (
    input wire clk,
    input wire reset_n,
    input wire data_in,
    output reg data_out,
    input wire enable,
    input wire [6:0] init_value
);

// 解扰器与扰码器结构完全相同
// 因为:(data ⊕ PN) ⊕ PN = data
wifi_scrambler u_descrambler (
    .clk(clk),
    .reset_n(reset_n),
    .data_in(data_in),
    .data_out(data_out),
    .enable(enable),
    .init_value(init_value)
);

endmodule

3.3 BCC 卷积码

3.3.1 卷积码原理

WiFi BCC 参数:

┌─────────────────────────────────────────────────────────┐
│              WiFi BCC 卷积码参数                          │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  约束长度:K = 7                                        │
│  移位寄存器:6 级 (K-1)                                   │
│  生成多项式:                                           │
│  ├─ G0 = 1 + D² + D³ + D⁵ + D⁶  (八进制:133)           │
│  └─ G1 = 1 + D + D² + D³ + D⁶  (八进制:171)            │
│                                                         │
│  码率:                                                 │
│  ├─ 基础码率:1/2 (每输入 1 bit,输出 2 bit)             │
│  ├─ 打孔后码率:2/3, 3/4, 5/6                           │
│  └─ 通过删除某些输出 bit 实现高码率                       │
│                                                         │
│  编码器结构:                                           │
│                                                         │
│  输入 ──► D ──► D ──► D ──► D ──► D ──► D              │
│          │     │     │     │     │     │               │
│          │     │     │     │     │     │               │
│          ⊕     │     ⊕     ⊕     │     ⊕               │
│          │     │     │     │     │     │               │
│  输出 0 ◄─┘     │     │     │     │     │               │
│                │     │     │     │     │               │
│                ⊕     ⊕     ⊕     │     ⊕               │
│                │     │     │     │     │               │
│  输出 1 ◄───────┘     │     │     │     │               │
│                      │     │     │     │               │
│                      └─────┴─────┴─────┘               │
│                                                         │
└─────────────────────────────────────────────────────────┘

3.3.2 BCC 编码器 Verilog 实现

module wifi_bcc_encoder (
    input wire clk,
    input wire reset_n,
    input wire data_in,
    output reg [1:0] code_out,  // 2 bit 输出 (码率 1/2)
    input wire enable,
    input wire [1:0] puncture_ctrl  // 打孔控制 (选择码率)
);

// 6 级移位寄存器 (K-1 = 6)
reg [5:0] shift_reg;

// 生成多项式 G0 = 133 (八进制) = 1011011 (二进制)
// 抽头位置:0, 2, 3, 5, 6
wire g0_out = shift_reg[5] ^ shift_reg[3] ^ shift_reg[2] ^ shift_reg[0] ^ data_in;

// 生成多项式 G1 = 171 (八进制) = 1111001 (二进制)
// 抽头位置:0, 1, 2, 3, 6
wire g1_out = shift_reg[5] ^ shift_reg[2] ^ shift_reg[1] ^ shift_reg[0] ^ data_in;

// 打孔模式 (实现不同码率)
// puncture_ctrl: 00=1/2, 01=2/3, 10=3/4, 11=5/6
reg [1:0] puncture_pattern [0:5];
always @(*) begin
    case (puncture_ctrl)
        2'b00: begin  // 码率 1/2 (无打孔)
            puncture_pattern[0] = 2'b11;
            puncture_pattern[1] = 2'b11;
            puncture_pattern[2] = 2'b11;
            puncture_pattern[3] = 2'b11;
            puncture_pattern[4] = 2'b11;
            puncture_pattern[5] = 2'b11;
        end
        2'b01: begin  // 码率 2/3
            puncture_pattern[0] = 2'b11;
            puncture_pattern[1] = 2'b10;
            puncture_pattern[2] = 2'b11;
            puncture_pattern[3] = 2'b10;
            puncture_pattern[4] = 2'b11;
            puncture_pattern[5] = 2'b10;
        end
        2'b10: begin  // 码率 3/4
            puncture_pattern[0] = 2'b11;
            puncture_pattern[1] = 2'b00;
            puncture_pattern[2] = 2'b11;
            puncture_pattern[3] = 2'b10;
            puncture_pattern[4] = 2'b11;
            puncture_pattern[5] = 2'b00;
        end
        2'b11: begin  // 码率 5/6
            puncture_pattern[0] = 2'b11;
            puncture_pattern[1] = 2'b00;
            puncture_pattern[2] = 2'b10;
            puncture_pattern[3] = 2'b00;
            puncture_pattern[4] = 2'b11;
            puncture_pattern[5] = 2'b00;
        end
    endcase
end

// 移位寄存器更新
always @(posedge clk or negedge reset_n) begin
    if (!reset_n) begin
        shift_reg <= 6'b000000;
        code_out <= 2'b00;
    end else if (enable) begin
        // 移位
        shift_reg <= {shift_reg[4:0], data_in};

        // 输出 (考虑打孔)
        if (puncture_pattern[0][0])
            code_out[0] <= g0_out;
        if (puncture_pattern[0][1])
            code_out[1] <= g1_out;
    end
end

// 尾 bit (归零)
// 在帧结束时,输入 6 个 0 使编码器回到全 0 状态

endmodule

3.3.3 Viterbi 解码器

Viterbi 算法原理:

┌─────────────────────────────────────────────────────────┐
│              Viterbi 解码算法                            │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  最大似然序列估计 (MLSE)                                 │
│                                                         │
│  核心思想:                                             │
│  ├─ 构建 trellis 图 (状态转移图)                         │
│  ├─ 计算每条路径的路径度量 (与接收序列的距离)            │
│  ├─ 在每个状态保留最优路径 (幸存路径)                    │
│  └─ 回溯得到最可能的发送序列                            │
│                                                         │
│  算法步骤:                                             │
│                                                         │
│  1. 初始化:                                            │
│     ├─ 设置初始状态度量 (S0=0, 其他=∞)                   │
│     └─ 清空幸存路径存储器                               │
│                                                         │
│  2. 迭代 (每个接收符号对):                              │
│     ├─ 计算分支度量 (接收符号与期望符号的欧氏距离)       │
│     ├─ 更新路径度量 (累加分支度量)                       │
│     ├─ 比较进入同一状态的两条路径                        │
│     └─ 保留度量较小的路径 (ACS 操作:Add-Compare-Select)  │
│                                                         │
│  3. 回溯:                                              │
│     ├─ 从最优状态回溯幸存路径                            │
│     └─ 得到解码输出                                     │
│                                                         │
│  WiFi BCC 状态数:2^(K-1) = 2^6 = 64 个状态              │
│                                                         │
└─────────────────────────────────────────────────────────┘

Viterbi 解码器 Verilog 框架:

module wifi_viterbi_decoder (
    input wire clk,
    input wire reset_n,
    input wire signed [7:0] soft_in [0:1],  // 软判决输入 (2 bit/symbol)
    output reg data_out,
    input wire enable,
    input wire [1:0] code_rate  // 码率控制
);

// 64 个状态的路径度量 (每个 10 bit)
reg [9:0] path_metric [0:63];

// 幸存路径存储器 (深度根据约束长度和回溯长度)
// 典型回溯长度:5 × K = 35
reg [63:0] survivor_path [0:34];

// 分支度量计算单元
wire [9:0] branch_metric [0:127];  // 64 状态 × 2 输入

// ACS (Add-Compare-Select) 单元
wire [9:0] new_metric [0:63];
wire [1:0] select [0:63];

// 分支度量计算 (欧氏距离)
// BM = (I - expected_I)² + (Q - expected_Q)²
genvar i;
generate
    for (i = 0; i < 128; i = i + 1) begin
        assign branch_metric[i] = calc_branch_metric(soft_in, i);
    end
endgenerate

// ACS 操作
always @(posedge clk) begin
    integer state;
    for (state = 0; state < 64; state = state + 1) begin
        // 计算进入该状态的两条路径的新度量
        // 比较并选择较小的
        // 更新幸存路径
        // (详细实现需要大量逻辑,此处简化)
    end
end

// 回溯单元
reg [5:0] best_state;
reg [34:0] decode_delay;

always @(posedge clk) begin
    // 找到当前最优状态
    // 回溯 35 步得到解码输出
    // (详细实现略)
end

endmodule

3.4 LDPC 码

3.4.1 LDPC 码原理

低密度奇偶校验码 (LDPC):

┌─────────────────────────────────────────────────────────┐
│              LDPC 码基本原理                             │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  LDPC 码特点:                                          │
│  ├─ 接近香农极限的性能                                  │
│  ├─ 稀疏校验矩阵 (大部分元素为 0)                       │
│  ├─ 迭代解码 (置信传播)                                 │
│  └─ 适合长码块                                          │
│                                                         │
│  校验矩阵 H 结构:                                      │
│  ┌─────────────────────────────────────────────────┐   │
│  │  H = [h_ij]  M×N 矩阵                            │   │
│  │                                                  │   │
│  │  其中:                                          │   │
│  │  ├─ M: 校验位数                                  │   │
│  │  ├─ N: 码字长度                                  │   │
│  │  └─ 大部分 h_ij = 0 (稀疏)                       │   │
│  │                                                  │   │
│  │  例如 (6, 3) LDPC 码:                            │   │
│  │  ┌                                           ┐  │   │
│  │  │ 1  1  0  1  0  0  │                        │  │   │
│  │  │ 1  0  1  0  1  0  │  H 矩阵                │  │   │
│  │  │ 0  1  1  0  0  1  │                        │  │   │
│  │  └                                           ┘  │   │
│  └─────────────────────────────────────────────────┘   │
│                                                         │
│  Tanner 图表示:                                        │
│                                                         │
│     校验节点 (Check Nodes)                              │
│        C1      C2      C3                               │
│       / | \   / | \   / | \                             │
│      /  |  \ /  |  \ /  |  \                            │
│     V1  V2  V3  V4  V5  V6                              │
│     变量节点 (Variable Nodes / Bit Nodes)               │
│                                                         │
│  解码过程:消息在变量节点和校验节点间迭代传递           │
│                                                         │
└─────────────────────────────────────────────────────────┘

3.4.2 WiFi LDPC 参数

┌─────────────────────────────────────────────────────────┐
│              WiFi LDPC 码参数 (802.11n/ac/ax)             │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  支持的码块长度:                                       │
│  ├─ 648 bits (短码块)                                  │
│  ├─ 1296 bits (中等码块)                               │
│  └─ 1944 bits (长码块)                                 │
│                                                         │
│  支持的码率:                                           │
│  ├─ 1/2, 2/3, 3/4, 5/6                                 │
│  └─ 通过校验矩阵扩展实现                                │
│                                                         │
│  校验矩阵结构:                                         │
│  ┌─────────────────────────────────────────────────┐   │
│  │  H = [H1 | H2]                                  │   │
│  │       ─────────                                 │   │
│  │  H1: 信息位部分 (准循环结构)                      │   │
│  │  H2: 校验位部分 (双对角线结构)                    │   │
│  │                                                  │   │
│  │  准循环结构:                                    │   │
│  │  └─ 由循环移位单位矩阵组成                        │   │
│  │     便于硬件并行实现                             │   │
│  └─────────────────────────────────────────────────┘   │
│                                                         │
│  解码算法:                                             │
│  ├─ 置信传播 (Belief Propagation, BP)                  │
│  ├─ 最小和 (Min-Sum) 近似                              │
│  └─ 分层解码 (Layered Decoding) - 收敛更快             │
│                                                         │
└─────────────────────────────────────────────────────────┘

3.4.3 LDPC 编码器结构

// LDPC 编码器顶层模块
module wifi_ldpc_encoder (
    input wire clk,
    input wire reset_n,
    input wire [1943:0] info_bits,  // 信息位输入
    output reg [2915:0] codeword,   // 码字输出 (码率 2/3, 1944 长码)
    input wire enable,
    input wire [1:0] code_rate,     // 码率选择
    input wire [1:0] block_size     // 码块大小选择
);

// 参数定义
localparam N_648 = 648;
localparam N_1296 = 1296;
localparam N_1944 = 1944;

// 校验矩阵存储 (准循环结构,只需存储移位值)
reg [7:0] shift_table [0:100];  // 简化示例

// 信息位到码字的映射
// c = [i | p], 其中 p = i × G (G 为生成矩阵)

// 准循环编码器
wire [971:0] parity_bits;  // 校验位输出 (码率 2/3)
ldpc_quasi_cyclic_encoder u_qc_enc (
    .clk(clk),
    .reset_n(reset_n),
    .info_bits(info_bits),
    .parity_bits(parity_bits),
    .enable(enable),
    .code_rate(code_rate),
    .block_size(block_size)
);

// 码字组装
always @(posedge clk) begin
    if (enable) begin
        codeword <= {parity_bits, info_bits};  // 系统码
    end
end

endmodule

// 准循环 LDPC 编码子模块
module ldpc_quasi_cyclic_encoder (
    input wire clk,
    input wire reset_n,
    input wire [1943:0] info_bits,
    output reg [971:0] parity_bits,
    input wire enable,
    input wire [1:0] code_rate,
    input wire [1:0] block_size
);

// 移位寄存器组 (用于准循环乘法)
reg [26:0] shift_regs [0:26];  // 27 个移位寄存器 (Z=27 for 1944)

// 准循环矩阵乘法
// p = i × H^T (模 2 加法)

// 详细实现需要大量逻辑,此处为框架
// 实际实现需要:
// 1. 根据 shift_table 配置循环移位
// 2. 并行计算多个校验方程
// 3. 累加得到校验位

endmodule

3.4.4 LDPC 解码器 (Min-Sum 算法)

// LDPC 解码器 (分层 Min-Sum 算法)
module wifi_ldpc_decoder (
    input wire clk,
    input wire reset_n,
    input wire signed [7:0] llr_in [0:1943],  // 输入 LLR (对数似然比)
    output reg [1943:0] decoded_bits,
    input wire enable,
    output reg decode_done,
    input wire [1:0] code_rate,
    input wire [1:0] block_size
);

// 变量节点消息存储
reg signed [7:0] q_memory [0:1943];

// 校验节点消息存储
reg signed [7:0] r_memory [0:971];

// 迭代计数
reg [3:0] iter_count;
localparam MAX_ITER = 10;  // 最大迭代次数

// 校验和检查
wire syndrome_valid;
syndrome_checker u_checker (
    .q_memory(q_memory),
    .valid(syndrome_valid)
);

// 分层解码主状态机
always @(posedge clk or negedge reset_n) begin
    if (!reset_n) begin
        iter_count <= 4'd0;
        decode_done <= 1'b0;
    end else if (enable) begin
        if (iter_count < MAX_ITER) begin
            // 分层处理
            // 1. 变量节点更新
            // 2. 校验节点更新 (Min-Sum)
            // 3. 校验和检查
            if (syndrome_valid) begin
                decode_done <= 1'b1;
            end else begin
                iter_count <= iter_count + 1'b1;
            end
        end else begin
            decode_done <= 1'b1;  // 达到最大迭代次数
        end
    end
end

// Min-Sum 校验节点更新
// r = min(|q|) × sign(q)
function signed [7:0] min_sum;
    input signed [7:0] q1;
    input signed [7:0] q2;
    begin
        if ($abs(q1) < $abs(q2))
            min_sum = {q1[7], $abs(q1)};
        else
            min_sum = {q2[7], $abs(q2)};
    end
endfunction

endmodule

3.5 交织 (Interleaving)

3.5.1 交织原理

WiFi 交织目的:

1
2
3
4
5
6
7
8
9
问题:突发错误
├─ 深衰落可能连续影响多个子载波
├─ 超过编码器的纠错能力
└─ 导致解码失败

解决方案:交织
├─ 将相邻的编码 bit 分散到不同子载波
├─ 接收端去交织后,突发错误变为随机错误
└─ 编码器可有效纠正

WiFi 两步交织:

┌─────────────────────────────────────────────────────────┐
│              WiFi 两步交织                               │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  第一步交织 (相邻 bit 分散到不同子载波):                  │
│  ────────────────────────────────────────               │
│  i = (N_CBPS / N_CBPSI) × (k mod N_CBPSI) + floor(k / N_CBPSI)│
│                                                         │
│  其中:                                                 │
│  ├─ k: 交织前索引                                       │
│  ├─ i: 第一步交织后索引                                 │
│  ├─ N_CBPS: 每 OFDM 符号编码 bit 数                        │
│  └─ N_CBPSI: 每子载波编码 bit 数 (取决于调制)              │
│                                                         │
│  第二步交织 (相邻 bit 交替映射到星座高低有效位):          │
│  ────────────────────────────────────────               │
│  j = s × floor(i / s) + (i + floor(N_CBPS × i / N_CBPSI)) mod s│
│                                                         │
│  其中:                                                 │
│  ├─ i: 第一步交织后索引                                 │
│  ├─ j: 最终交织后索引                                   │
│  └─ s: 交织深度参数 (取决于调制和码率)                    │
│                                                         │
│  参数 s 的取值:                                         │
│  ├─ BPSK:  s = 1                                        │
│  ├─ QPSK:  s = 2                                        │
│  ├─ 16-QAM: s = 4                                       │
│  ├─ 64-QAM: s = 8                                       │
│  ├─ 256-QAM: s = 12                                     │
│  └─ 1024-QAM: s = 16                                    │
│                                                         │
└─────────────────────────────────────────────────────────┘

3.5.2 交织器 Verilog 实现

module wifi_interleaver (
    input wire clk,
    input wire reset_n,
    input wire [N_CBPS-1:0] encoded_bits,
    output reg [N_CBPS-1:0] interleaved_bits,
    input wire enable,
    input wire [2:0] modulation  // 0=BPSK, 1=QPSK, 2=16QAM, 3=64QAM, 4=256QAM
);

// 参数定义 (以 64-QAM, 码率 3/4, 20 MHz 为例)
localparam N_CBPS = 288;  // 48 子载波 × 6 bit/子载波
localparam N_CBPSI = 6;   // 64-QAM 每子载波 6 bit

// 交织深度参数 s
wire [3:0] s;
assign s = (modulation == 3'd0) ? 4'd1 :
           (modulation == 3'd1) ? 4'd2 :
           (modulation == 3'd2) ? 4'd4 :
           (modulation == 3'd3) ? 4'd8 :
                                  4'd12;

// 第一步交织
reg [N_CBPS-1:0] step1_out;
genvar k;
generate
    for (k = 0; k < N_CBPS; k = k + 1) begin
        wire [8:0] i_idx;
        assign i_idx = ((N_CBPS / N_CBPSI) * (k % N_CBPSI)) + (k / N_CBPSI);
        assign step1_out[i_idx] = encoded_bits[k];
    end
endgenerate

// 第二步交织
genvar i;
generate
    for (i = 0; i < N_CBPS; i = i + 1) begin
        wire [8:0] j_idx;
        assign j_idx = s * (i / s) + ((i + (N_CBPS * i / N_CBPSI)) % s);
        assign interleaved_bits[j_idx] = step1_out[i];
    end
endgenerate

endmodule

// 去交织器 (逆向操作)
module wifi_deinterleaver (
    input wire clk,
    input wire reset_n,
    input wire [N_CBPS-1:0] deinterleaved_bits,
    output reg [N_CBPS-1:0] output_bits,
    input wire enable,
    input wire [2:0] modulation
);

// 去交织是交织的逆过程
// 先反向第二步,再反向第一步
// (实现略,原理相同)

endmodule

3.6 编码性能对比

3.6.1 BER 性能

┌─────────────────────────────────────────────────────────┐
│              BCC vs LDPC BER 性能对比 (AWGN 信道)          │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  BER = 10⁻⁵ 时所需的 Eb/N0 (dB):                         │
│                                                         │
│  ┌────────────┬─────────┬─────────┬─────────┬─────────┐│
│  │  调制编码  │  BCC    │  LDPC   │  增益   │  备注   ││
│  ├────────────┼─────────┼─────────┼─────────┼─────────┤│
│  │  BPSK 1/2  │  4.5 dB │  3.8 dB │  0.7 dB │        ││
│  │  QPSK 1/2  │  6.0 dB │  5.2 dB │  0.8 dB │        ││
│  │  16-QAM 1/2│  9.5 dB │  8.5 dB │  1.0 dB │        ││
│  │  64-QAM 2/3│ 13.0 dB │ 11.5 dB │  1.5 dB │        ││
│  │ 64-QAM 3/4 │ 14.5 dB │ 12.5 dB │  2.0 dB │        ││
│  │256-QAM 3/4 │ 18.0 dB │ 15.5 dB │  2.5 dB │        ││
│  │1024-QAM 3/4│ 22.0 dB │ 18.5 dB │  3.5 dB │        ││
│  └────────────┴─────────┴─────────┴─────────┴─────────┘│
│                                                         │
│  结论:                                                 │
│  ├─ LDPC 在所有调制编码方案下均优于 BCC                 │
│  ├─ 高阶调制下增益更大                                  │
│  └─ 802.11n/ac/ax 推荐使用 LDPC                         │
│                                                         │
└─────────────────────────────────────────────────────────┘

3.6.2 复杂度对比

┌─────────────────────────────────────────────────────────┐
│              BCC vs LDPC 复杂度对比                       │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  编码器复杂度:                                         │
│  ├─ BCC: 低 (6 级移位寄存器 + 异或门)                     │
│  └─ LDPC: 中 (准循环矩阵乘法)                           │
│                                                         │
│  解码器复杂度:                                         │
│  ├─ BCC: 中 (64 状态 Viterbi 解码)                        │
│  └─ LDPC: 高 (迭代解码,10 次迭代)                        │
│                                                         │
│  解码延迟:                                             │
│  ├─ BCC: 低 (固定延迟,约 5×K 符号)                      │
│  └─ LDPC: 高 (取决于迭代次数)                           │
│                                                         │
│  功耗:                                                 │
│  ├─ BCC: 低                                             │
│  └─ LDPC: 高 (迭代计算)                                 │
│                                                         │
│  适用场景:                                             │
│  ├─ BCC: 低功耗、低延迟应用                             │
│  └─ LDPC: 高吞吐、高性能应用                            │
│                                                         │
└─────────────────────────────────────────────────────────┘

3.7 本章小结

本章深入讲解了 WiFi 编码解码的核心技术:

  1. Scrambler:PN 序列异或,频谱均匀化
  2. BCC 卷积码:K=7 约束长度,Viterbi 解码
  3. LDPC 码:准循环结构,Min-Sum 迭代解码
  4. 交织:两步交织,分散突发错误
  5. 性能对比:BCC vs LDPC 的 BER 和复杂度

下一章将讲解调制解调技术的详细实现。


上一章:02-物理层详解
下一章:04-调制解调技术