利用Xilinx HLS实现LDPC译码器
1. 概述
采用Xilinx HLS快速实现的部分并行,全流水的LDPC译码器。
- 环境:Vivado HLS 2018.2
- 码字:IEEE 802.16e 2/3A
- 算法:Min-Sum Algorithm
- 代码:https://github.com/cea-wind/hls_ldpc_dec/
- 器件:xc7k160
使用方法:
1. 从GitHub上clone代码
2. 在终端运行命令
vivado_hls -f run_hls.tcl
3. 打开vivado hls GUI,找到生成的工程,打开即可
2. 码字和算法
为简单起见,采用了IEEE 802.16e标准中的2/3A码率的码字,并选择1536的码长作为具体的验证举例。该LDPC码是准循环码,每个循环子矩阵的行重为1。其校验矩阵可以用母矩阵表示为

译码算法原理可参考https://www.cnblogs.com/sea-wind2/p/4282640.html,或者直接参考其实现https://www.cnblogs.com/sea-wind2/p/4268408.html。(写得均不好,不建议参考)
译码算法采用修正因子为0.8125的最小和算法,为了简便起见,没有设置满足校验方程跳出的判断。具体可参考Git repo中的MATLAB代码,但该MATLAB代码并没有做量化。
3. 设计思路
为了体现FPGA的优势,此处采用了部分并行全流水的设计。其中部分并行指设计同时开始多个行更新和列更新,全流水指行更新和列更新采用的流水线设计可以做到一个时钟周期完成一行或一列数据的更新。
校验矩阵中有80个不为0的循环矩阵,将其分别存储在不同的BRAM上,一个周期内可访问80个循环矩阵中的任意一个数据。因此在进行行更新时,可以同时更新8行,列更新时,可以同时更新24列。按此进行并行设计。
行更新采用了全流水设计,其核心在于求最小值和次小值,可以参考https://www.cnblogs.com/sea-wind/p/8384596.html的内容。实现结构类似

列更新采用了全流水设计,利用加法即可,较为简单。
由于之前写过一份FPGA代码,因此行更新和列更新的HLS代码Verilog风格较重。
4. 分析
4.1 Simulation
通过Run C/RTL cosimulaiton,可以校验生成的RTL代码仿真是否正确。校验得知RTL simulation结果和C结果一致,在main函数指定的case下仿真通过。仿真过程中可以dump信号波形,完成仿真后可打开波形进行进一步查看。

4.2 Perference
HLS结果如下图所示,预计频率在250MHz以上。完一次译码(50次迭代)需要10020个周期。

具体耗时细节如下图,读取解调后软信息需要约1539个周期,输出结果需要约1026个周期,译码迭代需要7450个周期。

行更新需要的理论时间为64个clk,列更新也是如此。因此完成一次行列更新需要128个clock(行列不做流水的理论下限),综合结果表示latency为149个周期,效率已经极高了。关于数据读取和写回,由于设计中没有做特别优化,此处不做考虑。
上述结果表明,HLS综合结果从效率和频率上看都极其优异。
4.3 Resource
(似乎2018.2的综合策略发生了变化,利用了大量register且资源评估时未作优化,因此该阶段资源评估不准确,采用2016.3结果)
信息的存储占用了大量的资源,共有80块用于存储中间信息,24块存储输入的对数似然比,结果和分析一致。而行更新和列更新消耗了大量的逻辑资源。
行更新和列更新具体资源细节如下图所示

以列更新为例,列更新过程中,列重为3的更新有1个4-in的11bit加法,3个2-in的8bit减法,6次比较和3个3-to-1MUX。预计占用资源为3×11+3×8+6×3+3×8=97个LUT,加上地址控制等,其综合结果资源耗费合理。
因此HLS的综合结果资源占用也在合理范围内。
5. 优化
- 优化输入输出设计
- 加入停止条件
- 优化bram的使用,包括输入信息的存储和输出信息的存储
- 已经有两年没有接触LDPC了,Xilinx HLS也基本没用过,如有建议还请留言指正
利用Xilinx HLS实现LDPC译码器的更多相关文章
- LDPC译码器的FPGA实现
应用笔记 V0.0 2015/3/17 LDPC译码器的FPGA实现 概述 本文将介绍LDPC译码器的FPGA实现,译码器设计对应CCSDS131x1o1s文档中提到的适用于深空通信任务的LD ...
- 利用Xilinx ROM仿真时注意包括.mif文件
利用Xilinx ROM仿真时,注意包括.mif文件.一般是将.v文件和.mif文件放在同一个目录下,以便.v文件读取.mif数据.如不注意,就不会读出有效数据.
- Xilinx HLS
Xilinx 的高层次综合(High Level Synthesis, HLS)技术是将C/C++/SystemC软件语言转换成Verilog或VHDL硬件描述语言的技术.现已应用在SDAccel,S ...
- 利用Xilinx中的ROM构造查找表来计算sin和cos的方法探讨
1.使用matlab制作.coe文件 查找表的构造 构造256点的正余弦表 exp(-j*2*pi*(0:255)/256),分别得到 cos和sin的查找表 matlab代码: 求sin fid = ...
- 动手写一个简单版的谷歌TPU
谷歌TPU是一个设计良好的矩阵计算加速单元,可以很好的加速神经网络的计算.本系列文章将利用公开的TPU V1(后简称TPU)相关资料,对其进行一定的简化.推测和修改,来实际编写一个简单版本的谷歌TPU ...
- 高层次综合(HLS)-简介
本文是我近段时间的学习总结,主要参考了Xilinx的技术文档以及部分网上其他资料.文档主要包括ug998<Introduction to FPGA Design Using High-Level ...
- ZED-Board从入门到精通系列(八)——Vivado HLS实现FIR滤波器
http://www.tuicool.com/articles/eQ7nEn 最终到了HLS部分.HLS是High Level Synthesis的缩写,是一种能够将高级程序设计语言C,C++.Sys ...
- 基于VHDL利用PS2键盘控制的电子密码锁设计
基于VHDL利用PS2键盘控制的密码锁设计 附件:下载地址 中文摘要 摘 要:现代社会,人们的安全意识正在不断提升.按键密码锁由于其具有方便性.低成本等特征,还是大有用武之地的.但是通常的按键密码锁开 ...
- Xilinx FPGA全局介绍
Xilinx FPGA全局介绍 现场可编程门阵列 (FPGA) 具有诸多特性,无论是单独使用,抑或采用多样化架构,皆可作为宝贵的计算资产:许多设计人员并不熟悉 FPGA,亦不清楚如何将这类器件整合到设 ...
随机推荐
- asp.net core中DockerFile文件中的COPY
今天在ubuntu系统中使用docker部署asp.net core时遇到了一个问题,docker build 的时候总会在最后一步提示 lstat obj/Docker/publish: no su ...
- 关于Tomcat端口出现的问题
=Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are already in use. Th ...
- s = sorted(lst,key= func) # 将列表中的元素一个一个传给func,根据func的返回值进行排序
排序函数sorted :语法: sorted(iterable,key=func , reverse )key:排序规则(排序函数),在sorted内部将"可迭代对象"中的每一个元 ...
- 树&二叉树&&满二叉树&&完全二叉树&&完满二叉树
目录 树 二叉树 完美二叉树(又名满二叉树)(Perfect Binary Tree) 完全二叉树(Complete Binary Tree) 完满二叉树(Full Binary Tree) 树 名称 ...
- 【C#】#100 调用摄像头
需求:由于项目需要获得用户的头像,所以需要用C#调用摄像头获取头像. 下面写一个调用摄像头的方法 案例:调用摄像头的一个DEMO[效果图] 使用的类库:AForge.dll [Demo下载,Dem ...
- 面对对象程序设计_task2_1001.A+B Format (20)
Someting about 1001.A+B Format (20) 问题描述及我所写的代码:click here → My Task 看到这个题目的时候,我的想法很简单,直接判断直接输出,因为给定 ...
- laravel框架之blade模板引擎
## 1.基本用法 ##情形1 $name = laravel5 <div class="title"> {{$name}} {{$name}}</div> ...
- 1877. [SDOI2009]晨跑【费用流】
Description Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他 坚持下来的只有晨跑. 现在给出一张学校附近的地图,这张地图中包含N个 ...
- 【洛谷】【st表+模拟】P1311 选择客栈
[题目描述:] 丽江河边有n 家很有特色的客栈,客栈按照其位置顺序从 1 到n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0 ~ k-1 表示),且每家客栈都设有一家咖啡店,每家咖 ...
- 创建JDBCUtils工具类
JDBCUtils工具类 私有化构造函数,外界无法直接创建对象 提供公共的,静态的,getConnection 方法,用来给外界提供数据库连接 提供公共的,静态的,close方法,用来释放资源 pac ...