你不总是需要转换到定点FPGA或ASIC部署

作者:杰克·埃里克森、基兰·金塔利和乔纳森·杨,MathWorks

MATLAB®和仿真软金宝app件®使用基于浮点的建模,以确保算法模拟的高精度计算。转换为固定点降低了数学精度,并且在转换期间击中数据类型字长度和数学精度之间的正确平衡可能具有挑战性。对于需要高动态范围或高精度的计算(例如,具有反馈循环的设计),定点转换可以消耗数周或数月的工程时间,并且可能导致大的固定点字长度。

从版本R2016B开始,您可以使用HDL Coder™直接从Simulink中的单精度浮点数据生成FPGA或ASIC实现的HDL代码金宝app本机浮点图书馆。

在本文中,我们将介绍本地浮点工作流,使用部署在FPGA上的IIR滤波器作为示例。然后,我们将回顾使用固定点的挑战,并比较使用单精度浮点或固定点的面积和频率权衡。我们还将展示浮点数和固定点的组合如何在实际设计中减少转换和实现时间的同时提供更高的精度。您将看到在具有高动态范围要求的实际设计中,浮点数如何显著减少面积并提高速度。

本机浮点实现:在引擎盖下

HDL Coder通过在FPGA或ASIC资源上模拟底层数学实现单精度算法(图1)。生成的逻辑将输入浮点信号解包为符号、指数和尾数个体整数,分别为1、8和23位宽。生成的硬件描述语言(VHDL)®或Verilog®逻辑然后执行浮点计算——在图1所示的情况下,是乘法——通过计算输入符号位、幅度相乘、指数相加和计算结果所需的相应归一化得到的符号位。逻辑的最后一个阶段将符号、指数和尾数包装回浮点数据类型。

图1所示。HDL编码器如何将单精度浮点乘法映射到定点硬件资源。

当您在HDL工作流程顾问中选择“本机浮点库”代码生成选项时,HDL编码器将自动为单精度操作。您还可以设置提供更多控制浮点操作如何在硬件中实现的选项,例如针对FPGA上针对特定DSP逻辑的特定延迟。HDLCoder还提供刷新异常的选项,以零,有效处理INFS和NANS。

用定点转换解决动态范围问题

一个简单的表达方式1-a / 1 + a,如果需要实现高动态范围,可以通过使用单一精度自然转换(图2)。

图2。单精度实现(1-a)/(1+a)。

然而,实现相同的方程在定点需要许多步骤和数值考虑(图3)。例如,你必须打破部门成乘法和互惠,用近似方法如牛顿或附近地区为非线性互操作,使用不同的数据类型来仔细控制增长,选择适当的分子和分母类型,并为加法器和减法器使用特定的输出类型和累加器类型。

图3.(1-A)/(1 + A)的固定点实现。

探索IIR实现选项

让我们看一个无限脉冲响应(IIR)滤波器的例子。IIR滤波器需要高动态范围的计算与反馈环路,使其棘手收敛在定点量化。图4a显示了一个测试环境,比较三种版本的相同IIR滤波器与噪声正弦波输入。正弦波的振幅为1,添加的噪声使振幅略有增加。第一个版本的滤波器是双精度的(图4b)。第二个版本是单精度。第三个版本是定点实现(图4c)。这个实现产生的数据类型的字长为22位,其中1位分配给符号,21位分配给分数。这种特殊的数据类型留下0位来表示整数值,这是有意义的,因为对于给定的刺激,它的值范围总是在-1到1之间。如果设计必须使用不同的输入值,则需要在定点量化期间考虑到这一点。

图4. a。具有嘈杂的正弦波输入的IIR过滤器的三个实现。

图4 b。IIR_filter实现,使用双精度数据类型显示。

图4C。IIR_FILTER_FIXPT实现,它使用符号的固定点数据类型,18位字长度,其中16个位数的16个位。

测试环境设置为使用双精度滤波器进行比较单精度和定点滤波器的结果,这被认为是金色的参考。在这两种情况下,精度损失将产生一定的误差。问题是该错误是否在我们应用程序的可接受公差范围内。

当我们运行固定点设计器™进行转换时,我们指定了1%的错误容错。图5显示了比较结果。单精度版本的错误约为10-8,而定点数据类型是10的数量级-5.这在我们指定的容错范围内。如果您的应用程序需要更高的精度,您可能需要增加定点词的长度。

图5。仿真结果比较了双精度IIR滤波器的结果与单精度结果(上)和定点结果(下)。

要实现这种量化,需要有硬件设计的经验,对可能的系统输入有全面的理解,明确的精度要求,以及定点设计师的一些帮助。如果可以帮助您缩小用于生产部署的算法,那么这种努力是值得的。但是,如果只需要简单地部署到原型硬件上,或者准确性要求使减少物理占用变得困难,该怎么办呢?

在这些情况下的解决方案是使用单精度本机浮点数。

简化本机浮点的过程

使用本机浮点有两个好处:

  • 您不必花时间尝试分析维持足够精度的最小比特数量,以获得各种输入数据。
  • 单精度浮点操作的动态范围扩展得更有效,固定成本为32位。

现在设计过程简单多了,并且您知道,通过符号、指数和尾数的位,您可以表示一个广泛的动态范围的数字。图6中的表使用图5所示的数据类型选择比较了IIR过滤器的浮点实现和定点实现的资源利用率。

图6. IIR滤波器的固定点和浮点实现之间的资源使用比较。

当您比较从浮点实现和定点实现获得的结果时,请记住,浮点计算比简单的定点运算需要更多的操作。当您部署到FPGA或ASIC时,使用单一精度将导致更高的物理资源使用。如果需要考虑电路面积,那么您将需要权衡更高的精度和资源使用。您还可以使用浮点和固定点的组合来减少面积,同时保持单一精度,以实现高动态范围的数值密集型计算岛。

管理本机浮点的资源用法

本机浮点是为高动态范围应用程序生成代码的一种简单方法,可以对FPGA进行编程或部署到ASIC上。但是如果本机浮点数超过了资源预算,有几种方法可以减少资源使用:

  • 使用HDL编码优化。资源共享和其他算法级优化支持本机浮点代码生成。金宝app例如,这些优化可以通过共享消耗重要区域的复杂数学操作来减少区域,例如exp.量化通过时分复用和其他共享和流传输技术。
  • 在适当的地方使用定点转换过程。无需高动态范围要求或反馈循环的设计对于设计是简单的,而定点设计器有助于自动化此过程。在某些类型的设计中,在不添加额外比特的情况下实现融合可能很困难。在这种情况下,使用本机浮点的选择性应用是更好的选择。此方法对大多数设计使用定点转换,同时允许您在数据路径的高动态范围部分中使用浮点。
  • 在设计中创建浮点和固定点“岛屿”。一旦确定了设计中难以实现收敛的部分,就可以使用数据类型转换块将它们隔离开来,数据类型转换块将输入转换为单一精度,然后将操作的输出转换回适当的定点类型。图7显示了电机控制设计的一部分,其中增益操作和sincos操作被隔离为一个本地浮点区域,输出被转换回一个定点值。

图7。在相同的设计中混合固定点和本地浮点。

下面是一个在设计中选择浮点或定点的快速指南:

如果有以下情况,请在整个设计中使用浮点数:

  • 你缺乏定点量化的经验。
  • 你的算法混合了非常大和非常小的数字。
  • 您的设计广泛使用大于32位的定点类型。
  • 您的设计包括非线性操作,如国防部日志exp.,:,很难转化为固定点。
  • 您可以灵活地使用更大的面积和延迟(例如,在低带宽的应用程序,如电机控制或音频处理)。

使用固定点在你的整个设计中,如果:

  • 你对定点量子化很有经验。
  • 将算法转换为固定点是很简单的。
  • 您有严格的区域和延迟要求。

混合浮动和固定点如果:

  • 你的设计混合了控制逻辑和大动态范围的数据路径。
  • 只有一部分设计都具有挑战性,以量化到固定点。
  • 您有足够的空间来满足有限使用浮点运算的需求。

一个使用本地浮点的真实例子

如图8所示,如果您正在处理动态范围问题并向更长的单词长度移动,那么定点实现将比浮点版本消耗更多的资源。

图8. SQRT功能资源利用率。在更大的单词长度下,SQRT消耗更多的FPGA资源,而不是单精度实现,这具有固定成本。

要了解本机浮点如何在这种情况下发挥作用,请考虑这个电动汽车模型(图9)。这是一个包含许多组件的复杂模型,包括电池模型、逆变器、PMSM和汽车模型。

图9。电动汽车模型。

图10显示了用于实现这些组件的数学方程。

图10.电动车型中使用的数学方程。

由于组件之间的所有反馈循环,将这种模型定位到具有固定点的硬件可能具有挑战性。这可能需要几个月的时间来弄清楚如何减少量化误差在一个系统的组件与PMSM和逆变器之间复杂的反馈回路。为了减少错误,你必须使用非常大的单词长度。但是,有了浮点支持,您可以直接将此模型定金宝app位在硬件上,而无需将其转换为固定点。

如图11所示,浮点是具有反馈循环的算法的数据类型的正确选择 - 浮点实现使用较少的区域并且更好地执行,因为相同算法的定点版本需要大的单词长度。

图11.电动车型的固定点和浮点实现的比较。

结论

定点量化历来是使算法适应目标FPGA或ASIC硬件的最具挑战性的任务之一。本机浮点HDL代码生成允许您生成VHDL或Verilog的浮点实现在硬件中无需定点转换的努力。如果您正在创建FPGA实现,这种方法可以节省大量时间,而且可以更快地将算法定位到Xilinx®Zynq®SoC或Intel®SoC FPGA。

对于同时需要固定点控制逻辑和浮点高动态范围数据路径的设计,您可以很容易地将两者结合起来。

2018年出版的