LDPC译码器的FPGA实现


应用笔记

V0.0 2015/3/17


LDPC译码器的FPGA实现

?


概述


?

本文将介绍LDPC译码器的FPGA实现,译码器设计对应CCSDS131x1o1s文档中提到的适用于深空通信任务的LDPC编码。本文档将简述Verilog代码的基本结构和信号说明。



修订历史


以下表格展示了本文档的修订过程


日期


版本号


修订内容


2015/03/16


V1.0


初始版本,ISim仿真基本正确

?


简介


?

本文中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

这是状态机跳转的所有条件,第2、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模块信号说明


信号


类型


功能


clk


input


时钟


rst


input


复位信号,高有效


decode_start


input


开始译码信号,持续高电平一个clock有效


optput_ready


output


开始输出


frame_error


output


输出结果不满足校验矩阵


data_out


output


输出译码后数据


busy


output,reg????


????译码模块正在译码,此时不响应decode_start信号


state


reg[4:0]


状态寄存器


MAX_ITER_NUM


reg[7:0]


最大迭代次数


vmlram_update_dina


wire[7:0]


vml更新过程中的数据输入


decoded_data_check


wire


待校验的译码结果


inputram_addra


wire[11:0]


被译码数据地址控制


inputram_douta


wire[7:0]


被译码数据输出


hrowram_addra


wire[12:0]


行列地址转化ROM地址


hrowram_douta


wire[12:0]


作为vml_addrb的输入


vmlram_addra


wire[12:0]


变量存储器写地址


vmlram_dina


wire[8:0]


变量存储器写输入


vmlram_doutb


wire[7:0]


变量存储器写输出


decoded_data


wire


也存在变量存储器的译码结果


vmlram_wea


wire


变量存储器写使能


umlram_addra


wire[12:0]


校验存储器写地址


umlram_addrb


wire[12:0]


校验存储器读地址


umlram_dina


wire[7:0]


校验存储器写数据


umlram_doutb


wire[7:0]


校验存储器读数据


umlram_wea


wire


校验存储器写使能

?

Inputram_control:根据输入产生inputram的地址控制

?

表格 2 inputram_control控制模块信号说明


信号


类型


功能


clk


input


时钟


rst


input


复位信号,高有效


umlram_addrb


input[12:0]


校验存储器读地址


state


input[4:0]


状态寄存器


inputram_addra


output[11:0],reg[11:0]


被译码数据地址控制


input_count


reg[2:0]


地址更新计数器


input_count_max


reg[2:0]


最大计数次数控制


input_init_addr


reg[11:0]


VML_INIT状态下inputram_addra地址


input_update_addr


reg[11:0]


VML_UPDATA状态下inputram_addra地址

?

Vmlram_write_control: vml寄存器写控制,通过输入inputram_douta, vmlram_update_dina等信息自动判断输出写地址、写使能和数据。

?

表格 3 vmlram_write_control模块的信号说明


信号


类型


功能


clk


input


时钟


rst


input


复位信号,高有效


inputram_douta


input[7:0]


VML下数据输入


state


input[4:0]


状态


vmlram_update_dina


input[7:0]


vml更新过程中的数据输入


decoded_data_check


input


待校验的译码结果


vmlram_addra


output[12:0] ,reg[12:0]



vmlram_dina


output[8:0], reg[8:0]



vmlram_wea


output, reg



vmlram_init_addra


reg[12:0]



addr_update_count


reg[1:0]


VML_UPDATE下实际上是要对地址做延迟的,这是控制延迟的寄存器


vmlram_update_addra


reg[12:0]



vmlram_init_addratemp


reg[12:0]


这个是开始数错了时钟周期,添加一个clk延时


vmlram_update_addratemp


reg[12:0]


这个是开始数错了时钟周期,添加一个clk延时

?

?

Vml2uml: 接收vml读出的数据,处理后写入uml中。同时完成校验伴随式的计算

Vml2uml包含了以下几个模块:

  • hrowram
  • vml2uml_caculate
  • check_data

?


信号


类型


功能


clk


input


时钟


rst


input


复位信号,高有效


state


input[4:0]


状态信息


decoded_data


input

?

vmlram_doutb


input[7:0]

?

hrowram_addra


output[12:0], reg[12:0]

?

hrowram_douta


output[12:0], wire[12:0]

?

umlram_dina


output[7:0]

?

frame_error


output


输出帧错误指示


vmltempcount


reg[2:0]


计算是三个一更新还是六个

?

Vml2uml_calculate.v 校验节点更新的计算部分内容


信号


类型


功能


clk


input


时钟


rst


input


复位信号,高有效


state


input[4:0]


状态信息


vmltempcount


input[2:0]


计算是三个一更新还是六个


vmlram_doutb


input[7:0]


vmlram输出


umlram_dina


output[7:0],reg[7:0]


umlram输入


vmlmark


reg


每组计算出符号


vmltemp


reg[47:0]


缓存6个clock的vmlram输出


vmltempmark


reg[5:0]


缓存6个clock的vmlram输出符号


vmlmin1


reg[7:0]


最小值计算


vmlmin2


reg[7:0]


次小值计算


vmlmin1temp


reg[7:0]


缓存最小值计算结果


vmlmin2temp


reg[7:0]


缓存次小值计算结果


vmltempcomp


reg[7:0]


取出用于比较的vml输出(绝对值)


vmlMarkcomp


reg


缓存符号计算结果


vmltempmarkcomp


reg


取出用于比较的vml符号


vmlram_doutb_inv


wire[7:0]


负数取绝对值

check_data.v 计算是否满足校验方程


信号


类型


功能


clk


input


时钟


rst


input


复位信号,高有效


state


input[4:0]


状态信息


vmltempcount


input[2:0]


计算是三个一更新还是六个


decoded_data


input


待校验数据


hrowram_addra


input[12:0]


校验起始控制


frame_error


output, reg


帧错误指示


sum_mod2


reg


计算模二和

?

Umlram_write_control.v: uml寄存器写控制


信号


类型


功能


clk


input


时钟


rst


input


复位信号,高有效


hrowram_douta


input[12:0]


hrowram输出,用于生成umlram地址


hrowram_addra


input[12:0]


hrowram地址,计数判断


umlram_addra


output[12:0], reg[12:0]


生成的umlram地址


umlram_wea


output,reg


umlram使能信号


hrowram_douta_temp


reg[116:0]


存储hrowram输出,延时生成umlram地址

?

Uml2vml.v: 校验节点到变量节点更新,同时生成译码后结果


信号


类型


功能


clk


input


时钟


rst


input


复位信号,高有效


state


input[4:0]



umlram_doutb


input[7:0]



inputram_douta


input[7:0]



umlram_addrb


output[12:0]



vmlram_update_dina


output[7:0]



decoded_data_check


output



umltempcount


reg[2:0]


判断uml延迟


umltemp


reg[47:0]


uml输出缓存


umlsum


reg[10:0]


uml输出求和


umlsumtemp


reg[10:0]


缓存求和结果


vmltempcount_max


reg[2:0]


控制此时几个数据做一次操作


vmltempcount


reg[2:0]


控制此时几个数据做一次操作


vmlram_update_dina


reg[7:0]


vml需要写入的数据


umltempsub


reg[7:0]


做减法的uml取值


umltempsub_delay


reg[2:0]


uml取值延时控制


vmltempcount_maxtemp


reg[2:0]


uml取值延时控制

?



改进


?

模块划分是否合理?

功能实现是否足够合适?

存储器设计显然不够合理,都是8bit。

参考他人毕业论文的模块化方法。

了解并行、部分并行的方法

完成输入输出部分模块的设计。

完成整个硬件仿真平台的思路构想。



参考


?


代码


?

时间: 2024-10-18 05:07:28

LDPC译码器的FPGA实现的相关文章

ISE,FPGA和LDPCC译码器

阶段总结 V1.0 2015/5/03 ISE,FPGA和LDPCC译码器 ? 概述 ? 本文总结了LDPC码的译码器设计方法,包括MATLAB和FPGA代码,以及ISE使用过程中的一些问题.本文内容具体包括以下几个部分 总体思路 功能设计 存储设计 完成LDPC码译码器 观察综合报告 时序收敛和流水线 编程策略初探 我犯了什么错误 代码验证 其他 修订历史 以下表格展示了本文档的修订过程 日期 版本号 修订内容 2015/05/03 V1.0 初始版本 ? 简介 ? 不知不觉中,接触LDPC码

5G为何采纳华为力挺的Polar码?一个通信工程师的大实话

Polar码被采纳为5G eMBB场景的控制信道编码,这两天连续被这条消息刷屏,连吃瓜群众都直呼好爽. 然而,随着媒体报道的持续发酵,真相在口口相传中变了形,不乏夸大不实之嫌,小编终于坐不住了,也想吐露点心里话,希望尽可能站在客观的角度,在这个浮躁的世界里发出一点微不足道的声音,一个通信工程师的声音. 事件经过我们再回溯一遍- 2016年11月14日至18日期间,3GPP RAN1 #87会议在美国Reno召开,本次会议其中一项内容是决定5G短码块的信道编码方案,其中,提出了三种短码编码方案:T

LDPC译码算法代码概述

程序说明 V0.0 2015/1/24 LDPC译码算法代码概述 ? 概述 ? 本文介绍了包括LDPC_Simulation.m, ldpcdecoderbp1.m,ldpcdecoderminsum.m, ldpcdecoderbp2.m,ldpcdecoderminsum2.m在内的MATLAB代码的编写思路,基本原理和功能,具体代码可见文后.本文暂不涉及LDPC校验矩阵的构造和编码程序,此部分由他人提供. 修订历史 以下表格展示了本文档的修订过程 日期 版本号 修订内容 2015/02/0

3_8译码器Verilog HDL语言的简单实现

最近在学Verilog HDL语言,觉得learn in doing是比较好的学习方式,所以我们来直接分析分析代码好了. 先来一波代码: 1 module q_decode_38(data_in,data_out); 2 3 input[2:0] data_in; //端口声明 4 output[7:0] data_out; 5 reg[7:0] data_out; 6 7 always@(data_in) 8 begin 9 case(data_in) 10 3'd0:data_out = 8

FPGA开发随笔汇总

点击标题即可进入相关随笔: 1.FPGA的发展史及FPGA 的基础架构 2.用VerilogHDL设计一个与门逻辑,并进行前仿和后仿 3.点亮一个LED灯 4.3-8 译码器的设计 5.计数器设计与应用 6.利用IP核设计高性能的计数器 7.设计一个BCD码计数器. 8.用一个例子来学习阻塞赋值和非阻塞赋值 9.状态机的设计实例 10.数码管的动态扫描与驱动 11.按键消抖试验及一个数码管电子时钟的设计 12.uart通讯协议

FPGA基础知识(四)锁存器、触发器、寄存器和缓冲器的区别

一.锁存器锁存器(latch)---对脉冲电平敏感,在时钟脉冲的电平作用下改变状态锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,仅当锁存器处于使能状态时,输出才会随着数据输入发生变化.锁存器不同于触发器,它不在锁存数据时,输出端的信号随输入信号变化,就像信号通过一个缓冲器一样:一旦锁存信号起锁存作用,则数据被锁住,输入信号不起作用.锁存器也称为透明锁存器,指的是不锁存时输出对于输入是透明的.锁存器(latch):我听过的最多的就是它是电平触发的,呵呵.锁存器是

FPGA基础知识10(锁存器、触发器、寄存器和缓冲器的区别)

需求说明:IC设计基础 内容       :锁存器.触发器.寄存器和缓冲器的区别 来自       :时间的诗 原文:http://www.cnblogs.com/wwping/articles/2261312.html 一.锁存器 锁存器(latch)---对脉冲电平敏感,在时钟脉冲的电平作用下改变状态 锁存器是电平触发的存储单元,数据存储的动作取决于输入时钟(或者使能)信号的电平值,仅当锁存器处于使能状态时,输出才会随着数据输入发生变化. 锁存器不同于触发器,它不在锁存数据时,输出端的信号随

FPGA开发全攻略——ISE基本操作

原文链接: FPGA实战开发技巧(2) FPGA开发全攻略连载之十二:FPGA实战开发技巧(3) FPGA开发全攻略连载之十二:FPGA实战开发技巧(4) 5.2 如何进行FPGA设计早期系统规划 作者:Ricky Su (www.rickysu.com) 这篇文章讲述了如何用工具提高效率的方法,适用程度因人而异. Situation: 在对FPGA 设计进行最初步的系统规划的时候,需要进行模块划分,模块接口定义等工作.通常,我们起初会在纸上进行设计,到了一定阶段的定稿可能会输入Visio 等工

FPGA实现“打字机”(VGA & UART)

看到标题中的"打字机"三个字,你是不是脑补了下面这幅图像.这是二战电影中常出现的道具,现在恐怕都见不到了. ●电影道具"打字机" 我要实现的当然不是这个样子,只是功能上与之相似.先让你们看看实现的效果,直接上图. ●这是串口发的字符串 ●显示屏显示的字符 之所以要写这个"打字机"工程,那是因为我在学习FPGA的道路上,它是我重要的一关.我一开始学FPGA,是从数字电路开始入门的,然后就是学习使用QuartusII,编写Verilog代码.我写的第