应用笔记 算法 V0.0 2015/3/17编程 |
LDPC译码器的FPGA实现缓存 |
概述模块化 |
本文将介绍LDPC译码器的FPGA实现,译码器设计对应CCSDS131x1o1s文档中提到的适用于深空通讯任务的LDPC编码。本文档将简述Verilog代码的基本结构和信号说明。 性能 |
修订历史学习 |
如下表格展现了本文档的修订过程 编码
|
简介 |
本文中FPGA实现特指经过Verilog HDL实现LDPC译码器功能,然而对于VHDL来讲也似相似的的。Verilog HDL不像MATLAB代码那样有很强的通用性,或者说我暂时编不出通用性太好的代码。所以,这里的FPGA实现仅针对CCSDS文档(06版)中1024信息位1/2码率的适用于深空通讯LDPC码,采用最小和算法下的实现。因为在截位补零下最小和算法性能奇差,所以此处不作补零处理,即码率实际为0.4。 LDPC相关文档包括《程序说明:LDPC编码(CCSDS)算法概述》、《程序说明:LDPC译码算法概述》、《学习笔记:LDPC编译码基本原理》以及《CCSDS_LDPC_V1》(代码),同时与本文档同名的学习笔记将阐述编程过程和思路,都可做为本文档的参考。 译码器的输入输出至少应该包括如下信号 input clk; //时钟 input rst; //复位信号,高有效 input decode_start; //开始译码信号,持续高电平一个clock有效 output output_ready; //开始输出 output frame_error; //输出结果不知足校验矩阵 output data_out; //输出译码后数据 output busy; //译码模块正在译码,此时不响应decode_start信号 对应应该有以下的状态 parameter IDLE = 5'b00001; //空闲状态,等待译码 parameter VML_INIT = 5'b00010; //初始化变量节点取值 parameter UML_UPDATE = 5'b00100; //更新校验节点,同时计算校验方程 parameter VML_UPDATE = 5'b01000; //更新变量节点 parameter DECODER_END = 5'b10000; //输出译码结果 下文将具体叙述程序结构和信号说明。 |
程序结构 |
图 1 程序结构图
顶层模块为decoder_top,如下具体阐述各个模块和改进思路
图 2 状态机
这是decoder_top内惟一有意义的代码,输出5个状态,输入包括 decode_start vmlram_addra hrowram_addra frame_error MAX_ITER_NUM 这是状态机跳转的全部条件,第二、3个是可选择的,能够考虑替换掉,但这两个是很很方便的。
图 3 信道信息控制模块
经过state和umlram_addrb控制尝试inputram_addra对应输出不一样的信息。输入umlram_addrb是必须的,由于须要控制在uml2vml中信道信息的输出。 显然这两个模块能够合成一个,不该该直接将InputRam放在decoder_top之下。
图 4 Vml寄存器写控制
vmlram写控制须要即控制vmlram_wea,dina,addra三路信号。针对不一样阶段,vml的输入是不同的,该模块起到了一个输入选择做用对inputram_douta,vmlram_updae_dina,decoded_data_check三个信号进行处理,同时根据state不一样产生写入地址。模块设计较为合理。
图 5 vml2uml模块
这个模块还包括了hrowram、vml2uml_caculate和check_data三个部分。模块完成了decoded_data的校验和vmlram_doutb到变量节点的更新。输出的hrowram_addra做为了state和uml地址生成的控制(挺方便,是否合适,有无更好选择?),hrowram_douta用于生成uml的写地址。
图 6 umlram_write_control模块
umlram_write_control模块控制产生uml写地址,为何没有写数据,由于vml2uml模块的输出直接链接到ram上面去了。写地址和使能经过hrowram_addra和hrowram_douta控制产生。
图 7 uml2vml模块 变量节点更新模块技术按vml更新值即vmlram_update_dina和decoded_data_check.
|
信号说明 |
Decoder_top顶层控制模块
表格 1 decoder_top模块信号说明
Inputram_control:根据输入产生inputram的地址控制
表格 2 inputram_control控制模块信号说明
Vmlram_write_control: vml寄存器写控制,经过输入inputram_douta, vmlram_update_dina等信息自动判断输出写地址、写使能和数据。
表格 3 vmlram_write_control模块的信号说明
Vml2uml: 接收vml读出的数据,处理后写入uml中。同时完成校验伴随式的计算 Vml2uml包含了如下几个模块:
Vml2uml_calculate.v 校验节点更新的计算部份内容
check_data.v 计算是否知足校验方程
Umlram_write_control.v: uml寄存器写控制
Uml2vml.v: 校验节点到变量节点更新,同时生成译码后结果
|
改进 |
模块划分是否合理? 功能实现是否足够合适? 存储器设计显然不够合理,都是8bit。 参考他人毕业论文的模块化方法。 了解并行、部分并行的方法 完成输入输出部分模块的设计。 完成整个硬件仿真平台的思路构想。 |
参考 |
|
代码 |
|