如何实现有符号无符号加减法,如何处理overflow

来源:本站
导读:目前正在解读《如何实现有符号无符号加减法,如何处理overflow》的相关信息,《如何实现有符号无符号加减法,如何处理overflow》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《如何实现有符号无符号加减法,如何处理overflow》的详细说明。
简介:本文详尽介绍了利用verilog实现带进位加法和减法器的方法,和overflow的实现,适用性很广,特别是在处理器如MIPS的设计当中。

若要将原本用软件实现的算法用硬件电路实现,马上会遇到2个很基本的问题:一个是如何处理负数?另一个是如何处理overflow?虽然很基本,但一旦有问题却很难debug。

简介:

使用环境:NC-Verilog 5.4 + Debussy 5.4 v9

一般在开发算法阶段,我们会使用C/C++这些高级语言开发,C/C++处理负数乘加运算都很方便与直觉,也不用太担心overflow的问题,主要是int是4 byte(32 bit)够大,要overflow也不太容易,若一旦要用硬件电路实现,马上就面临2个基本的问题,硬件要怎么处理负数?要怎么处理overflow?

Verilog在宣告reg与wire时,虽然能使用+ – * /,并合成出相对的加法器、乘法器与除法器,但这些都是无号数(unsigned integer)运算,也就是说只能做大于或等于0的整数加减乘除运算,无法处理负数运算;除此之外,不像C/C++的int就是32 bit,为了节省硬件cost,我们会根据值域,小心的宣告reg与wire的bit数,如只有4 bit或8 bit而已,这样经过运算后,可能在某个boundary test pattern下,一不小心就overflow了。

本文将对此进行详尽的讨论,并将overflow议题一并考虑。

本文先讨论加法运算部分,乘法部分将另开专文讨论之‧

Verilog的运算

Verilog所提供的运算分unsigned与signed两种:

Unsigned:不含signed bit以4 bit来说,值域从0000~1111,也就是0 ~ 15Signed:含signed bit(MSB为signed bit,1为负,0为正,负数使用2补码表示)以4 bit来说,值域从1000~0111,也就是-8 ~ +7

二进制signed加法运算

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

Normal Condition (没有Overflow)

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

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

如何实现有符号无符号加减法,如何处理overflow

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

如何实现有符号无符号加减法,如何处理overflow

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

如何实现有符号无符号加减法,如何处理overflow

就意义上来说,就是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,很显然答案并不正确。

如何实现有符号无符号加减法,如何处理overflow

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

如何实现有符号无符号加减法,如何处理overflow

不过现在问题来了,+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,很显然的答案并不正确‧

如何实现有符号无符号加减法,如何处理overflow

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

如何实现有符号无符号加减法,如何处理overflow

问题一样来了,-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‧

二进制Signed加法运算Summary

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

m bit + m bit =< (m+1) bitm 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

具体的verilog实现见附件signed_add.7z。仿真波形如下。

如何实现有符号无符号加减法,如何处理overflow

本文详细讨论了在数字电路与Verilog中,如何执行带负数的加法,以及如何判断overflow等课题,虽然非常基本,但在使用硬件实现算法时却非常重要,下一次将讨论如何在数字电路与Verilog实现带负数的乘法‧

提醒:《如何实现有符号无符号加减法,如何处理overflow》最后刷新时间 2024-03-14 00:59:46,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《如何实现有符号无符号加减法,如何处理overflow》该内容的真实性请自行鉴别。