HLS_1 FPGA并行编程_FIR

fir.cpp

#include "fir.h"
void fir(data_t *y,data_t x){
	coef_t C[N] = {53,0,-91,0,313,500,313,0,-91,0,53};
	static
	data_t shift_reg[N];
	acc_t acc;
	int i;
	acc = 0;
	Shift_Accum_Loop:
	for(i = N - 1;i >= 0;i--){
		if(i == 0){
			acc += x * C[0];
			shift_reg[0] = x;
		}
		else
		{shift_reg[i] = shift_reg[i - 1];
		acc += shift_reg[i] * C[i];
		}
	}
	*y = acc;
}

fir.h

#define N 11
#include "ap_int.h"
typedef int coef_t;
typedef int data_t;
typedef int acc_t;
void fir(data_t *y,data_t x);

得出fir.cpp综合之后

优化一

将条件语句删除,对for循环进行优化:

for(i = N - 1;i >0;i--){
		shift_reg[i] = shift_reg[i - 1];
		acc += shift_reg[i] * C[i];
	}
acc += x * C[0];
shift_reg[0] = x;

得到有效加速
在这里插入图片描述
由此可知,for里面的if/else语句的效率特别低。

优化二

循环内部分开

TDL:
for(i = N - 1;i > 0;i--)
{
shift_reg[i] = shift_reg[i - 1];
}
shift_reg[0] = x;
acc = 0;
MAC:
for(i = N-1;i >= 0;i--)
{
acc += shift_reg[i] * C[i];
}

综合之后得下图,减少了资源,但是,延长了执行时间。
在这里插入图片描述
综上所述:for里面的语句都是并行得到。而外面的语句都是顺序执行滴。

优化三:

循环拆分TDL:

TDL:
for(i = N - 1;i > 1;i = i - 2){
shift_reg[i] = shift_reg[i - 1];
shift_reg[i - 1] = shift_reg[i - 2];
}
if(i == 1){
shift_reg[1] = shift_reg[0];
}
shift_reg[0] = x;
MAC:
for(i = N-1;i >= 0;i--)
{
acc += shift_reg[i] * C[i];
}

综合得出下图:
一次需要并行读取两个数据,因此BRAM=2
在这里插入图片描述

优化四:

循环展开
pipline流水线 unroll 。。。
手动展开:

TDL:
	for(i = N - 1;i > 1;i = i - 2){
	shift_reg[i] = shift_reg[i - 1];
	shift_reg[i - 1] = shift_reg[i - 2];
	}
	if(i == 1){
	shift_reg[1] = shift_reg[0];
	}
	shift_reg[0] = x;

	acc = 0;
MAC:
	for(i = N - 1;i >= 3;i -= 4){
	acc += shift_reg[i] * C[i] +
	shift_reg[i - 1] * C[i - 1] +
	shift_reg[i - 2] * C[i - 2] +
	shift_reg[i - 2] * C[i - 2] +
	shift_reg[i - 3] * C[i - 3];
	}
	for(;i >= 0; i--){
	acc += shift_reg[i] * C[i];
	}

资源用度:
在这里插入图片描述

优化五:

流水线:对于for循环的操作进行重叠优化。
任何for都可进行流水线优化
原始的MAC包括四个步骤:
1.读(2个周期)
2.读
3.*
4.+=
在这里插入图片描述
优化六:
位宽优化

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Xilinx官方翻译的《FPGA并行编程》,本书以10个数字信号处理为例,带我们了解HLS如何使C代码并行运行,深入浅出的将HLS实现方法,硬件设计的考虑 以及系统优化都一一介绍。本书可以在小白仓库微信公众号号免费下载,还可以在Xilinx学术合作找到相应的下载链接。 本人还制作了该书的读书笔记,详情请见《FPGA并行编程》读书笔记专栏启动说明:https://blog.csdn.net/qq_35712169/article/details/99738006 。 本书将着重介绍高层次综合(HLS) 算法的使用并以此完成一些比较具体、细分的FPGA应用。我们的 目的是让读者认识到用HLS创造并优化硬件设计的好处。当然,FPGA并行编程肯定是有别于在多核处理 器、GPU上实行的并行编程,但是一些最关键的概念是相似的,例如,设计者必须充分理解内存层级和带 宽、空间局部性与时间局部性、并行结构和计算与存储之间的取舍与平衡。 本书将更多的作为一个实际应用的向导,为那些对于研发FPGA系统有兴趣的读者提供帮助。对于大学教育来说,这本书将更适用于高阶的本科课程或研究生课程,同时也对应用系统设计师和嵌入式程序员有 所帮助。我们不会对C/C++方面的知识做过多的阐述,而会以提供很多的代码的方式作为示范。另外,读者 需要对基本的计算机架构有所熟悉,例如流水线(pipeline),加速,阿姆达尔定律(Amdahl's Law)。以寄存器传输级(RTL)为基础FPGA设计知识并不是必需的,但会对理解本书有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风尘23187

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值