FPGA中的小数计算(定点小数) 与 verilog/VHDL有符号数计算

FPGA里怎么做小数乘法 经常有同学问, fpga里小数乘法怎么搞? 如果你乐意, 按照IEEE754标准做"浮点"型运算的ip当然最好(虽然面积上不太好). 不过,很多情况下,没有这个必要. 一般我们就用"定点"了. 你得自己"定个点", 比如用16位, 分成8位整数8位小数(后面记为"(8.8)"), 即"定点"在第8位. 那么: 1 -> 16'h0100; 1.5 -> 16'h0180; 阅读详情
AI摘要

本文深入解析FPGA中定点小数运算原理,包括二进制小数表示、四则运算规则,以及Verilog与VHDL处理有符号数的技巧。通过实例演示如何将浮点数转换为定点数,以及不同情况下乘法和除法的具体实现。

这篇blog有两个关键点,如题,一是关于FPGA或者说HDL是如何执行定点小数运算的;二是verilog和VHDL有符号数运算的解释和对比。

1. 小数计算(定点小数)
1.1 用二进制表示小数

由于FPGA中存在的都是二进制数,所以首先明确一个知识点:如何用二进制表示小数?
这里写图片描述
如上图,一个带小数点的8位二进制所表示的数的大小就是:1*4+1*2+1*1+1*0.5+1*0.25+1*0.125+1*0.0625+1*0.03125 = 7.96875.实际上还有另外一种表示方式:0xff/2^5 = 7.96875.
由于我上面的8位数用5位表示小数,所以能表示的最小粒度即LSB就是0.03125,就是说只能表示0.03125的整数倍;从这里我们也可以看出,用来表示小数的位数越多,可以表示的小数范围越大,表示的越精准。
x表示实际的数(浮点数,如2.2), q表示它的n位定点小数。

q = (int) (x * 2^n)

x = (float)q/2^n

比如我想把2.2转换为有5为小数的8位二进制。则2.2*2^5 = 70.4,取整数即70=b’1000110. 那么整数70表示的实际小数是多少呢,70/2^5 = 2.1875,所以我其实是用2.1875来近似表示了2.2.

1.2 小数的加减乘除

执行运算的基本原则如下所示,其中x1, x2, x3代表三个浮点数,q1, q2, q3代表其二进制表示。

q3 = q1 + q2   若 x3 = x1 + x2

q3 = q1 - q2   若 x3 = x1 - x2

q3 = q1 * q2 / 2^n 若 x3 = x1 * x2

q3 = q1 * 2^n / q2 若 x3 = x1 / x2

加法和减法运算不做解释,对于乘法运算:
这里写图片描述
如上所示,两个16位数相乘,将得到一个32位数。可以看作是整数部分两个8位相乘得到一个16位整数;小数部分两个16位相乘得到一个16位小数。如果最后我们想要一个16位的结果,就只能选择中间的16位,将得到的32位数右移8位之后,高位截断8位,就可以得到我们要的16位结果。这就是上面 “/2^n”的来源。
除法比较复杂,不在此解释。

2. FPGA有符号数运算

在FPGA中,有符号数的运算规则是不需要自己来写的,比如对于负数还要考虑反码啊啥的,这些都是不用考虑的,无论是Verilog还是VHDL都给我们提供了相应的解决方案。

2.1 Verilog有符号数运算

对于Verilog,这里我直接翻译一位大神的博客。原网址见:http://billauer.co.il/blog/2012/10/signed-arithmetics-verilog/

黄金法则:两个操作数必须都是有符号数,结果才是有符号数!

Verilog倾向于使用无符号数,比如以下几种计算的结果都会是无符号数:

  • 任何有两个操作数的计算。除非这两个都是有符号数
  • 基本的数字的运算(如12’d10),除非显示指定了“s”
  • 位选操作
  • Part-select results
  • 级联操作 Concatenations

所以,要进行有符号数运算,要么使用$signed系统函数,要么在定义wire或者reg类型变量时加上signed。
例如要把一个有符号数和一个无符号数相乘,得到一个有符号数,要这样做:

reg         [15:0] a; // Unsigned
reg signed  [15:0] b;
wire signed [16:0] signed_a;
wire signed [31:0] a_mult_b;

assign signed_a = a; // Convert to signed
assign a_mult_b = signed_a * b

注意,signed_a要比a位宽多一位,这一位用来放置符号位0. 也许你会觉得需要显式指定signed_a的最高位,比如{1’b0, a}而不仅仅是直接赋值为a,但其实是不用的。

关于更多更详细的verilog有符号数计算,我上传一份名为“Signed Arithmetic in Verilog 2001 – Opportunities and Hazards” 的文档,请在我的资源中下载。

2.2 VHDL有符号数运算

关于VHDL有符号数的计算,跟VHDL的signed和unsigned两种数据类型息息相关,请移步我的另一篇blogVHDL中数据类型转换与移位(STD_LOGIC_ARITH与NUMERIC_STD) 中查看详解。

参考链接
  1. verilog数值计算-有符号数和无符号数 https://blog.youkuaiyun.com/mdpsdhr/article/details/61922126
  2. FPGA内部计算小数 http://www.cnblogs.com/woshitianma/archive/2013/05/19/3087258.html
  3. FPGA浮点小数与定点小数的换算及应用 https://blog.youkuaiyun.com/github_33678609/article/details/53465626
FPGA 的 DSP:Verilog 中的简单 FIR 滤波器 本项目介绍如何用 Verilog 实现一个带有预生成系数的简单 FIR 滤波器。 阅读详情

相关推荐

FPGA学习路线与PID控制器实战:从Verilog到竞赛项目全解析

数字电路与硬件描述语言是嵌入式系统与数字信号处理的基础。其核心原理在于通过逻辑门与寄存器构建可编程硬件电路,实现并行处理与低延迟控制。这一技术价值在于能够将算法直接映射为硬件电路,在实时控制、信号处理、通信协议加速等场景中发挥关键作用。例如,在工业控制领域,基于FPGA的PID控制器能够实现微秒级响应,远超传统处理器。本文以FPGA竞赛和秋招项目为背景,系统梳理了从Verilog语法、仿真验证到状态机设计的学习路径,并深入剖析了PID控制器的定点化实现与硬件调试全流程,为读者构建从入门到进阶的完整知识体系。

weixin_34174105的博客 373

FPGA中数的表示方法

转自FPGA之家 1. 概述 基于FPGA实现各种设计的首要前提是理解并掌握数字的表示方法,计算机中的数字表示方法有两种:定点数表示法和浮点数表示方法。其中,对于浮点数尽管当前应用最为广泛的是基于IEEE 754所设计的浮点数表示方法,Xilinx(忘记Altera中是否有对应的IP核)的IP核中也提供了相应的设计方法,但其表示方法缺乏FPGA设计应有的灵活性,而且资源消耗相对严重,因此可以...

芒果爱火锅的博客 2934

FPGA乘法器IP核配置与VHDL封装实践指南

在数字电路与FPGA设计中,乘法运算是数字信号处理、图像算法等领域的核心操作。其硬件实现原理通常基于移位相加或专用DSP单元,直接影响系统性能与资源占用。通过可配置的IP核,工程师能够精确控制乘法器的位宽、流水线级数和实现方式(如DSP48硬核),从而在速度、面积和功耗间取得最佳平衡。这种模块化方法尤其适用于高性能计算、通信基带等对时序和吞吐率要求严苛的应用场景。本文以Xilinx Vivado平台为例,深入解析乘法器IP核的配置选项、VHDL封装技巧以及定点数处理等工程实践,帮助开发者掌握这一关键IP核的

weixin_34034670的博客 289

FPGA中的小数运算

最近在图像算法的中间遇到一下小数的运算问题,虽然之前也遇到很多次,但是这次记录下来。 R=1.164(Y-16) +1.596(Cr-128) G=1.164(Y-16) -0.391(Cb-128) -0.813(Cr-128) B=1.164(Y-16) +2.018(Cb-128) 遇到的一些问题是,色彩空间的转换问题...

qq_36026488的博客 4917

FPGA中正负数和定点小数的表示方法

在日常生活中,我们常常需要到正数与负数,比如南北两级气温常年为零度以下,这个时候我们就需要负数来表示温度。那么在FPGA工程里面也是这样,我们如果想要做温度监测工程,自然而然的就会需要到负数来表达零下的温度。当然FPGA中除了数字正负的表达,还需要用到小数。在加减乘除的运算中,小数的出现是不可避免的。作为FPGA工程师,我们无法保证所有设计都不出现负数或者小数的情况,不能避免我们就克服,今天就为大家分享一下FPGA中负数与小数的表达。 一、负数的表达 关于负数,大家都知道在任何正数前加上负号便成了负数,比如

吉大秦少游 7806

Verilog中处理小数运算的简单方法

总结起来,通过使用定点数表示法和简单的加法运算,我们可以在Verilog中处理小数运算。但是这种简单的处理方法可以帮助初学者开始处理基本的小数运算,并为进一步的学习提供了一个良好的基础。上述代码定义了一个名为FloatAdder的模块,该模块接受两个8位宽的定点数a和b,并输出它们的和sum。在测试代码中,我们通过reg类型的变量a和b来设置输入的定点数,通过wire类型的变量sum接收计算结果。本文将介绍一种简单的办法,在Verilog语言中实现小数的运算,并提供相应的源代码。

2301_78484069的博客 4476

FPGA入门到实战:Verilog与Vivado开发全流程避坑指南

数字逻辑设计是硬件工程师的核心能力之一,而FPGA作为可重构芯片,正广泛用于通信、图像处理与高速接口领域。掌握硬件描述语言与EDA工具链,是迈入这一领域的关键。Verilog以其简洁语法和庞大生态成为主流入门语言,配合Vivado工具,能够完成从RTL设计、仿真到时序约束、上板调试的完整闭环。本文围绕小梅哥Artix-7开发板,梳理了环境搭建、基础语法、UART/I2C/SPI/DDR3等外设实战,以及常见报错和时序违例的排查思路,帮助初学者快速建立硬件思维并规避典型陷阱。无论你是刚接触数字电路的新手,还是

weixin_34101784的博客 603

锁相环技术原理及FPGA实现(第二章2.2)

假设数据位较大的位数为 N,则加法运算结果需要用 N+1 位才能保证运算结果不溢出,也就是说两个长度为 N(另一个数据位长度也可以小于 N)的二进制数进行加法运算,运算结果的有效数据位长度为 N+1。众所周知,在 FPGA 数字运算中,每个数据位需要相应的寄存器来存储,参与运算处理的数据位越多,所占用的硬件资源也越多。与加法运算一样,我们同样考查乘数均是补码表示形式(有符号数)的情况,这也是FPGA 进行数字信号处理最常用的数据表示方式,在讨论清楚补码的相关情况后,读者很容易得出无符号数的运算规律。

qq_43416206的博客 1153

FPGA FIR数字滤波器设计:Q15定点量化、Verilog实现与上板验证

数字滤波器是采样系统中对信号频带进行选择与整形的基础模块,FIR因其线性相位和稳定结构被广泛用于音频、通信与测量。其原理是把差分方程映射为延迟、乘法与累加,在FPGA上则以固定位宽、DSP资源和时序路径实现;Q15定点量化与累加位宽预算决定精度和动态范围,转置型结构通过流水线改善关键路径。工程价值在于把算法指标转成可综合规格,减少仿真对拍和上板调试的反复。应用场景涵盖语音降噪、信道整形、采样率变换等。围绕FPGA FIR数字滤波器的Verilog实现,从系数生成、量化、结构选择到ModelSim/Vivad

weixin_30872577的博客 151

FPGA定点与浮点运算设计实战详解

业界广泛采用Qm.n记法来描述定点格式:Qm.n:表示有符号数,共 $ m+n $ 位,其中 $ m $ 位整数(含符号),$ n $ 位小数。默认使用补码表示法。其数学本质是一个缩放后的整数:$$$$其中 $ X_{int} $ 是把二进制当作整数读取的结果。🌰 示例:- 二进制→ 十六进制 0x2800 → $ X_{int} = 10240 $- Q4.12 下真实值:$ x = 10240 / 4096 = 2.5 $

weixin_36474001的博客 1370

构建FPGA简易计算器:原理与实践

一个简易计算器通常需要实现加、减、乘、除四种基本的算术运算。在详细设计之前,我们首先需要确定这些基本运算的范围和精度要求。例如,我们可以决定计算器支持的最大数字位数(如8位、16位等),以及是否需要支持小数点运算。此外,还应考虑到异常情况的处理,比如除数为零的情况。在这一阶段,我们同样需要考虑计算器是否需要支持更复杂的数学运算,如幂运算、开方、三角函数等。根据需求的不同,我们可能需要扩展基本运算模块或引入专门的数学库。

weixin_42465140的博客 878

FPGA实战:手写Verilog实现CORDIC算法计算三角函数

在FPGA开发中,计算三角函数通常依赖IP核或查找表,但查找表在精度与资源间存在矛盾。CORDIC算法通过移位和加减迭代逼近目标角度,无需乘法器,资源消耗随精度线性增长,适合高精度场景。其原理是将旋转分解为一系列固定小角度,利用坐标旋转数字计算实现sin/cos求解。在数字信号处理、通信调制和DDS信号生成中,CORDIC能高效完成相位到幅度的转换。本文以EGo1开发板为例,详细讲解CORDIC迭代公式推导、Verilog流水线实现及上板验证,帮助读者掌握纯RTL实现三角函数计算的核心技术。

weixin_34392435的博客 290

FPGA矩阵求逆Verilog实现:列主元高斯消去与定点数实战

线性代数运算是数字信号处理与图像加速中的常见需求,矩阵求逆更是硬件实现中难度较高的环节。它直接制约着几何校正、MIMO检测、自适应滤波等数据通路的实时性。列主元高斯消去法通过逐列选取最大主元来保证数值稳定,配合定点数运算可避免浮点IP核带来的资源开销,在中等规模FPGA上实现4阶实矩阵求逆。该方法依赖关系清晰,天然适合状态机与流水线设计,DSP48占用少且方便仿真调试。实际工程中需要关注Q格式选择、主元近零、定点溢出与流水线对齐等问题。从Verilog RTL到ModelSim验证,配合MATLAB/Pyt

weixin_34216614的博客 158

基于VHDL的FPGA报警系统设计:从模块化到状态机实战

数字系统设计是嵌入式开发与硬件描述语言应用的核心领域,其原理在于通过逻辑电路实现感知、决策与执行的自动化闭环。在工程实践中,模块化设计与状态机控制是构建可靠系统的关键技术,能够有效提升代码复用率与系统可维护性。VHDL作为一种强类型硬件描述语言,以其严谨的语法和严格类型检查,尤其适用于对可靠性要求极高的复杂系统开发。本文以FPGA报警系统为例,深入剖析了传感器数据采集、按键消抖处理、数码管动态扫描等关键模块的实现,并重点探讨了状态机设计规范与跨时钟域处理等工程实践要点,为初学者和工程师提供了一个完整的VHD

weixin_30530339的博客 379

FPGA分频器设计与实验实战详解

整数分频是最常见的分频形式,指分频系数 $ N \in \mathbb{Z}^+ $,即输出频率是输入频率的整数倍除法结果。例如,若 $ f_{in} = 50\,\text{MHz} $,要求 $ f_{out} = 1\,\text{MHz} $,则 $ N = 50 $,属于典型的整数分频。此类分频易于在FPGA中通过计数器实现:使用一个模 $ N $ 计数器,在每个第 $ N $ 个上升沿触发输出翻转,从而产生稳定的低频方波。由于逻辑简单、资源消耗少且时序可控,广泛应用于大多数通用场合。

weixin_30700095的博客 1196

FPGA定点CNN实现手写数字识别与实时视频处理

在边缘计算和嵌入式视觉场景中,基于FPGA的硬件加速正成为实时AI推理的重要方案。硬件实现深度学习模型时,浮点运算逻辑资源消耗大、时序难以收敛,定点量化成为降低计算复杂度的核心技术。通过对称8位定点量化与网络裁剪,可以在不显著牺牲精度的前提下,将CNN映射到FPGA的可综合电路。结合行缓冲、流水线与DSP48资源复用,能够高效处理视频流中的目标识别任务。本文以手写数字识别为切入点,完整讲解定点CNN的架构设计、Verilog实现以及实时视频通路的接入方法,为工程师提供FPGA视觉落地的工程参考。

weixin_31858171的博客 219

基于Hu矩的FPGA手势识别平台设计:从定点化到流水线实现

在FPGA图像处理中,形状特征提取常因软件逐像素循环导致帧率瓶颈。Hu矩作为平移、旋转、缩放不变的形状描述子,通过几何矩、中心矩和归一化中心矩的数学链条,为手势识别提供稳定特征。其技术价值在于将特征计算硬件化,利用流水线跟随像素时钟,显著提升实时性。典型应用场景包括手势识别、目标分类等嵌入式视觉系统。针对FPGA项目实战,需重点解决定点位宽选型、流水线级数设计及除法器资源优化,确保在资源受限下实现高精度特征提取。

weixin_29164497的博客 294

Android音频子系统分析-car_audio_configuration.xml

先附上一个例子,再逐一解释。概括来说,该文件描述了车里有哪些区域,每个区域划分了多少组,每个组包含了哪些设备,每个设备接收哪些类型的音频流。

不定时记录分享一些有用没用的东西 989
上一篇: Vivado IP的两种综合方式:Global 和 Out-Of-Context
下一篇: 写在前面
隋边边
博客等级 码龄11年 304粉丝 91原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值