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格式使用详解

相关推荐
国科安芯2 小时前
断电也隔离、听得真:ASL3159S 单通道 SPDT 模拟开关的“断电保护 + 音频保真“账
单片机·嵌入式硬件·安全·商业航天·抗辐射
自小吃多2 小时前
【Verilog/FPGA】存储器(数组)
嵌入式硬件·fpga开发
szxinmai主板定制专家2 小时前
RK3588+FPGA异构架构|高速数据采集+边缘AI落地应用全解析
人工智能·嵌入式硬件·fpga开发·架构·zynq
jianqiang.xue2 小时前
【CStackGUI 实战】深色主题终端:app.dark 默认深色 + 顶层命名样式表 + 运行时切换
单片机·嵌入式·cstackgui·c语言gui·可视化拖拽
M78佐菲2 小时前
ARM学习笔记(11)
linux·arm开发·笔记·嵌入式硬件·学习
M78佐菲2 小时前
ARM学习笔记(10)
linux·arm开发·笔记·嵌入式硬件·学习
小程序设计2 小时前
基于STM32的智慧厨房多参数安全监测与预警系统设计
stm32·嵌入式硬件·安全
新晨单片机设计2 小时前
S008C-基于STM32单片机无线抢答器【Proteus仿真+Keil程序+原理图】
stm32·单片机·proteus·无线抢答器
小诗懂技术3 小时前
【裸机lcd】framebuffer的配置与小型图像库的移植
arm开发·单片机·嵌入式硬件·裸机
comyccccc4 小时前
3.3V稳压电源设计与PCB实现学习笔记
单片机·嵌入式硬件