以下代码示例显示了所执行的部分基本算术运算。
#include "types_standard.h"
void types_standard(din_A inA, din_B inB, din_C inC, din_D inD,
dout_1 *out1, dout_2 *out2, dout_3 *out3, dout_4 *out4
) {
// Basic arithmetic operations
*out1 = inA * inB;
*out2 = inB + inA;
*out3 = inC / inA;
*out4 = inD % inA;
}
以上示例中的数据类型是在 types_standard.h
头文件中定义的,如下代码示例所示。其中显示了以下类型的使用方式:
- 标准有符号类型
- 无符号类型
- 精确宽度的整数类型(包含
stdint.h
头文件)#include <stdio.h> #include <stdint.h> #define N 9 typedef char din_A; typedef short din_B; typedef int din_C; typedef long long din_D; typedef int dout_1; typedef unsigned char dout_2; typedef int32_t dout_3; typedef int64_t dout_4; void types_standard(din_A inA,din_B inB,din_C inC,din_D inD,dout_1 *out1,dout_2 *out2,dout_3 *out3,dout_4 *out4);
这些不同类型经过综合可生成以下运算符和端口大小:
- 用于计算结果
out1
的乘法器为 24 位乘法器。8 位char
类型乘以 16 位short
类型需要 24 位乘法器。结果是符号位将扩展为 32 位,以与输出端口宽度匹配。 - 用于
out2
的加法器为 8 位。由于输出为 8 位unsigned char
类型,因此仅将底部 8 位inB
(16 位short
)与 8 位char
类型的inA
相加。 - 对于
out3
输出(32 位精确宽度类型),8 位char
类型的inA
的符号位将扩展为 32 位值,并使用 32 位(int
类型)inC
输入执行 32 位除法运算。 - 使用 64 位
long long
类型的inD
来执行 64 位模数运算,8 位char
类型的inA
的符号位将扩展至 64 位,以创建 64 位输出out4
的结果。
根据 out1
结果指示,Vitis HLS 使用可用的最小运算符,并扩展结果以与所需输出位宽相匹配。对于 out2
结果,即使其中一项输入为 16 位,仍可使用 8 位加法器,因为只需 8 位输出。正如 out3
和 out4
的结果所示,如需所有位元,则将对完整大小的运算符进行综合。