技术文章和通讯

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

作者:Jack Erickson, Kiran Kintali和Jonathan Young, MathWorks


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

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

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

本机浮点实现:在底层

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

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

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

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

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

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

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

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

然而,在不动点上实现相同的方程需要许多步骤和数值考虑(图3)。例如,您必须将除法分解为乘法和倒数,使用近似方法(如牛顿-拉夫森或LUT)进行非线性倒数运算,使用不同的数据类型仔细控制位增长,选择适当的分子和分母类型,并使用特定的输出类型和累加器类型进行加减法。

图3。(1-a)/(1+a)的定点实现。

图3。(1-a)/(1+a)的定点实现。

探索IIR实施方案

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

图4。a.带噪声正弦波输入的IIR滤波器的三种实现。

图4。a.带噪声正弦波输入的IIR滤波器的三种实现。

图4 b。带噪声正弦波输入的IIR滤波器。b. IIR_filter设计,显示双精度数据类型。

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

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

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

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

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

图5。双精度IIR滤波结果与单精度和定点滤波结果的比较仿真结果。

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

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

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

用本机浮点数简化过程

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

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

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

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

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

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

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

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

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

图7。在同一设计中混合了定点和本地浮点。

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

在以下情况下使用浮点数:

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

在下列情况下,使用定点设计:

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

混合浮点和定点,如果:

  • 您的设计混合了控制逻辑和具有大动态范围的数据路径。
  • 只有一部分设计难以量化到固定点。
  • 在您的区域需求中有足够的余量来限制浮点运算的使用。

一个使用原生浮点数的真实例子

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

图8。根号函数资源利用率。

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

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

图9。电动汽车模型。

图9。电动汽车模型。

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

图10。用于电动汽车模型的数学方程。

图10。用于电动汽车模型的数学方程。

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

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

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

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

结论

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

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

2018年出版的