FPGA 定点小数计算

1. 使用FPGA实现定点小数计算

FPGA中不适合做浮点数运算,但有时又会涉及到小数的运算,这时就需要用到Q格式数据。

2. Q格式

Q:如果想要表示一个小数,但FPGA里没法加小数点,那该如何表示小数呢?

A:可以使用定点小数!

定点小数的小数点预设在固定的位置,因此不用加小数点就可以区分二进制数的整数部分和小数部分,Q格式就是所谓的定点小数表示方法。

通常我们用Qn来表示定点小数,n代表小数的个数,精度为2^(-n),如Q16,它有16位二进制来表示小数点后的数据,精度为 2^(-16) ;Q8,它有8位二进制来表示小数点后的数据,精度为 2^(-8)。

Q:如何将十进制小数 X 转换成二进制定点小数 X' ?(以Q8为例)

A:先把X就当成二进制数!先转换整数部分,数据格式是Q8,整数直接左移8位给小数留8位空间,也就是乘(2^8);再转换小数部分,数据格式是Q8,也是左移8位以保留小数的前8位,也就是乘 (2^8)。因此,整体转换方法就是直接乘 (2^8)!!!

3. 运算

Example 1: 3.14 + 3.14 = ? (16位Q8 = 1 + 7 + 8,1位符号位,7位整数位,8位小数位)

解:

  1. 数值转换 3.14 x (2^8) = 16'd804 = 16'b‭0000_0011_0010_0100‬
  2. 加法运算 3.14 + 3.14 = 16'b‭0000_0011_0010_0100‬ + 16'b‭0000_0011_0010_0100‬ = ‭16'b0000_0110_0100_0110‬ = 16'd1608
  3. 结果展示 16'd1608 / (2^8) = 6.28125 ; 3.14 + 3.14 = 6.28 ;结果相差0.00125,结果的小数前两位相同,与精度一致。

Example 2: 3.14 x 3.14 = ? (16位Q8 = 1 + 7 + 8,1位符号位,7位整数位,8位小数位)

解:

  1. 数值转换 3.14 x (2^8) = 16'd804 = 16'b‭0000_0011_0010_0100‬
  2. 乘法运算 3.14 x 3.14 = 16'b‭0000_0011_0010_0100‬ x 16'b‭0000_0011_0010_0100‬
    = ‭32'b‭0000_0000_0000_1001_1101_1101_0001_0000‬ = 32'd‭646416‬
  3. 结果展示 32'd‭646416‬ / (2^16) = 9.863525390625 ; 3.14 x 3.14 = 9.8596 ;结果相差0.003925390625‬,结果的小数前两位差0.01,与精度一致。

Ref 1:基于C语言的Q格式使用详解

相关推荐
XINVRY-FPGA3 小时前
EPM240T100I5N Altera FPGA MAX II CPLD
人工智能·嵌入式硬件·fpga开发·硬件工程·dsp开发·射频工程·fpga
mit6.8245 小时前
[openvela] Hello World :从零开始的完整实践与问题复盘
c++·嵌入式硬件
曙曙学编程8 小时前
stm32——GPIO
c语言·c++·stm32·单片机·嵌入式硬件
第二层皮-合肥9 小时前
FPGA实现ETH接口
单片机·嵌入式硬件·fpga开发
anghost1509 小时前
基于单片机的智能声控窗帘
单片机·嵌入式硬件·mongodb
璞致电子12 小时前
【PZ-ZU47DR-KFB】璞致FPGA ZYNQ UltraScalePlus RFSOC QSPI Flash 固化常见问题说明
嵌入式硬件·fpga开发·fpga·软件无线电·sdr
陌夏微秋13 小时前
FPGA硬件设计2 最小芯片系统-ZYNQ7020/7010
嵌入式硬件·fpga开发·硬件架构·硬件工程·信息与通信·智能硬件
猫猫的小茶馆13 小时前
【STM32】HAL库中的实现(五):ADC (模数转换)
stm32·单片机·嵌入式硬件·mcu·51单片机·智能硬件·pcb工艺
iY_n14 小时前
Linux网络基础
linux·网络·arm开发
紫阡星影15 小时前
【模块系列】STM32&W25Q64
stm32·单片机·嵌入式硬件