0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FPGA定点和浮点数学运算实例对比

FPGA研究院 来源:OpenFPGA 2025-06-23 09:53 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

来源:OpenFPGA;作者:碎碎思

在创建 RTL 示例时,经常使用 VHDL 2008 附带的 VHDL 包。它提供了出色的功能,可以高效地处理定点数,当然,它们也是可综合的。该包的一些优点包括:

有符号和无符号(后缀和后缀)定点向量。

轻松将定点数表示并量化为定点向量。

小数点位于向量元素 0 和 -1 之间。这样就无需在运算过程中跟踪小数点以进行对齐(大量运算这点很难把握)。

运算的溢出、舍入和范围管理有明确的定义。

算术和比较运算符。

因此,当需要实现算法时,我会使用这个包。但是实际应用时,还会有很多浮点运算。

自然而然地,一个问题出现了:用定点和浮点实现同一个方程时,资源有什么区别?

我们将要看的例子是如何利用多项式近似地将ADC读数转换为温度值。这在工业应用中很常见(使用铂电阻温度计时)。

cd0d6d2e-4bd3-11f0-b715-92fbcf53809c.png

要实现的具体方程是 y = 2E-09x4 - 4E-07x3 + 0.011x2 + 2.403x - 251.26,该方程是从绘制方程式中提取出来的。虽然我们可以直接实现该方程,但这会非常浪费资源,还会增加开发的复杂性和风险。

cd1adb58-4bd3-11f0-b715-92fbcf53809c.png

使用定点数系统,我们需要做一些量化来保持精度和准确度。

代码和一个简单的仿真如下。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.fixed_pkg.all;
entity complex_example is port(
clk  :instd_logic;
ip   :instd_logic_vector(7 downto 0);
op   : out std_logic_vector(8 downto 0));
end complex_example;
architecture Behavioral of complex_example is
signal power_a : sfixed(8 downto -32):=(others=>'0');
signal power_b : sfixed(8 downto -32):=(others=>'0');
signal power_c : sfixed(8 downto -32):=(others=>'0');
signal calc : sfixed(8 downto -32) :=(others=>'0');
signal store : sfixed(8 downto 0) := (others =>'0');
constant a : sfixed(8 downto -32):= to_sfixed( 2.00E-09, 8,-32 );
constant b : sfixed(8 downto -32):= to_sfixed( 4.00E-07, 8,-32 );
constant c : sfixed(8 downto -32):= to_sfixed( 0.0011, 8,-32 );
constant d : sfixed(8 downto -32):= to_sfixed( 2.403, 8,-32 );
constant e : sfixed(8 downto -32):= to_sfixed( 251.26, 8,-32 );
typereg_array is array (9 downto 0) of sfixed(8 downto -32);
signal pipeline_reg : reg_array;
begin
cvd : process(clk)
begin
ifrising_edge(clk)then
  store <= to_sfixed('0'&ip,store);
    power_a <= resize (arg => power_b * store * a,
           size_res => power_a);
  power_b <= resize (arg => power_c * store * b,
           size_res => power_b);  
  power_c <= resize (arg => store * store * c,
           size_res => power_c); 
  calc <= resize (arg => power_a - power_b + power_c + (store * d) - e,
          size_res => calc);
  pipeline_reg <= pipeline_reg(pipeline_reg'high -1 downto 0 ) & calc;       
 op <= to_slv(pipeline_reg(pipeline_reg'high)(8 downto 0));
  end if;
end process;
end Behavioral;

对于 109 Ω的电阻输入,温度应报告为 23.7°C。我们可以在下面的定点仿真中看到,结果符合预期,精度在可接受的范围内。

cd2f71bc-4bd3-11f0-b715-92fbcf53809c.png

使用浮点包实现相同的功能,以类似的方式实现

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.FLOAT_pkg.ALL; -- Use the floating-point package
entity FloatingPointPolynomial is
  Port (
    clk :inSTD_LOGIC;
    x :infloat32; -- Input x as a 32-bit floating-point number
    y : out float32 -- Output y as a 32-bit floating-point number  );
end FloatingPointPolynomial;
architecture Behavioral of FloatingPointPolynomial is
  -- Define constantsforthe polynomial coefficients
  constant a4 : float32 := TO_float(2.00E-09);
  constant a3 : float32 := TO_float(-4.00E-07);
  constant a2 : float32 := TO_float(0.011);
  constant a1 : float32 := TO_float(2.403);
  constant a0 : float32 := TO_float(-251.26);
  signal x2, x3, x4 : float32; -- Intermediate powers of x
  signal term4, term3, term2, term1 : float32; -- Polynomial terms
  signal res : float32;
 typereg_array is array (9 downto 0) of float32;
  signal pipeline_reg : reg_array;  
begin
  process(clk)
  begin
   ifrising_edge(clk)then
      -- Calculate powers of x
      x2 <= x * x;
            x3 <= x2 * x;
            x4 <= x3 * x;
            -- Calculate each term in the polynomial
            term4 <= a4 * x4;
            term3 <= a3 * x3;
            term2 <= a2 * x2;
            term1 <= a1 * x;
            -- Calculate final result
            res <= term4 + term3 + term2 + term1 + a0;
            pipeline_reg <= pipeline_reg(pipeline_reg'high -1 downto 0 ) & 
       res;
            y <= (pipeline_reg(pipeline_reg'high));
        end if;
    end process;
end Behavioral;

仿真再次显示了预期的结果,作为浮点结果,我们得到的结果也包括分数元素。

cd413b40-4bd3-11f0-b715-92fbcf53809c.png

因此,定点和浮点都能够实现定义的算法。

为了了解利用所需的资源,决定将这两种算数实现都以 K26 SoM 为目标进行综合。

运行综合将识别每个模块所需的资源。

正如预期的那样,定点实现所需的逻辑占用空间比浮点实现所需的小得多。

cd4cc0fa-4bd3-11f0-b715-92fbcf53809c.png

定点实现

cd588610-4bd3-11f0-b715-92fbcf53809c.png

浮点实现

我们不仅需要考虑逻辑占用空间,还需要考虑时序性能。考虑到这一点,将两个设计都设置为 200 MHz 运行,并从一开始就实现了基准时序收敛。

实现时序收敛比定点收敛更重要,这在浮点实现中是可以预料到的。不得不重新审视设计,并在几个关键阶段实现流水线,因为最初的代码只是为了确定占用空间的差异。

值得注意的是,Versal 系列中的 DSP58 支持浮点运算,但它不能直接从 float32 映射到 DSP。为了利用此功能,我们需要实例化配置为 FP32 操作的 DSP58,或者利用 Vivado IP 集成器提供的浮点 IP。

总结这篇博客,正如预期的那样,在使用 VHDL 中的浮点库时,逻辑占用空间存在很大差异。

建议在必要时利用定点,并在绝对必要时限制浮点。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 仿真
    +关注

    关注

    53

    文章

    4411

    浏览量

    137679
  • RTL
    RTL
    +关注

    关注

    1

    文章

    393

    浏览量

    62405
  • 运算符
    +关注

    关注

    0

    文章

    173

    浏览量

    11947

原文标题:FPGA定点和浮点数学运算-实例对比

文章出处:【微信号:FPGA研究院,微信公众号:FPGA研究院】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    定点数表示实数的方法以及定点数在硬件上的运算验证

    本篇主要介绍定点数表示实数的方法以及定点数在硬件上的运算验证 为什么选定点数 32位单精度浮点数: 32位的单精度
    发表于 10-28 08:13

    浮点数定点数

    本帖最后由 gk320830 于 2015-3-5 23:17 编辑 数制,浮点数定点数的文档,上数电时老师给的。有兴趣的同学可以来看看
    发表于 03-27 21:31

    【安富莱——DSP教程】第7章 DSP定点数浮点数(重要)

    第7章DSP定点数浮点数(重要) 本期教程主要跟大家讲解一下定点数浮点数的基础知识,了解这些基础知识对于后面学习ARM官方的DSP库大有裨益。特别是初学的一定要理解这些基础知识。
    发表于 06-03 11:47

    第7章 DSP定点数浮点数

    IEEE浮点数 7.3 定点数运算 7.4 总结7.1 定点数浮点数概念 如果小数点的位置事先已有约定,不再改变,此类数称为“
    发表于 09-22 13:02

    CPU执行一个需要浮点数运算的程序时有三种方式

    编者按:在计算领域,例如三角函数以及时域频域变换通常会用到浮点运算。当CPU执行一个需要浮点数运算的程序时,有三种方式可以执行:软件仿真器(浮点
    发表于 08-27 07:51

    定点数浮点数的区别是什么

    定点数浮点数的区别目的:理解定点数浮点数在傅里叶变换(FFT)的实际应用中的选择单片机中如果需要进行一定的运算(常见的傅里叶变换)时,需
    发表于 02-21 07:22

    如何在GCC中为具有FPU的Cortex M4启用硬件浮点数学运算呢?

    如何在GCC中为具有FPU的Cortex M4启用硬件浮点数学运算呢?
    发表于 08-26 14:43

    扩充浮点运算集是否需要自己在FPGA板子上设置一个定点数转为浮点数的部分?

    扩充浮点运算集的时候,是否需要自己在FPGA板子上设置一个定点数转为浮点数的部分?
    发表于 08-11 09:13

    单片机浮点数运算的源码设计

    单片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条指令的过程。本文详细介绍了浮点数在单片机中的表示方式和汇编子程序,浮点数定点数加减法要困难,但是克服了定点数表示范围小
    的头像 发表于 03-07 15:19 1.1w次阅读
    单片机<b class='flag-5'>浮点数</b><b class='flag-5'>运算</b>的源码设计

    FPGA浮点运算定标实现方法

    有些FPGA中是不能直接对浮点数进行操作的,只能采用定点数进行数值运算。对于FPGA而言,参与数学运算
    的头像 发表于 08-12 09:53 5442次阅读

    定点数浮点数在STM32单片机中使用傅里叶(FFT)变换的理解

    定点数浮点数的区别目的:理解定点数浮点数在傅里叶变换(FFT)的实际应用中的选择单片机中如果需要进行一定的运算(常见的傅里叶变换)时,需
    发表于 12-24 19:22 16次下载
    <b class='flag-5'>定点数</b>和<b class='flag-5'>浮点数</b>在STM32单片机中使用傅里叶(FFT)变换的理解

    如何在FPGA中正确处理浮点数运算

    使用插值算法实现图像缩放是数字图像处理算法中经常遇到的问题。我们经常会将某种尺寸的图像转换为其他尺寸的图像,如放大或者缩小图像。由于在缩放的过程中会遇到浮点数,如何在FPGA中正确的处理浮点数
    的头像 发表于 03-18 11:03 5871次阅读

    FPGA浮点数转化为定点数方法

    FPGA在常规运算时不能进行浮点运算,只能进行定点整型运算,在处理数据的小数乘加
    的头像 发表于 10-13 16:23 6097次阅读

    FPGA浮点数表示及计算机数值表示规则

    定点数硬件实现简单,但表示的范围有限,且部分的小数运算IP核只支持浮点数运算,因此这里还需要提到浮点数的相关内容。
    发表于 06-16 15:41 2035次阅读
    <b class='flag-5'>FPGA</b><b class='flag-5'>浮点数</b>表示及计算机数值表示规则

    定点数浮点数的概念 浮点数二进制序列与指数表达式之间的转化

    的缺点:由于小数点位置固定不变,定点数所表示的数的范围非常有限,不能同时表达特别大或特别小的数,所以才出现了浮点数,以此来扩充数的范围,同时浮点数也广泛应用于精度要求高的场合。简单的理解浮点数
    的头像 发表于 08-22 16:06 9749次阅读
    <b class='flag-5'>定点数</b>和<b class='flag-5'>浮点数</b>的概念 <b class='flag-5'>浮点数</b>二进制序列与指数表达式之间的转化