基于FPGA的数字信号处理(9)--定点数据的两种溢出处理模式:饱和(Saturate)和绕回(Wrap)

1、前言

在逻辑设计中,为了保证运算结果的正确性,常常需要对结果的位宽进行扩展。比如2个3bits的无符号数相加,只有将结果设定为4bits,才能保证结果一定是正确的。不然,某些情况如7+7 = 14(1110),如果结果只用3bits表示那么就成了110(6)了,这样运算的结果就是错的。同理,乘法操作需要扩展的位宽更大,是两个乘数的位宽之和,比如2个3bits的无符号数做乘法,结果需要设定为6bits。

如果在后续数据处理的过程中,一直都这样对结果的位宽进行扩展,那么在算法链很长的情况下,将会消耗大量的逻辑资源。因此在设计中,常常需要对数据进行的位宽进行处理。

数据的位宽处理分为两个部分:

  • 对整数的处理:例如原本用6bits表示的结果,下级模块规定只能用到4bits输入。因为6bits的表示范围大于4bits,就有可能出现4bits无法表示的情况(即溢出)
  • 对小数的处理:原理同上。四舍五入就是一种经典的对小数截位的方式,类似的方法还有ceili,floor,nearest等等。

本文只讨论整数部分的溢出截位处理,小数部分的处理下篇文章再说。对整数的截位处理,实际上就是对溢出的处理,其决定了当运算结果大于该数位宽所能表示的最大值时,如果对溢出部分处理。通常有两种对溢出的处理方式:

  • Saturate(饱和):一旦数据溢出,那么就将结果饱和处理为最大值或最小值(取决于正向溢出还是负向溢出)
  • Wrap(绕回/截断):一旦数据溢出,那么就直接将溢出的高位截断

将6bits的整数41截位到4bits,两种溢出模式的处理结果如下:

image-20240416110157962


2、Saturate

因为有符号数和无符号存在表示范围的区别,所以二者的溢出处理也存在一定的区别,接下来对两种情况分别进行讨论。

2.1、无符号数的Saturate

Saturate是当数据溢出时,就直接用最大值或最小值来表示。因为无符号数不能表示负数,因此不存在对于负数的饱和处理,只存在正向的饱和。例如要将1个6bits的数截断到4bits,因为4bits能表示的最大值是15,那么所有大于15的数,都直接用15来表示,示意图如下:

将1个6bits的输入Saturate为4bits的输出,用Verilog可以这么写:

module test(input		[5:0]	data_6bits,output  reg	[3:0]	data_4bits	
);always@(*)
beginif(data_6bits > 4'd15)			//溢出了data_4bits = 4'd15;			//饱和到最大值else				data_4bits = data_6bits;	//没溢出则直接赋值
endendmodule 

除了直接用大于符号(data_6bits > 4’d15)来判断是否溢出外,也可以这样判断:

if(|data_6bits[5:4]) //判断高2位是否存在1,若存在则该数的值必定大于15

再写个TB测试一下:因为输入比较少,所以可以用穷举法来测试,把输入从最小值0开始累加最大值63,观察输出是否会被Saturate

`timescale 1ns/1ns
module test_tb();reg		[5:0]	data_6bits;
wire	[3:0]	data_4bits;//例化被测试模块
test	test_inst(.data_6bits		(data_6bits),.data_4bits		(data_4bits)
);initial begindata_6bits = 0;while(~(&data_6bits))begin			//当输入不全为1,即非最大值data_6bits = data_6bits + 1;	//从0开始累加1#5;end#20 $stop();
endendmodule

仿真结果是这样的:

image-20240416121238935

当输入超过4bits位宽能表示的最大值15时,就会都饱和处理,即输出为最大值15。

2.2、有符号数Saturate

对于有符号数的Saturate处理有两种情况:

  • 正数太大无法表示,只能饱和到最大值。例如4bits有符号数最大只能表示 7,那么大于7的数就只能饱和处理为 7。
  • 负数太小无法表示,只能饱和到最小值。例如4bits有符号数最小只能表示 -8,那么小于-8的数就只能饱和处理为 -8。

当数据溢出时,就直接用最大值或最小值来表示。因为无符号数不能表示负数,因此不存在对于负数的饱和处理,只存在正向的饱和。例如要将1个6bits的数截断到4bits,因为4bits能表示的最大值是15,那么所有大于15的数,都直接用15来表示,示意图如下:

5

例如,将1个6bits的有符号数Saturate为4bits,对于数据的正向溢出判断和无符号数的Saturate是类似的,只要判断除了符号位的多出来的高位是否有1即可。

对于数据的负数方向溢出判断要麻烦一点,首先我们要知道,对于一个有符号的负数,在其高位扩展符号位,其数值是不会改变的。例如:

10\110\1110\11110,它们表示的都是 -2。

把6bits截位到4bits,只要判断它的高三位(因为讨论的是负数,所以最高位肯定是1)是否都为1就行了,如果是的话,说明高3位可是视为是1位符号位的扩展,数据的表示范围等价于4bits的表示范围。如果不为全1,则说明比4bits的表示范围要大,即数据产生了溢出。

综上,用Verilog可以这么写:

module test(input		[5:0]	data_6bits,output  reg	[3:0]	data_4bits	
);always@(*)
beginif(~data_6bits[5] && (|data_6bits[4:3]))			//判断条件(正数 && 溢出),即正向溢出了data_4bits = 4'b0111;							//饱和到最大值7else if(data_6bits[5] && ~(&data_6bits[4:3]))		//判断条件(负数 && 溢出),即负向溢出了			data_4bits = 4'b1000;							//饱和到最小值-8else	data_4bits = data_6bits;						//没溢出则直接赋值
endendmodule 

仍然用上面的TB,仿真结果如下:

image-20240416132626605


3、Wrap

Wrap从字面上理解是绕回,什么是绕回呢?比如一块手表,它只能表示0点~12点,超出了12点的话,它就会绕回到0点再重新开始。比如13点的表示就是到了12点后,再走到了1点。

对数据的Wrap处理也是类似的,比如4bits的无符号数最多只能表示1111(15),这个时候如果再加1就是16了,16是表示不了的。Saturate是直接表示最大值15,而Wrap则是重新回到开始表示0。类似的,17就Wrap到1,18就Wrap到2,19就Wrap到3,依此类推。示意图如下:

对于有符号数的Wrap处理也是一样的截掉高位,但是因为有符号数可以表示负数,所以它的绕回是从最小的负数开始的,例如最大的4bits有符号数是0111即7,溢出后是1000即-8,示意图如下:

Wrap处理用Verilog是很好实现的,因为它本质上相当于截掉高位,而截掉高位这个操作是可以被综合工具自动实现的,它甚至都不需要消耗任何逻辑资源。比如,将1个6bits的输入Wrap为4bits的输出,用Verilog可以这么写:

module test(input		[5:0]	data_6bits,output  	[3:0]	data_4bits	
);assign	data_4bits = data_6bits;		//直接赋值即可,工具会自动截位
//等价于下面的语句
//assign	data_4bits = data_6bits[3:0];endmodule 

用上面的TB测试就行,无符号数的测试结果如下:

image-20240416135556104

有符号数的测试结果如下:

image-20240416135211386

可以看到当输入大于4bits能表示的最大值后,就会回到最小值重新开始,相当于截掉了高位。


4、总结

  • Saturate相当于溢出时,将结果保留在最大值或最小值;而Wrap则是溢出时重新绕回到起点。
  • 相对来说Saturate损失的精度比较小,结果较为准确,但是消耗的硬件资源比Wrap方式要多;Wrap不需要消耗硬件资源,因为它实际上相当于截掉高位,等于是没有什么处理,精度损失大,结果不太准确(尤其是有符号数的Wrap),只适用于特定场合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/7177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SOLIDWORKS Electrical由3D布局生成2D机柜布局图

想要转换3D装配体到Electrical中需要在3D打开Electrical插件,并使用工程管理器打开需转换工程图的装配体 1、创建2D图纸 打开后在上方工具选项卡中选择-SOLIDWORKS Electrical选项卡-的创建2D图纸 2、选择图纸视角 使用创建2D图纸后就会进入工程图界面,在…

裁员为什么先裁技术人员?

最近这个问题比较火,我分享一个印象深刻的答案:楼盖完了,还需要搬砖的吗? 这个答案让我对互联网/程序员这个行业/职业有了新的认识。 房地产是在现实世界里盖房子,互联网是在虚拟世界里盖房子,只不过互联网…

第78天:WAF攻防-菜刀冰蝎哥斯拉流量通讯特征绕过检测反制感知

目录 案例一: 菜刀-流量&绕过&特征&检测 菜刀的流量特征 案例二:冰蝎-流量&绕过&特征&检测 冰蝎使用教程 冰蝎的流量特征 案例三: 哥斯拉-流量&绕过&特征&检测 哥斯拉使用教程 哥斯拉的流量特征…

调用第三方接口——支付宝付款

沙箱环境是支付宝开放平台为开发者提供的用于接口开发及主要功能联调的模拟环境。 参考 登录 - 支付宝 在沙箱环境下,已经分配好了用于模拟测试的应用信息、商家信息、买家信息等 小程序文档 - 支付宝文档中心 内网穿透(支付宝付款需要在公网进行检查…

PyTorch深度学习框架:从入门到实战

前言 学习 PyTorch 深度学习框架之前先学会深度学习和卷积神经网络 CNN ,这样学习起来会更香嗷。 Windows系统下PyTorch的环境配置 Anaconda是什么: Anaconda是一个开源的Python发行版本,专注于数据分析领域。它包含了conda、Python等190多…

为什么感觉没有效果

以前在辅导小儿作业的时候,我会在常用的搜索引擎里去寻找答案,一般情况下都能解决问题。 但是最近一段时间,我发现,搜索引擎搜出来的结果还没有利用短视频搜出来的答案更全面,短视频软件不仅可以显示AI整理出来的答案…

CTF(Web)中关于执行读取文件命令的相关知识与绕过技巧

在我遇到的题目中,想要读取文件必然是要执行cat /flag这个命令,但是题目当然不会这么轻松。让你直接cat出来,必然会有各种各样的滤过条件,你要做的就是尝试各种方法在cat /flag的基础上进行各种操作构建出最终的payload。 下面我…

【C++风云录】跨越星辰大海:六大库在宇宙物理学和天文学的实际应用

走近科学:理解和利用宇宙物理学与天文学的科研工具 前言 本文将探讨六个不同的库,分别是HEALPix,CCfits,CFITSIO,WCSLIB,AstroPy和ROOT,他们在宇宙物理学和天文学中的重要应用。我们将详细介绍…

【LeetCode 121】买卖股票的最佳时机

思路 思路: 所谓代码的复杂性来源于业务的复杂性,如果能够想清楚业务实现逻辑,就能够轻松写出代码; 假设当前是第i天,如何在第i天赚到最多的钱?需要在第i天之前以最低价买入股票; 所以需要求…

微博视频怎么下载无水印

在当今社交媒体时代,微博已经成为人们获取信息、分享生活的重要平台之一。许多人在浏览微博时常常遇到一个问题:如何下载微博视频而不留下烦人的水印呢?今天,我将分享一些神秘的方法,让你轻松解锁微博视频的无水印下载技巧。 第…

Python实现2048游戏

提供学习或者毕业设计使用,功能基本都有,不能和市场上正式游戏相提比论,请理性对待! 在这篇博客中,我们将使用 Python 和 Pygame 库来编写经典的 2048 游戏。2048 是一个益智类游戏,通过在 4x4 网格上滑动方块并合并它们来创建一个新的数字,直到获得数字 2048 或者无法继…

武汉星起航:跨境电商行业领航者,一站式孵化服务引领全球趋势

在全球化日益深入的今天,跨境电商作为连接各国市场的桥梁,其重要性日益凸显。在这一潮流中,武汉星起航电子商务有限公司以其前瞻性的战略眼光和丰富的运营经验,迅速崛起为跨境电商行业的领军者。公司不仅自营亚马逊跨境电商业务&a…

一对一WebRTC视频通话系列(四)——offer、answer、candidate信令实现

本篇博客主要讲解offer、answer、candidate信令实现,涵盖了媒体协商和网络协商相关实现。 本系列博客主要记录一对一WebRTC视频通话实现过程中的一些重点,代码全部进行了注释,便于理解WebRTC整体实现。 一对一WebRTC视频通话系列往期博客 一…

vue3引入element-plus完整步骤

在Vue 3项目中引入Element Plus的完整步骤如下: 安装Element Plus: 使用npm(或cnpm,如果你在中国并且希望使用淘宝的npm镜像)来安装Element Plus。在项目的根目录下,打开命令行工具并执行以下命令&#x…

Python深度学习:【模型系列】强化学习简介及优质学习资源

文章目录 1.强化学习概述基本组成主要算法类别应用领域2.优质在线学习资源1.强化学习概述 强化学习(Reinforcement Learning, RL)是机器学习的一个子领域,它涉及智能体(agent)通过与环境的交互来学习如何在给定的任务中最大化某种累积奖励。 强化学习不同于监督学习,它…

自动驾驶主流芯片及平台架构(二)特斯拉自动驾驶芯片平台介绍

早期 对外采购mobileye EyeQ3 芯片摄像头半集成方案,主要是为了满足快速量产需求,且受制于研发资金不足限制; 中期 采用高算力NVIDIA 芯片平台其他摄像头供应商的特斯拉内部集成方案,mobileye开发节奏无法紧跟特斯拉需求&#xff…

如何取消xhr / fetch / axios请求

如何取消xhr请求 setTimeout(() > { xhr.abort() }, 1000)如何取消fetch请求 fetch()请求发送以后,如果中途想要取消,需要使用AbortController对象。 let controller new AbortController(); let signal controller.signal;fetch(url, {signal:…

论生命价值

我们该如何定义一个人的生命价值,这是一个十分值得我们深思的问题,而谈论到生命的价值,我们先从非人的东西去谈论它的价值,从我们作为人的角度去思考价值,一个东西对我们有用,这个东西能够让我们的主观上的…

【简单介绍下Debian常用命令】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

基于51单片机的手动数字时钟设计

基于51单片机的手动数字时钟 (仿真+程序) 功能介绍 具体功能: 1.八位数码管显示时分秒,格式为XX-XX-XX; 2.六个按键控制时、分、秒的加减; 3.复位按键重新计时; ​演示视频&am…