概述
概述
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仿真。此时的延迟和资源使用情况如下:
此时使用了14个DSP48资源。此时的仿真结果为:
保证了小数点后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仿真。此时的延迟和资源使用情况如下:
仿真结果,此时的仿真结果为:
此时的数据类型保证了小数点后5位的数据正确性,并且节约了12个DSP48资源。
最后
以上就是高高小虾米为你收集整理的HLS实践 - 04 - 任意精度概述使用标准C数据类型使用任意精度类型的全部内容,希望文章能够帮你解决HLS实践 - 04 - 任意精度概述使用标准C数据类型使用任意精度类型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复