工程实践:3/4删余卷积码Viterbi译码的FPGA实现与VIVADO仿真验证

张开发
2026/4/11 20:49:28 15 分钟阅读

分享文章

工程实践:3/4删余卷积码Viterbi译码的FPGA实现与VIVADO仿真验证
1. 3/4删余卷积码Viterbi译码的FPGA实现概述在数字通信系统中卷积码是一种常用的前向纠错编码技术。3/4删余卷积码作为1/2码率母码的衍生版本通过有选择地删除部分编码比特来提高有效码率。这种技术在IEEE 802.11a等无线通信标准中广泛应用能够在保证一定纠错能力的同时提高数据传输效率。FPGA实现Viterbi译码器的核心挑战在于如何将算法高效映射到硬件资源上。与软件实现不同硬件设计需要考虑时序约束、资源占用和功耗等多方面因素。我们的设计目标是在Xilinx FPGA平台上实现一个能够实时处理3/4删余卷积码的Viterbi译码器并通过Vivado工具链完成功能验证和性能评估。整个译码流程可以分为五个关键阶段删余码预处理、分支度量计算、ACS(加比选)操作、幸存路径存储和回溯译码。每个阶段都需要针对FPGA的并行处理特性进行专门优化下面我们将逐一深入探讨这些模块的实现细节。2. 删余码的预处理模块设计2.1 从3/4码率还原到1/2母码3/4删余卷积码的本质是对1/2码率母码进行选择性删除。以典型的删余模式为例原始1/2编码输出序列A1B1A2B2A3B3经过删余后可能变为A1B1A2B3。在译码端我们需要先将被删除的比特位置补零恢复出完整的1/2码率序列结构。Verilog实现中我们设计了一个专门的补零模块。该模块需要处理两个关键问题首先是准确识别输入比特的删余位置模式其次是正确处理跨时钟域的数据传输。以下是核心代码片段case(DatainCnt) 0: begin // A1 B1直接处理 conv_unit[5:4] datain; storage_rdy 0; DatainCnt 1; end 1: begin // A2 B3补零处理 conv_unit[3] datain[1]; // A2 conv_unit[0] datain[0]; // B3 conv_unit[2:1] 2b0; // 补零 storage_rdy 1; DatainCnt 0; end endcase2.2 时钟域交叉处理在实际系统中编码数据可能来自不同时钟域。我们的设计采用了异步FIFO结构来安全地实现40MHz到60MHz的时钟域转换。关键点包括格雷码编码的读写指针双触发器同步器消除亚稳态精确的空满标志生成特别需要注意的是补零操作必须在目标时钟域(60MHz)完成以确保后续处理模块的时序一致性。我们通过精心设计的握手信号(validin/validout)来保证数据流的完整性。3. 分支度量计算优化3.1 标准1/2码率的分支度量对于标准1/2卷积码每个时刻接收2bit输入(din[1:0])。硬判决译码下分支度量计算四个理想码字(00,01,10,11)与接收码字的汉明距离dout1 din[0] din[1]; // 00 dout2 (!din[0]) (!din[1]); // 11 dout3 (!din[0]) din[1]; // 01 dout4 din[0] (!din[1]); // 103.2 删余场景的特殊处理补零后的序列包含{A2,0}和{0,B3}这样的特殊组合。此时不能简单计算2bit汉明距离否则会引入错误度量。正确做法是case(trunc_cnt) 1: begin // A2 0情况 dout1 din[1] din[1]; // 只看A2位 dout2 !din[1] !din[1]; dout3 din[1] din[1]; dout4 !din[1] !din[1]; end 2: begin // 0 B3情况 dout1 din[0] din[0]; // 只看B3位 dout2 !din[0] !din[0]; dout3 !din[0] !din[0]; dout4 din[0] din[0]; end endcase实际调试中发现这个模块最容易出现隐蔽性错误。建议通过以下方法验证固定测试向量检查输出对比软件仿真结果在Vivado中设置关键信号触发条件4. ACS单元与路径度量更新4.1 基本ACS操作ACS(Add-Compare-Select)是Viterbi算法的核心。每个状态需要比较两条可能路径的累积度量选择较小者作为幸存路径。我们的实现采用全并行结构64个状态对应64个ACS单元module ACS_unit( input [1:0] bm0, bm1, // 分支度量 input [5:0] pm0, pm1, // 路径度量 output wire acs_sp, // 幸存路径选择 output wire [5:0] newstate_pm // 新路径度量 ); wire [5:0] pm_new0 bm0 pm0; wire [5:0] pm_new1 bm1 pm1; assign acs_sp (pm_new0 pm_new1) ? 0 : 1; assign newstate_pm (pm_new0 pm_new1) ? pm_new0 : pm_new1; endmodule4.2 路径度量归一化长期累积会导致路径度量寄存器溢出。我们采用定期右移的归一化方案设置回溯深度为36每次回溯时所有路径度量右移1位保持相对度量关系不变4.3 初始化与流式处理对于OFDM系统我们实现了特殊的初始化策略帧开始时将state0路径度量置0其他状态置8符号间保持状态连续不强制复位通过路径度量初始值差异实现自然收敛5. 幸存路径存储与回溯逻辑5.1 乒乓式RAM设计幸存路径存储采用三块RAM的乒乓操作结构RAM1写入时从RAM2读取RAM2写入时从RAM3读取RAM3写入时从RAM1读取每块RAM深度等于回溯深度(36)宽度为64bit(每个状态1bit)survival_ram RAM1 ( .clka(clk60M), .ena(wren1), .wea(1b1), .addra(wraddr1), .dina(ram_din), .clkb(clk60M), .enb(rden1), .addrb(rdaddr), .doutb(ram1_dout) );5.2 回溯状态选择回溯起点选择采用两级比较器结构将64个状态分为两组(0-31和32-63)每组内部并行比较找出局部最小值最后比较两个局部最小值得到全局最优状态assign SmallerDistance0 (DistanceTemp00 DistanceTemp01) ? DistanceTemp00 : DistanceTemp01; assign SmallerState0 (DistanceTemp00 DistanceTemp01) ? StateTemp00 : StateTemp01;5.3 回溯核心逻辑回溯过程沿着幸存路径逆向进行逐拍恢复原始信息比特assign surv_route curstate[5]; // 最高位为信息比特 assign prestate {curstate[4:0], TB_SurvPath_temp[curstate]}; always (posedge clk60M) begin if(TB_EN) begin curstate prestate; TB_DecodeValue[TracebackDepth1-TB_CNT] surv_route; end end6. Vivado仿真验证6.1 测试平台搭建我们构建了完整的验证环境随机序列生成器卷积编码器(含删余)加性高斯白噪声(AWGN)信道模型硬判决量化模块待测Viterbi译码器6.2 关键信号监控仿真中需要重点观察补零模块的输入输出对齐分支度量的计算正确性ACS单元的路径选择合理性幸存路径存储的连续性回溯输出的时序关系6.3 性能评估指标通过大量蒙特卡洛仿真统计不同信噪比下的误码率曲线时序收敛性分析资源利用率报告最大时钟频率评估实测数据显示我们的实现能够在60MHz时钟下稳定工作误码率性能与理论值相差在0.5dB以内满足IEEE 802.11a系统的实时处理要求。整个设计占用约15%的Slice资源功耗控制在1.2W以内达到了预期的工程目标。

更多文章