概述
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资源。