首页 > 技术 > 内容

Xilinx Vivado HLS中Floating-Point(浮点)设计介绍

时间:2026-01-22  作者:Diven  阅读:0

编码风格与技巧

尽管通常Fixed-Point(定点)比Floating-Point(浮点)算法的FPGA实现要更快,且面积更高效,但往往有时也需要Floating-Point来实现。这是因为Fixed-Point有限的数据动态范围,需要深入的分析来决定整个设计中间数据位宽变化的pattern,为了达到优化的QoR,并且要引入很多不同类型的Fixed-Point中间变量。而Floating-Point具有更大的数据动态范围,从而在很多算法中只需要数据类型的优势。

Xilinx Vivado HLS工具支持C/C++ IEEE-54标准单精度及双精度浮点数据类型,可以比较容易,快速地将C/C++ Floating-Point算法转成RTL代码。与此为了达到用户期望的FPGA资源与性能, 当使用Vivado HLS directives时需要注意C/C++编码风格与技巧相结合。

编码风格

1.1 单双精度浮点数学函数

#include

float example(float var)

{

return log(var); // 双精度自然对数

}

在C设计中, 这个例子, Vviado HLS 生成的RTL实现将输入转换成双精度浮点,并基于双精度浮点计算自然对数,然后将双精度浮点输出转换成单精度浮点。

#include

float example(float var)

{

return logf(var); // 单精度自然对数

}

在C设计中, logf才是单精度自然对数, 这个例子 Vviado HLS 生成的RTL实现将基于单精度浮点计算自然对数, 而且没有输入输出单双精度的互转。

1.2 浮点运算优化

我们先来看一个例子,三个从代数上看起来差不多的写法,但其在Vivado HLS中综合出来的是三个完全不一样的结果。

void example(float *m0, float *m1, float *m2, float var)

{

*m0 = 0.2 * var; // 双精度浮点乘法,单双精度类型转换

*m1 = 0.2f * var; // 单精度浮点乘法

*m2 = var / 20.0f; // 单精度浮点除法

}

Vivado HLS将日m0, m1, m2综合成不同的RTL实现。

因为0.2是一个不能精确表征的双精度数字, 所以m0运算会被Vivado HLS综合成一个双精度浮点乘法, 并且将var 转换成双精度, 然后将双精度乘法输出m0转换成单精度。

特别注意,如果希望Vivado HLS综合出单精度常熟,需要在常数后面加f, 如0.2f。这样m1综合成一个单精度乘法的输出。同理,m2将被Vivado HLS综合成单精度除法的输出。

我们来看另外一个例子。

void example(float *m0, float *m1, float var)

{

*m0 = 0.2f * 5.0f * var; // *m0 = var;常数乘法被优化掉

*m1 = 0.2f * var * 5.0f; // 两个双精度浮点乘法

}

再来看另一个例子。

void example(float *m0, float *m1, float var)

{

*m0 = 0.5 * var; //

*m1 = var/2; //

}

m0运算会被Vivado HLS综合成一个双精度浮点乘法, 并且将var 转换成双精度, 然后将双精度乘法输出m0转换成单精度。

m1运算会被Vivado HLS综合成简单的右移运算。所以如果用户希望实现对var除以2, 就写成m1这种表达式,而不是m0的表达式。

并行度与资源复用

由于浮点运算相比整型,定点运算耗用更可观的资源。Vivado HLS会尽量用更有效的资源来实现浮点运算,当数据的相关性及约束许可的情况下,在Vivado HLS中,会尽量复用一些浮点运算单元。为了说明这个,我们看一个简单的四个浮点加法例子, Vivado HLS复用一个浮点加法器来串行实现四个浮点加法。

void example(float *r, float a, float b,

float c, float d)

{

*r = a + b + c + d;

}

有时设计需要更高的throughput及更低的latency。这时就需要提高设计的并行度。以下面例子来说明,在Vivado HLS就需要对for循环loop加pipeline与unroll 的directives。同时需要通过设置a,b,r0 为FIFO, 并对其重排以提高I/O带宽两倍。这样Vivado HLS就会综合出两个浮点加法来并行实现,这是因为每个加法器计算是完全独立的。

void example(float r0[32], float a[32], float b[32])

{

#pragma HLS interface ap_fifo port=a,b,r0

#pragma HLS array_reshape cyclIC factor=2 variable=a,b,r0

for (int i = 0; i 《 32; i++)

{

#pragma HLS pipeline

#pragma HLS unroll factor=2

r0[i] = a[i] + b[i];

}

}

如果更多复杂的运算,或许会导致不独立的浮点运算,在这种情况下,Vivado HLS不能重新排列这些运算的顺序,这样会导致更低的,不是所期望的复用。 下面举例来说明如何提高带有反馈浮点运算的性能。

这个例子的累加会导致recurrence,并且通常浮点加法的latency大于一个时钟周期,加的pipeline directive并不能达到一个时钟周期完成一次累加的throughput。

float example(float x[32])

{

#pragma HLS interface ap_fifo port=x

float acc = 0;

for (int i = 0; i 《 32; i++)

{

#pragma HLS pipeline

acc += x[i];

}

return acc;

}

猜您喜欢


现代电子产品中,连接器的作用不可小觑。CONN_47.34X5.5MM_SM作为高性能连接器,因其独特的设计和优越的性能,应用于各种电子设备中。本文将对CONN...
2025-04-26 19:01:40
电伴热带根据不同的应用需求和工作原理,可以分为多种类型。按加热方式的不同,可以分为自限温电伴热带和恒功率电伴热带。自限温电伴热带具有自我调节的特点,当环境温度升...
2008-12-07 00:00:00
光敏电阻作为重要的光电元件,在各种智能设备和自动化系统中是关键配件。富之光(FUJICON)作为知名的光敏电阻品牌,很好的性能和可靠的品质赢得了广大客户的青睐。...
2019-03-18 20:36:53
显微镜是科学研究和实验室工作中不可少的工具,其参数直接影响观察效果和实验结果。放大倍数是显微镜的重要参数,通常以倍数表示,如100倍、400倍等,决定了观察对象...
2017-09-04 00:00:00
灭火器箱是专门用于存放和保护灭火器的设备,通常安装在建筑物的显眼位置,以便在紧急情况下能够迅速取用。主要功能是确保灭火器在任何时候都能保持良好的工作状态,避免受...
2020-04-03 00:00:00
贴片电阻是电子电路中不可或缺的元件,选择合适的阻值至关重要。贴片电阻阻值表为此提供了便捷的查找方式,它清晰地列出了各种常用的贴片电阻阻值,涵盖了从几欧姆到几兆欧...
2025-04-14 15:03:44
随着电子产品的飞速发展,MCU的集成度越来越高,体积越来越少,封装形式越来越多。编程是产品上市前至关重要的一道工序,采用什么样的编程方式才适合产品生产呢,本文为...
2019-05-11 09:03:00
电阻器作为基础元件其性能参数受到关注。susumu作为知名电阻品牌,其长电极电阻因稳定性和高精度而广受市场青睐。本文将围绕“susumu长电极电阻电压参数多少品...
2012-10-12 04:46:30
选购贴片电阻,性价比是关键!我们综合考量了品牌知名度、产品质量、价格以及用户口碑等因素,为您整理出十大贴片电阻知名品牌性价比排名榜,希望能帮助您快速找到适合自己...
2024-11-29 10:25:58
电路保护元件的重要性日益凸显。自恢复保险丝作为能够自动恢复的保护元件,应用于各种电子设备中。本文将重点介绍驭舵自恢复保险丝的基本概念、封装参数及主流品牌,帮助读...
2021-08-06 10:24:30