技术文章和通讯

对于FPGA或ASIC部署,您并不总是需要转换为固定点

作者:Jack Erickson, Kiran Kintali, Jonathan Young, 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 Workflow Advisor中选择“Native Floating Point Library”代码生成选项时,HDL Coder会为您的单精度操作自动完成所有这些操作。您还可以设置一些选项,以提供对如何在硬件中实现浮点操作的更多控制,例如针对特定的延迟,针对FPGA上的特定DSP逻辑。HDLCoder还提供了将正常值刷新为零的选项,并有效地处理inf和nan。

用定点转换处理动态范围问题

一个简单的表达式1 a / 1 +,如果需要用高动态范围实现,可以使用单精度自然转换(图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实现,用双精度数据类型显示。

图4 c。IIR_filter_fixpt实现,它使用带符号的定点数据类型,18位字长,其中16位表示分数长度。

建立了测试环境,将单精度和定点滤波器的结果与双精度滤波器的结果进行了比较,并将双精度滤波器作为黄金参考。在这两种情况下,精度的降低都会产生一定的误差。问题是这个错误是否在应用程序可接受的容忍范围内。

当我们运行Fixed-Point Designer™来执行转换时,我们指定了1%的容错性。图5显示了比较的结果。单精度版本的误差在10左右-8,而定点数据类型大约为10-5。这在我们指定的容错范围内。如果您的应用程序需要更高的精度,您可能需要增加定点字的长度。

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

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

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

使用本机浮点数简化过程

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

  • 您不需要花费时间来分析维持各种输入数据的足够精度所需的最小位数。
  • 单精度浮点运算的动态范围以32位的固定成本更有效地扩展。

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

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

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

使用本机浮点管理资源使用

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

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

图7。在同一设计中混合固定点和原生浮点数。

以下是在你的设计中选择浮点或固定点的快速指南:

在你的整个设计中使用浮点数,如果:

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

使用固定点为您的整个设计,如果:

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

如果:将浮动和固定点混合:

  • 您的设计具有大动态范围的控制逻辑和数据路径的混合。
  • 只有一部分设计是具有挑战性的量化到定点。
  • 对于浮点运算的有限使用,您的区域需求中有足够的空间。

使用本机浮点的真实示例

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

图8。函数资源利用率的根号。在较大的字长时,sqrt比单精度实现消耗更多的FPGA资源,单精度实现的成本是固定的。

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

图9。电动汽车模型。

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

图10。在电动汽车模型中使用的数学方程。

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

如图11所示,对于具有反馈循环的算法来说,浮点是正确的数据类型选择—浮点实现使用的面积更小,性能更好,因为同一算法的定点版本需要较大的单词长度。

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

结论

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

对于需要两个世界的最好的设计-固定点的控制逻辑和浮点的高动态范围的数据路径-你可以很容易地将两者结合起来。

2018年出版的