1.Unsigned adders

这个比较简单,只需在A、B前面扩展一位0防止溢出,溢出的数填到第n位cout,n-1到0位就是sum。

2.Signed adders

一开始也搞不懂下图中为什么要扩展符号位,两个符号位了怎么加?   往下看↓

2.1 Analysis

在真正开始使用Verilog做signed加法运算前,我们先来看看实际上二进制singed加法是如何运算?

Normal Condition (没有Overflow)

(+6) + (-3) = (+3)

为了节省resource,我们故意使用4 bit的+6与3 bit的-3相加,若直接将两个signed值相加,答案为-7,很显然答案并不正确。

因为4 bit与3 bit相加,结果可能进位到5 bit,正确的作法是将4 bit的+6做signed extension到5 bit,且3 bit的-3也要做signed extension到5 bit后,然后才相加,若最后进位到6 bit,则不考虑6 bit的值。

在此补充一下何谓Singed Extension?简单的说,当以较多bit显示signed型态的值时,重复signed bit补齐。

就意义上来说,就是3 bit的signed值若要以5 bit表示时,必须补上signed bit才能在5 bit表示,所以101要变成11101。

Boundary Condition (正Overflow)

(+7) + (+3) = (+10)

为了节省resource,我们一样故意使用4 bit的+7与3 bit的+3相加,若直接将两个signed值相加,答案为-6,很显然答案并不正确。

根据上个例子的经验,+7与+3必须做signed extension才能相加,这样才能得到正确答案+10。

不过现在问题来了,+10必须动到5 bit才能显示,若输出的值域为4 bit,只能-8 ~ +7,+10很显然已经正overflow了‧

若只能以4 bit表示,因为是正的,MSB必须是0(SUM[3]=0),所以若MSB是1就表示由进位而来,也就是正overflow了(此例的SUM[3]为1,所以已经正overflow),再加上因为目前运算结果为5 bit,且是正,所以SUM[5]必须为0。

也就是说,若SUM[5]=0且SUM[4]=1时,为正overflow,所以01010对于4 bit来说,是正overflow。

Boundary Condition (负Overflow)

(-5) + (-4) = (-9)

同样为了节省resource,我们故意使用4 bit的-5与3 bit的-4相加,若直接将两个signed值相加,答案为-1,很显然的答案并不正确。

根据前面两个例子,-5与-4一样必须做signed extension才能相加,这样才能得到正确答案-9‧进位到6 bit的1要舍去,所以答案是10111‧

问题一样来了,-9必须动到5 bit才能显示,若输出的值域是4 bit,只能-8 ~ +7,-9很显然已经是负overflow了。

若只能以4 bit表示,因为是负的,MSB必须是1(SUM[3]=1),所以若MSB是0就表示由进位而来,也就是负overflow了(此例的SUM[3]为0,所以已经负overflow),再加上因为目前运算结果为5 bit,且是负,所以SUM[5]必须为1‧

也就是说,若SUM[5]为1且SUM[4]为0时,为负overflow,所以10111对于4 bit来说,是负overflow。

2.2 Summary

根据之前三个实际的例子,我们得到以下结论:

m bit + m bit =< (m+1) bit m bit + n bit =< (m+1) bit,其中n < m ul style='list-style:disc outside none;' > m bit与n bit都必须先做signed extension到(m+1) bit才能相加 若结果有到(m+2) bit则忽略之,实际的结果为(m+1) bit 若Sum[m+1] ^ Sum[m]为1,表示有overflow 若Sum[m+1]为0且Sum[m]为1,则为正overflow 若Sum[m+1]为1且Sum[m]为0,则为负overflow

[1]如何实现有符号无符号加减法,如何处理overflowhttp://www.eeskill.com/article/id/45756

【VHDL】深度讲解二进制无符号和有符号加法处理溢出的问题的更多相关文章

  1. webpack与browser-sync热更新原理深度讲解

    本文首发于CSDN网站,下面的版本又经过进一步的修订.原文:webpack与browser-sync热更新原理深度讲解本文包含如下内容: webpack-hot-middleware EventSou ...

  2. 【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】

    原文:[ c语言中无符号和有符号的加法运算][深入理解]--[sky原创]   第一题 #include<stdio.h> int main() { unsigned int a=6; i ...

  3. C机器级移位,编码表示 无符号编码表示,有符号编码表示一般最常见的方式是补码

    C机器级移位,编码表示 无符号编码表示,有符号编码表示一般最常见的方式是补码  w位补码所能表示的值范围是 首先我们得心知 补码的最高有效位是符号位,当符号位位1是表示的是负值,当符号位是0是,表示的 ...

  4. Google资深工程师深度讲解Go语言完整教程

    资源获取链接点击这里 欢迎大家来到深度讲解Go语言的课堂.本课程将从基本语法讲起,逐渐深入,帮助同学深度理解Go语言面向接口,函数式编程,错误处理,测试,并行计算等元素,并带领大家实现一个分布式爬虫的 ...

  5. 关于C语言中的强符号、弱符号、强引用和弱引用的一些陋见,欢迎指正

    首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引用.在看到3.5.5节弱符号和强符号时,我感觉有些困惑,所以写下此篇,希望能和同样 ...

  6. 浅谈C语言中的强符号、弱符号、强引用和弱引用

    摘自http://www.jb51.net/article/56924.htm 浅谈C语言中的强符号.弱符号.强引用和弱引用 投稿:hebedich 字体:[增加 减小] 类型:转载 时间:2014- ...

  7. 浅谈C语言中的强符号、弱符号、强引用和弱引用【转】

    转自:http://www.jb51.net/article/56924.htm 首先我表示很悲剧,在看<程序员的自我修养--链接.装载与库>之前我竟不知道C有强符号.弱符号.强引用和弱引 ...

  8. 程序员之---C语言细节20(符号和有符号之间转换、两数相加溢出后数值计算)

    主要内容:无符号和有符号之间转换.两数相加溢出后数值计算 #include <stdio.h> /* 这个函数存在潜在漏洞 */ float sum_elements(float a[], ...

  9. C语言中的强符号与弱符号

    转自:http://blog.csdn.net/astrotycoon/article/details/8008629 一.概述 在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初 ...

随机推荐

  1. 玲珑杯 ACM Round #12

    A =w= B 占坑 C 题意:有长度为n的序列A和长度为n的序列W,以及一个G,对于Ui,1<=Ui<=Wi,求Σgcd(Ai,Ui)=G的方案数,n<=1e3,Ai<=1e ...

  2. Tap into your Linux system with SystemTap

    https://major.io/2010/12/07/tap-into-your-linux-system-with-systemtap/ December 7, 2010 By Major Hay ...

  3. 设置默认訪问项目的client的浏览器版本号(IE版本号)

    在项目开发部署中.发现浏览器不兼容现象,在不处理兼容性情况下让用户更好体验(IE浏览器) 我们来设置client默认訪问项目的浏览器版本号 例如以下所看到的的是不同IE版本号下的效果截图比較: IE5 ...

  4. Android Message和obtainMessage的差别

    前几天须要实现一个以太网功能就看了以太网的源代码部分,看见了源代码部分在消息处理时,发现有一些不同的地方:   平时我在处理消息时:   1.首先创建Handler对象:   private Hand ...

  5. 创建SharePoint 2010 Timer Job

    好久没有写博客了. 近期在使用SharePoint 2010中Timer Job的功能,有了一点心得,分享一下. 我个人觉得SharePoint Timer Job和Windows Service或者 ...

  6. 架构师速成6.7-设计开发思路-uml

    uml是什么东西?统一建模语言.一门语言.是用来进行软件设计的一门语言. 事实上一门语言的诞生并不伟大,让大多数人都使用才足够伟大. uml就是一门伟大的语言.由于眼下软件设计的唯一语言就是它. UM ...

  7. iOS开发——代码生成TabBar与视图切换具体解释

    我在之前多篇博客中解说了在不使用storyboard而使用nib文件的情况下.使用代码生成导航栏并进行跳转,具体能够參考<iOS开发--界面跳转与返回及视图类型具体解释><iOS纯代 ...

  8. Linux C 网络编程——多线程的聊天室实现(server端)

    server端的主要功能: 实现多用户群体聊天功能(此程序最多设定为10人.可进行更改),每一个人所发送的消息其它用户均能够收到.用户能够任意的增加或退出(推出以字符串"bye"实 ...

  9. C#之out和ref区别

    out与ref的区别总结:1.两者都是通过引用来传递.2.两者都按地址传递的,使用后都将改变原来参数的数值.3.属性不是变量,因此不能作为 out或ref 参数传递.4.若要使用 ref 或 out, ...

  10. cocos2d-x-3.1 数据结构之Vector (coco2d-x 学习笔记六)

    介绍 cocos2d::Vector<T>是一个封装好的能动态增长顺序訪问的容器. cocos2d::Vector<T>中的元素是按序存取的,它的低层实现数据结构是标准模版库中 ...