我是靠谱客的博主 高高小虾米,最近开发中收集的这篇文章主要介绍HLS实践 - 04 - 任意精度概述使用标准C数据类型使用任意精度类型,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

概述

C/C++ 提供的数据类型固定为 8 位(8的整数倍):

  • char(8 位)
  • short(16 位)
  • int(32 位)
  • long long(64 位)
  • float(32 位)
  • double(64 位)
  • 精确宽度整数类型,例如 int16_t(16 位)和 int32_t(32 位)

创建硬件时,通常需要更准确的位宽。位宽设置不恰当可能会造成丢失数据或者浪费资源, Vivado 高级综合 (HLS) 提供多种位精确或任意精度数据类型,允许您使用任何(任意)宽度对变量进行建模。

在本次设计中,使用标准 C 类型综合设计。然后在该项目的基础上进行使用任意精度类型进行优化对比。

使用标准C数据类型

添加文件进行设计,该工程文件根据之前的工程进行修改,在source中添加adders.cpp和adders.h,因为任意精度里的定点数表示只在C++中可以使用所以在这里定义为cpp文件。

此时使用的是标准C的数据类型

adders.cpp

#include "adders.h"
double adders(double in1, double in2, double in3) {
#pragma HLS INTERFACE ap_ctrl_none port=return
// Prevent IO protocols on all input ports
#pragma HLS INTERFACE ap_none port=in3
#pragma HLS INTERFACE ap_none port=in2
#pragma HLS INTERFACE ap_none port=in1

	double sum;
	sum = in1 + in2 * in3;
	return sum;
}

adders.h

#include "adders.h"
double adders(double in1, double in2, double in3) {
#pragma HLS INTERFACE ap_ctrl_none port=return
// Prevent IO protocols on all input ports
#pragma HLS INTERFACE ap_none port=in3
#pragma HLS INTERFACE ap_none port=in2
#pragma HLS INTERFACE ap_none port=in1

	double sum;
	sum = in1 + in2 * in3;
	return sum;
}

test bench里添加下面文件内容:

#include <stdio.h>
#include "adders.h"

int main()
{
	double inA, inB, inC;
	double sum;
	// For adders
	double refOut[2] = {6.66058944, 12.91818944};
	int i;
	inA = 0;
	inB = 2.1288;
	inC = 3.1288;
	// Call the adder for 2 transactions
	for (i=0; i<2; i++)
	{
		sum = adders(inA, inB, inC);
		fprintf(stdout, "    %lf+%lf*%lf=%lf n", inA, inB, inC, sum);
		fprintf(stdout, "ref:%lf+%lf*%lf=%lf n", inA, inB, inC, refOut[i]);
		inB=inB+1;
		inC=inC+1;
	}
	return 0;
}

完成添加后进行C综合并进行C仿真。此时的延迟和资源使用情况如下:

image-20210820102533941

此时使用了14个DSP48资源。此时的仿真结果为:

image-20210820190756087

保证了小数点后6位的精度。

使用任意精度类型

因为任意精度里的定点数表示只在C++中可以使用所以在这里定义为cpp文件。

修改source中的参数的数据类型。

adders.cpp

#include "adders.h"
doubl1 adders(doubl in1, doubl in2, doubl in3) {
#pragma HLS INTERFACE ap_ctrl_none port=return
// Prevent IO protocols on all input ports
#pragma HLS INTERFACE ap_none port=in3
#pragma HLS INTERFACE ap_none port=in2
#pragma HLS INTERFACE ap_none port=in1

	double sum;
	sum = in1 + in2 * in3;
	return sum;
}

adders.h

#ifndef ADDERS_H_
#define ADDERS_H_
#include "ap_fixed.h"
typedef ap_fixed<24,8> doubl;
typedef ap_fixed<26,8> doubl1;
doubl1 adders(doubl in1, doubl in2, doubl in3);

#endif

完成添加后进行C综合并进行C仿真。此时的延迟和资源使用情况如下:

image-20210820190031827

仿真结果,此时的仿真结果为:

image-20210820190307584

此时的数据类型保证了小数点后5位的数据正确性,并且节约了12个DSP48资源。

最后

以上就是高高小虾米为你收集整理的HLS实践 - 04 - 任意精度概述使用标准C数据类型使用任意精度类型的全部内容,希望文章能够帮你解决HLS实践 - 04 - 任意精度概述使用标准C数据类型使用任意精度类型所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部