精华内容
下载资源
问答
  • 代表除法的符号
    千次阅读
    2021-07-26 07:46:39

    在用excel表格汇总的过程当中,我们经常会使用到除法这样一种运算,那么excel除法函数是什么呢?在excel当中除法是用什么代表的呢?接下来我们就一起来好好的了解一下吧。

    excel除法函数——excel除法表示

    在EXCEL电子表格中没有专门的除法函数,在进行除法运算时除号是用“/”符号来表示的,这是在英文输入法状态下(即半角的)输入的斜杆符号。

    注意,在使用除号的时候一定要在英文状态下输入,否则得到的结果可能会出现问题。

    1b17251a0df0aa65c9a8ea0c7774a488.png

    Excel中的四则运算

    以A1至A5单元格区域及B6单元格为例,A1至A5分别为1,2,3,4,5,B6为6

    加法

    =SUM(A1:A5,B6)

    =A1+A2+A3+A4+A5+B6

    A1至A5及B6相加值为21

    减法

    =SUM(A1:A5)-B6

    =A1+A2+A3+A4+A5-B6

    A1至A5相加减去B6值为9

    乘法

    =PRODUCT(A1:A5,B6)

    =A1*A2*A3*A4*A5*B6

    A1至A5及B6相乘值为720

    除法

    =PRODUCT(A1:A5)/B6

    =A1*A2*A3*A4*A5/B6

    A1至A5相乘除去B6值为20

    输入公式的单元格不能是在公式中已被引用的单元格,以免形成循环计算。

    以上就是有关excel除法函数的所有内容,从这里我们可以看出,虽然excel没有具体的除法函数,但是除法的符号也能让我们的计算变得简单,在使用excel计算除法时就没必要纠结除法函数是什么的问题了。如果你还想了解更多的内容,欢迎关注我们

    推荐阅读

    excel减法函数 excel减法函数如何表示 | 文军营销excel减法函数 excel减法函数如何表示 在excel图表当中计算时减法运算是经常使用到的一个功能,那么在excel当中减法函数是如何表示的呢?接下来小编就来说一说一个赛尔减法函数如何表示的方法以及具体的案例。excel乘法怎么用 excel乘法的常见使用方法 | 文军营销excel乘法怎么用?在excel当中,统计数据时经常会使用到乘法运算,那么乘法运算是用函数表示还是可以直接表示呢?接下来我们就一起来了解一下excel乘法运算是如何操作的吧。 excel乘法怎么用——excle里乘法怎么操作 ...Excel中的公式运算符 excel公式中的运算符 | 文军营销Excel中的公式运算符 excel公式中的运算符,听说excel的教程在抖音很火,很多白领小朋友都在争相学习,下面就跟小编一起学习一下excel公式中的运算符的新技能吧,Excel中的公式运算符 excel公式中的运算符就可以完成这一项工作,你是不是...excel乘法函数excel乘法函数公式的运用 | 文军营销在使用excel时,我们经常需要用到的就是excel的计算公式,在excel众多的函数公式当中我们经常使用到的就是他的乘法函数,excel的乘法函数公式是什么?...excel计算公式 excel计算公式大全 | 文军营销excel函数非常的多,自然计算公式也就不少了,那么Excel当中最常见的计算公式有哪些呢?今天小编就来说一说excel计算公式大全,让大家对excel计算公式有一个更加系统的了解。 excel计算公式——excel计算公式大全 ...

    更多相关内容
  • python中的除法

    千次阅读 2020-11-29 21:22:52
    实际应用中,精确除法比截断除法更频繁,所以有的书上,精确除法也叫普通除法(也就是常用除法) 也有人把精确除法叫浮点除法,截断除法叫整除,具体怎么叫不重要,重在理解。 5 怎么让python默认执行精确除法__...

    o55g08d9dv.jpg广告关闭

    腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元!

    sr60533h62.png

    截断表示截断小数分,取整数部分的意思。 实际应用中,精确除法比截断除法更频繁,所以有的书上,精确除法也叫普通除法(也就是常用除法) 也有人把精确除法叫浮点除法,截断除法叫整除,具体怎么叫不重要,重在理解。 5 怎么让python默认执行精确除法__future__表示未来新特性,import导入的意思6 在精确除法模式下...

    它有一个十进制,如下所示: 2.0 但我想让它给我 2 我能做到吗?...

    在python3 vs python2.6中,我注意到我可以分两个整数并获得一个浮点数。 你如何获得python2.6的行为? 有没有不同的方法来获取int int = int?...

    不管是啥语言都离不开加减乘除这些算法,但是在python里面你知道这些符号代表什么运算吗? “”这个是除法运算,那么这个“”呢? “*”这个是乘法运算,那么这个“**”呢? 下面来一一介绍下。 “”运算 除法运算符是“”,这个人人皆知道,但是这个二元运算符“”求出来的结果都是取决于操作数本身的,比如:python...

    就算是计算3**10000,3**1000000,python也不会报错,不过3的100万次方,显然需要花上一段时间来计算。 这和其它编程语言有所区别,例如java中计算math.pow(3,10000)将返回infinity,表示无穷大。 又是几个注意事项:python中的除法运算得到的结果总是浮点数(例如93=3.0),后面还有一种地板除法(floor)不一样...

    str我爱北京天安门除法运算python中的除法较其它语言显得非常高端,有套很复杂的规则。 python中的除法有两个运算符,和首先来说除法:在python 2.x中除法就跟我们熟悉的大多数语言,比如java啊c啊差不多,整数相除的结果是一个整数,把小数部分完全忽略掉,浮点数除法会保留小数点的部分得到一个浮点数的结果。 在...

    vvok2q6br7.jpeg

    现在, 在 python 3,我们最终有了 unicode (utf-8) 字符串,以及一个字节类:byte 和 bytearrays。 除法运算敲黑板,这里非常重要! python中的除法较其它语言显得非常高端,有套很复杂的规则。 python中的除法有两个运算符,和首先来说除法:在python2.x中除法就跟我们熟悉的大多数语言,比如java啊c啊差不多,整数...

    “”是从python2.2开始,除法运算符除了“”之外,又引入了一个除法运算符,这一种运算符只用于进行整除法,20 3620 3. 06.020. 0 36. 020.0 3.06. 020 3. ...“**”运算这个“**”比较简单,就是标题中的python的幂运算了 2 ** 012 ** 122 ** 1010242 ** 201048576第一操作数为底数,第二个操作数则为指数...

    例如,标准的除法符号‘’: >>> 4 1000 但是,我想要它返回0.04。 我用什么?...

    中的除法较其它语言显得非常高端,有套很复杂的规则。 python 中的除法有两个运算符, 和 首先来说下 除法:在 python 2.x 中 除法就跟我们熟悉的大多数语言,比如 java、c 差不多,整数相除的结果是一个整数,把小数部分完全忽略掉,浮点数除法会保留小数点的部分得到一个浮点数的结果。 在 python3.x 中 除法不再...

    由于 python3.x 源码文件默认使用utf-8编码,这就使得以下代码是合法的:py 2.x>>> str=王延领那小子真帅>>>strxe6x88x91xe7x88xb1xe5x8cx97xe4xbaxacxe5xa4xa9xe5xaex89xe9x97xa8py 3.x>>>str=王延领那小子真帅>>> str王延领那小子真帅>>> 3. 除法运算python中的除法有两个运算符,和首先来说除法:在python 2.x中...

    在py应用中有许多拿结果中的多个整数进行运算,难免少不了除法(如单位换算等),但是整数进行运算后只会返回整数,一般结果基本需要精确到后两位,此时就可以使用以下两种方法进行解决: 1. 将参与运算的任意一个整数显式的转换成float类型进行如下:defconvert_unit(num_size):returnround((float(num_size)1048576),2) ...

    rj3z9pex72.jpeg

    str我爱北京天安门----除法运算python中的除法较其它语言显得非常高端,有套很复杂的规则。 python中的除法有两个运算符,和首先来说除法:在python 2.x中除法就跟我们熟悉的大多数语言,比如java啊c啊差不多,整数相除的结果是一个整数,把小数部分完全忽略掉,浮点数除法会保留小数点的部分得到一个浮点数的结果。 ...

    常量常量就是不变的变量,在python中,通常用大写的变量名表示常量,这一点和java想相同:ali_address=ali_address=www.alibaba.com4.除法python中和除法...1.数据类型1.1整数python可以处理任意大小的整数,包括负整数。 java中的整数是有范围限制的,比如int的范围限制在-2147483648-2147483647之间...

    概述在python3中,数学运算中的除法被分为两种,分别是“真除法”,即无论任何类型相除的结果都会保留小数点,和我们实际的数学运算结果一致,而“截断除法”,则是无论任何类型相除的结果都会省略结果的小数部分,剩下最小的能整除的整数部分。 以下是两种除法的基本形式:# 真除法x y# 截断除法x y真除法x = 8y = 2...

    第一个示例中的每一方都将评估为int,这意味着最终答案将转换为int。 由于0.111小于0.5,因此它变为0. 它在我看来并不透明,但我想这就是它的样子。 为什么是这样?...

    python中%: 1. 求模运算,相当于mod,也就是计算除法的余数,比如5%2就得到1。 2. %还用在python的格式化输出,比如: a = test print it is a %s %(a) 打印的结果就是 it is a test 原文:https:blog.csdn.netliuyhooarticledetails80885254 承接matlab、python和c++的编程,机器学习、计算机视觉的理论实现及辅导...

    起因在用python2解释器运行python3代码的时候,出现了bug。 debug后发现是因为python3中的 原本表示 精确除法,却被python2解释器解释成了 地板除,最终导致了错误。 因此我上网查阅了相关资料,并总结如下表:总结 version py2 整数除法时为地板除,浮点数除法时为精确除 地板除 py3 精确除法 地板除 testx = y = 10...

    分别调用+=和=+:? 可以看到,都是新的值。 如果修改一下方法的实现:? 再测试就会发下,两个运算返回的都是同一个对象。 水落石出,python对两个不同的运算符使用了不同的实现方法。 一探究竟那为什么python会在 +=操作时,直接修改原对象。 而=+操作却要返回新的对象呢? 简单推测一下,可能python的作者认为,+=...

    具体思路是:开辟一个空栈,遇到数字压栈,遇到运算符弹出栈中的两个数进行运算,并将运算结果压栈,最后栈中只剩下一个数时,就是所求结果。 这里需要注意的一点是python中的’’除法和c语言不太一样。 在python中,(-1)2=-1,而在c语言中,(-1)2=0。 也就是c语言中,除法是向零取整,即舍弃小数点后的数。 而在...

    展开全文
  • 不管是啥语言都离不开加减乘除这些算法,但是在Python里面你知道这些符号代表什么运算吗? “/”这个是除法运算,那么这个“//”呢?“*”这个是乘法运算,那么这个“**”呢?下面来一一介绍下。 “//”运算 除法...
  • 我们其实可以采取双符号位,最高位代表正在符号位,但是我们可以看到,如果采取双符号位的话,由于是绝对值参与的运算,最高符号位一定是0,所以就没有必要,如果我们硬要采取双符号位也未尝不可,只是我们选择算术...

    1.原码一位乘

    原码一位乘部分积采取一位符号位,逻辑左移

    在这里插入图片描述
    我们其实可以采取双符号位,最高位代表正在符号位,但是我们可以看到,如果采取双符号位的话,由于是绝对值参与的运算,最高符号位一定是0,所以就没有必要,如果我们硬要采取双符号位也未尝不可,只是我们选择算术右移。最高位代表真正符号位,次高位参与移位。我们还要了解到

    有多位符号位时,最高位代表正真符号位,不参与算术移位,其余符号位参与算术移位

    2.原码两位乘

    原码两位乘部分积采用三位符号位,算术移位

    在这里插入图片描述

    博主其实不是很理解为啥非要采用三位符号,两位符号位加不就OK了吗,今天终于给老子看懂了,真是不得不佩服膜拜前辈们的聪明才智(估计以后会让我五体投地)

    按照原码一位乘的想法,其实两位符号位正好可以满足部分积相加,再配合逻辑移位。但是这中间有错误,当我们加上负x的补码,这时候就会出现小于0的情况,但是逻辑移位后的值是一个大于0的结果,很明显和结果不符合,所以才有三位符号位,加算术右移就很好的解决了这个问题

    3.补码一位乘与补码两位乘

    补码一位乘部分积符号位采用双符号位,算术右移
    补码两位乘采用三位符号位,算术右移

    一位和两位乘原理差不多,这里就只介绍补码一位乘

    在这里插入图片描述

    其实理由很简单如果部分积采用单符号位,那么采用逻辑右移会和出现和原码两位乘同样的结果,所以采用双符号位算术右移

    4.原码除法

    原码除法余数与商符号位取一位,逻辑左移

    在这里插入图片描述

    此处由于是左移,我们知道补码的左移和原码一样,所以即使出现余数为负数的情况也不会出现错误。当然我们也可以取双符号位,算术左移

    5.补码除法

    补码除法符号位自然形成,余数与商符号位取一位,逻辑左移

    在这里插入图片描述

    展开全文
  • 基于FPGA的除法器设计

    千次阅读 2019-07-15 16:50:52
    所以有必要来设计一款除法器,使其不占用那么多逻辑资源,并且所用时钟数能够满足约束要求。(减弱空间复杂度、增加时间复杂度,并且满足时间约束)。 计算机内部乘除法原理 众所周知,计算机所能完成的基本元操作...

    用FPGA写代码时候,尽量不用“/”,因为其占用大量逻辑资源。所以有必要来设计一款除法器,使其不占用那么多逻辑资源,并且所用时钟数能够满足约束要求。(减弱空间复杂度、增加时间复杂度,并且满足时间约束)。

    计算机内部乘除法原理

    众所周知,计算机所能完成的基本元操作是:+(-),左移,右移等指令。

    乘法实现

    计算机中用二进制进行计数,例如8(D) = 1000(B)。任何一个数均可以表示为下式:
    在这里插入图片描述
    所以数a乘以X,就变成了下式子:
    在这里插入图片描述
    此即计算机乘法原理对计算机而言,
    左移1位代表乘以2,
    右移1位代表除以2。
    所以,对于a乘以x而言,只是将a左移x为1的位并累加即可。

    举例说明:5*3=5 *(2+1)
    1. 3=0011(不用分解,计算机就是这么存储的);
    2. 3的第0位1,5左移0位仍为5;
    3. 3的第一位为1,5左移1位为5 * 2 = 10;
    4. 然后将其累加,得到最后结果15。

    除法实现

    传统的十进制除法计算

    当我们在计算51/3=17,抛开9*9乘法表。

    1. 从被除数的最高位5开始,从0-9选一个数,使得5-i*3>=0且使5-(i+1)3<0。我们选择了1,余数为2;
    2. 将余数 * 10+1=21,继续从0-9中选一个数,使得21-3
    i>=0且使21-(i+1)*3<0,我们选择了7;
    3. 由此,我们找到了答案17。

    计算机除法计算

    计算机计算除法的过程与人类计算的过程很类似,只是选择范围变成了0或1。
    还以51/3为例说明(51:110011;3:11)

    1. 从第一位开始,为1,小于11,结果位置0,余数为1;
    2. 从第二位开始,余数2+1=11,等于11,结果位置1,余数为0;
    3. 从第三、四位开始,余数
    2+0=0<011,结果位置0,余数为0;
    4. 从第5位开始,余数2+1=1<11,结果置0,余数为1;
    5. 从第6位开始,余数
    2+1=11=11,结果置1,余数为0。
    把结果位相连恰好是010001(17)。
    以上所介绍的乘除法原理都有对应的C语言代码参考>https://blog.csdn.net/zdavb/article/details/47108505,前面介绍只是参考扩充而已,我们主要是用Verilog HDL写代码,慢慢往下文看。

    计算机补码

    正数的补码是其本身,负数的补码是符号位不变,除此之外的位取反加一;
    计算机中补码运算时,符号位都是参与运算的。
    比如1_110(-2)+0_101(+5)=0_101(+3);
    补码的补码就是原码。
    加法运算:
    [x+y]补=[x]补+[y]补
    可直接相加。
    减法运算:
    [x-y]补=[x]补+(-[y]补)
    x的补码加上y补码的相反数。(符号也要相反)(称为机器负数)。

    计算机里,加法与减法是统一的,能够形成统一是由于补码。须知道,俩个正整数相减,可以看成是一个正整数加一个负整数,进一步,俩个正整数相减是用一个正整数的补码加上一个负整数的补码来得到的。
    在这里,我主要想介绍的是补码运算时的溢出判断

    溢出判断

    俩个相同位数的二进制补码相加,得到的正确结果位数与俩加数相同,并且符号位准确。
    这里的溢出不是指
    二进制无符号数据位相加,然后最高位有溢出则称作溢出的。(FPGA里对有符号的数是怎么运算的?要好好了解一下。)

    首先,一个正数和一个负数相加,结果一定不会溢出(因为结果的绝对值一定小于两个加数的绝对值,两个加数都表达出来了,结果定能表达出来)。
    所以,溢出只能是符号相同的俩数相加。
    	 正+正:
    		   符号位0,数位相加,如果结果的符号位变成1了,那一定是两个加数的最高位相加进上来的。 发生溢出。
    	 负+负:
    		   符号位都是1,所以符号位一定会进位。数位相加,如果最后符号位是0,说明结果变成正的了,那一定是发生溢出了(负+负!=正)。
    		   大家会困惑“为何负数补码最高位相加,发生进位的不是溢出,反而不进位是溢出呢?”在补码发生溢出的情况中,在补码发生溢出的情况中,
    		   正数是因为太大发生溢出;
    		   但是负数是因为它太小发生的溢出。
    		   有进位说明两个负数较大。(数据位未进位到符号位,符号位自己发生进位溢出了)
    	大家想,负数比较小,那么他们的补码肯定是比较大的,那数据位相加会有进位可能,而符号位已经都为1了,
    	那么1+1=0,然后再加上数据位进位的1,所以符号位最后得出的结果还是负数。
    	当负数比较大的时候,他们的补码比较小,数据位是没有溢出給符号位,可是因为符号位是全1,所以符号位会溢出,
    	那么最后得到的结果只有扩大一位位宽,用来存放溢出位并作为新的符号位才对。
    	比如1_001(-7)+1_100(-4)=1_0101(-11)。
    
    

    双符号位判断溢出:
    原来符号位只有一个,现在为了方便再加一个。
    正数:00 负数 11
    结果01时,结果为正,发生正溢出(正数太大了)
    结果10时,结果为负,发生负溢出(负数太小了)
    还是00或11就是没有溢出了。
    有人会问,难道负溢出就不会是11了吗?
    举例:我们想让结果进位到符号位,又要让加数最小(绝对值最大,这样才能溢出)
    11100是最好的用例(这是发生进位的最小补码)。
    我们把两个 11100 相加
    11100+11100=111000 -> 11000 这时发生溢出了吗?
    11000是-8,加数 11100是-4。

    移位运算:

    算数移位:在二进制中,算数移位的左移 每移一位表示*2,右移表示/2 ;
    原码移位,符号位不参与移位;
    补码移位,符号位参与移位。左移时符号位左移,右移时符号位不变,最高位补符号位;
    逻辑移位:把数字看成一串二进制数,让怎么移就怎么移,符号位和数位没区别。
    

    正整数型移位除法器

    假设被除数与除数都是八位数据,这里的算法是:
    将被除数,扩展成16位的数据,低8位为被除数的值,高八位的初始值全为0。有开始信号,对16位数据data赋值,然后开始运算。比较data的高八位和除数的值,如果大于0,说明被除数大,将此时商置1,赋值给data的最低位,然后将被除数高八位减去除数。然后将data向左移位一位,继续比较。最终计算8次后。Data的高8位数据就为所求的余数,低八位就为所求的商。
    在这里插入图片描述
    原理说白了就是:先移位,在比较(作差),迭代八次。
    下面就是写Verilog Code了,我所用的FPGA型号是ALTERA公司的EP4CE30F23C8N。

    /*
    /
    module fifo
    #(parameter MSB=3, LSB=0, DEPTH=4)//可以被重写
     
     (port_list );
     
     item;
     
    endmodule
    在上层模块对参数重写的方式如下:F1.MSB=4;F1.LSB=2;fifo F1;
    /
    module fifo
     
     (port_list );
     
     parameter MSB=3, LSB=0, DEPTH=4//可以被重写
     
    endmodule
    在上层模块对参数重写方式如下:fifo #(4,2) F1(port_list);
    /
    module fifo
     #(parameter MSB=3, LSB=0)//可以被重写
     (port_list );
    parameter DEPTH=4; //不能被重写
    endmodule
    在上层模块对参数重写方式如下:fifo #(.LSB(2), .MSB(4)) fifo(port_list);
    */
    module DIV_INT_TYPE #
    (	parameter E = 16,								//Extension of bits
    	parameter D = 8 								//The bits of dividend and divisor
    )(
    		input clk,//50MHz
    		input rst_n,
    		
    		input start,								//除法开始的使能标志
    		output reg busy,							//start开启后,busy=1代表除法器在忙,除法器被占用。当除法器忙的时候,start就要为0;
    
    		input [D-1:0] dividend,					//[ˈdɪvɪdend] 被除数
    		input [D-1:0] divisor,					// [dɪˈvaɪzər] 除数
    		
    		output wire [D-1:0] quotient,			// [ˈkwoʊʃnt] 商
    		output wire [D-1:0] remainder,		// [rɪˈmeɪndər] 余数
    		
    		output reg finish							//除法完成
    
    
    );
    /
    ///以下是一段式状态机来写的整数除法器内核
    
    reg [1:0] state;//状态机
    reg [D-1:0] count;
    reg [E-1:0] data_next;
    always @ ( posedge clk or negedge rst_n )begin
    	if( !rst_n )begin
    		count <= D;
    		state <= 2'd0;
    	end
    	else begin
    	case( state )
    	2'd0:begin
    		finish <= 1'b0;
    		busy <= 1'b0;
    		if( start == 1'b1 )begin
    			data_next <= {{E-D{1'b0}},dividend};
    			state <= 2'd1;
    		end
    		else begin
    			data_next <= 0;
    			state <= 2'd0;
    		end
    	end
    	
    	2'd1:begin
    		if( data_next[E-1:D] >= divisor )begin//如果余数大于等于除数
    			//data_next[0] = 1'b1;
    			//data_next[E-1:D] = data_next[E-1:D] - divisor;
    			//如果余数大于除数,那就对data_next做相应运算,可是我们接着要对运算完的data_next进行移位操作,这样才不会吃时钟,所以把这两步操作合为一体91行即是
    			if( count == 0 )begin
    				state <= 2'd0;
    				finish <= 1'b1;
    				busy <= 1'b0;
    				data_next <= data_next;
    				count <= D;
    			end
    			else begin
    				state <= state;
    				finish <= 1'b0;
    				busy <= 1'b1;
    				data_next[E-1:0] <= {{data_next[E-1:D] - divisor},data_next[D-1:1],1'b1} << 1'b1;
    				count <= count - 1'b1; 
    			end
    		end
    		else begin
    			if( count == 0 )begin
    				state <= 2'd0;
    				finish <= 1'b1;
    				busy <= 1'b0;
    				data_next <= data_next;
    				count <= D;
    			end
    			else begin 
    				state <= state;
    				finish <= 1'b0;
    				busy <= 1'b1;
    				data_next <= data_next << 1'b1;
    				count <= count - 1'b1;
    			end
    		end
    	end
    	default:begin
    		count <= D;
    		state <= 2'd0;
    	end
    	endcase
    	end
    end
    	
    	
    	
    assign quotient = finish?data_next[D-1:0] : quotient;
    assign remainder = finish?data_next[E-1:D] : remainder;
    	
    /
    	
    	
    /
    ///下面为二段式状态机所写的整数除法器内核		
    /*
    parameter idle = 3'b000;
    parameter shift = 3'b001;
    parameter done = 3'b010;
    reg [2:0] state_current;
    reg [2:0] state_next;
    reg [E-1:0] data_next;
    reg [E-1:0] temp;
    reg [D-1:0] count;//count用来计数移位次数
    //俩段式状态机,此模块是时序逻辑进行当前状态和下一状态的切换。。俩段式状态机组合逻辑那块用来实现各个输入输出以及状态判断
    always @ ( posedge clk or negedge rst_n )begin
    		if( !rst_n )begin
    			state_current <= idle;
    			count <= D;
    		end
    		else begin
    			state_current <= state_next;
    			if( state_current == shift )begin
    				count <= count-1'b1;
    			end
    			else begin
    				count <= D;
    			end
    		end
    end
    ///
    
    
    always @ ( posedge clk )begin//always块有俩种触发方式:1,边沿触发;2,电平触发。在这里是说always块里语句里面所有输入信号只要其中一个发生变化就能触发always块语句
    	case( state_current )
    	idle:begin	
    		finish = 1'b0;
    		
    		busy = 1'b0;
    		
    		if( start == 1'b1 )begin
    			data_next = {{E-D{1'b0}},dividend};//初始值={0000_0000,dividend};E-D=8,8'{1'b0}={1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0,1'b0}
    			state_next = shift;
    		end
    		else begin
    			state_next = idle;
    			data_next = 0;
    		end
    	end
    	
    	shift:begin
    		finish = 1'b0;
    		busy = 1'b1;
    	
    		data_next = data_next << 1;//{data_next[E-2:0],1'b0};//移位操作
    		if( data_next[E-1:D] >= divisor )begin//如果余数大于等于除数
    			data_next[0] = 1'b1;
    			data_next[E-1:D] = data_next[E-1:D] - divisor;
    		end
    		else begin
    			data_next = data_next;
    		end
    		
    		if( count == 1 )begin
    			state_next = done;
    		end
    		else begin
    			state_next = shift;
    		end
    	end
    	
    	done:begin
    		finish = 1'b1;
    		busy = 1'b0;
    		state_next = idle;
    	end
    	default:begin
    		finish = 1'b0;
    		busy = 1'b0;
    		data_next = 0;
    	end
    	endcase
    end
    
    assign quotient = finish?data_next[D-1:0] : quotient;
    assign remainder = finish?data_next[E-1:D] : remainder;
    */	
    endmodule
    
    module CTRL_DIV #
    (	parameter D = 8 )
    (
    		input clk,
    		input rst_n,
    		
    		input busy,
    		input finish,
    		
    		output reg start,
    		output reg [D-1:0] dividend,
    		output reg [D-1:0]  divisor
          );
    
    
    		
    reg [1:0] i;
    always @ ( posedge clk or negedge rst_n )begin
    	if( !rst_n )begin
    		i <= 2'd0;
    		start <= 1'b0;
    		dividend <= { D{1'b0} };
    		divisor <= { D{1'b0} };
    	end
    	else begin
    	 case( i )
    	 2'd0:
    		if( busy == 1'b0 )begin
    			i <= i+1'b1;
    			divisor <= {{ D-1{1'B0} },1'B1};//1
    			dividend <= {{ D-1{1'B1} },1'B0};//254
    			start <= 1'b1;
    		end
    		else begin
    			i <= i;
    			divisor <= divisor;
    			dividend <= dividend;
    			start <= 1'b0;
    		end
    	 
    	2'd1:
    		if( finish )begin
    			dividend <= dividend;
    			if( divisor == {{ D-1{1'B1} },1'B0} )begin
    				divisor <= divisor;
    				start <= 1'b0;
    				i <= 2'd0;
    			end
    			else begin
    				divisor <= divisor + 1'b1;
    				start <= 1'b1;
    				i <= i;
    			end
    		end
    		else begin
    			dividend <= dividend;
    			divisor <= divisor;
    			start <= 1'b0;
    			i <= i;
    		end
    	
    	default:begin
    		i <= 2'd0;
    		start <= 1'b0;
    		dividend <= { D{1'b0} };
    		divisor <= { D{1'b0} };
    	end
    	endcase
    	end
    end
    endmodule
    
    module TOP #( parameter D = 8 )
    (
    		input clk,
    		input rst_n,
    		
    		output  [D-1:0] quotient,		// [ˈkwoʊʃnt] 商
    		output  [D-1:0] remainder,		// [rɪˈmeɪndər] 余数
    		
    		output wire finish						//除法完成
    
    
    );
    
    wire busy;
    DIV_INT_TYPE #(.E( 16 ),.D( 8 )) DIV_INT_TYPE(
    		.clk( clk ),
    		.rst_n( rst_n ),
    		
    		.start( start ),
    		.busy( busy ),
    		
    		.dividend( dividend ),
    		.divisor( divisor ),
    		
    		.quotient( quotient ),
    		.remainder( remainder ),
    		
    		.finish( finish )
    		
    
    );
    
    wire start;
    wire [D-1:0] dividend;
    wire [D-1:0] divisor;
    CTRL_DIV # ( .D( 8 ))(
    		.clk( clk ),
    		.rst_n( rst_n ),
    		
    		.busy( busy ),
    		.finish( finish ),
    		
    		.start( start ),
    		.dividend( dividend ),
    		.divisor( divisor )
    
    		);
    endmodule
    

    Signal Tap II仿真波形见下图:
    在这里插入图片描述被除数是8位固定值254,除数是在一次除法完成后就进行累加。经测试,除法器所用时钟为固定不变的11个clk,时钟频率是50MHz。
    上面的代码中俩段式状态机代码是错误的,不要看。

    吃时钟的整数型除法器设计

    介绍此吃时钟除法器设计是为下面“整数型除法器设计”作铺垫的。后面的设计是根据此设计来的。注意,在FPGA里,对于一个IP核若输出或输出有负数,都是用补码形式进行的。所以要对补码的运算有了解,一个正数的补码加一个负数的补码不会溢出。

    此设计只止于思维上的分析了,用C语言也完全可以写出来,在时钟消耗方面没有下功夫,未得FPGA精髓。

    代码算法理念:
    1. 先取除数和被除数的正负关系,然后正值化被除数。除数取负值的补码;
    2. 被除数递减与除数,每一次的递减,商数递增;
    3. 直到被除数小于除数,递减过程剩下的都是余数;
    4. 输出的结果根据除数和被除数的正负关系来划分。

    module DIVIDER_SIGN_INT//八位带符号除法器内核
    (
    		input clk,				//50MHz时钟
    		input rst_n,			//全局复位信号
    		
    		input start,			//除法器使能信号,为“1”时,除法器状态机才能执行
    		input [7:0] dividend,	//被除数
    		input [7:0] divisor,	//除数
    		
    		output done,			//一次除法完成
    		output [7:0] quotient,	//商
    		output [7:0] reminder	//余数
    		
    		);
    		
    reg [3:0] i;					//状态机
    reg [7:0] dend;					//寄存器,对被除数取正,即存取被除数绝对值的补码
    reg [7:0] dsor_n;				//寄存器,对除数取负,即存取( -|除数| )补码	
    reg [7:0] dsor_p;				//寄存器,对除数取正,即存取除数绝对值的补码
    reg [7:0] q;					//寄存器,商。用于always块
    reg dif;						//商正负符号判别标志
    reg done_sig;
    
    always @ ( posedge clk or negedge rst_n )begin
    		if( !rst_n )begin
    			i <= 4'd0;
    			dend <= 8'd0;
    			dsor_n <= 8'd0;
    			dsor_p <= 8'd0;
    			q <= 8'd0;
    			dif <= 1'b0;
    			done_sig <= 1'b0;
    		end
    		else if( start )begin
    			case( i )
    			
    			4'd0:begin
    				dend <= dividend[7] ? ~dividend + 1'b1 : dividend;//被除数取正
    				dsor_n <= divisor[7] ? divisor : (~divisor + 1'b1);//除数取负
    				dif <= dividend[7] ^ divisor[7];//正负判断,之前错误写的是dif <= dividend ^ divisor;
    				q <= 8'd0;//商初值化
    				i <= i+1'b1;//进入下一状态机
    			end
    			
    			4'd1:begin
    				if( dsor_p > dend )begin//正除数与每一步的正余数比较,当正除数大于( |被除数|-N*|除数| )时,除法器就可以输出最终值了。算法中思想是,被除数是由几个除数组成。
    					q <= dif ? (~q + 1'b1) : q;//输出余数补码形式,除法过程本身q是以正数补码叠加的;所以当被除数与除数异号时,q要以对应的负数补码形式输出。
    					i <= i+1'b1;//一次除法完成,进入下一状态机。			   
    				end
    				else begin
    					dend <= dend + dsor;//dend在除法动作过程中,肯定是越来越小,因为一个正数和负数的和还是正数,且和小于前面的正加数。
    					q <= q+1'b1;//每进行一次叠加,就表示对被除数的一次细分
    					i <= i;//对被除数进行细分,多次细分未完成,状态机不变,只有当dsor_p > dend时,细分才结束,状态机才跳转
    				end
    			end
    			
    			4'd2:begin
    				done_sig <= 1'b1;//一次除法已经完成标志,除法完成标志是一个周期的正脉冲
    				i <= i+1'b1;
    			end
    			
    			4'd3:begin
    				done_sig <= 1'b0;
    				i <= 4'd0;
    			end
    			
    			default:begin
    				i <= 4'd0;
    				dend <= 8'd0;
    				dsor <= 8'd0;
    				q <= 8'd0;
    				dif <= 1'b0;
    				done_sig <= 1'b0;
    			end
    			
    			endcase
    				
    assign done = done_sig;
    assign quotient = q;
    assign reminder = dend;
    
    endmodule
    

    下面是Signal Tap II仿真波形
    在这里插入图片描述在这里插入图片描述在这里插入图片描述仿真结果很直观暴露了该除法器的弱点,即不同的除数,就有不一样的时钟消耗。时钟消耗是根据除数的“数量”来做决定。

    整数型除法器设计

    在设计中,补码运算采用了双符号来进行对被除数与除数绝对值的比较。正数的补码与负数的补码进行相加,正数补码的符号位就是“00”,负数补码的符号位是“11”,符号位左边为高位,右边为低位。通过对正负数补码相加后得到的值的高位符号位进行判别二者模的大小。如果高位为“1”,则代表负数模大,反之则代表正数模大。此算法与楼上“正整数型除法器设计”的算法思路是一致的,只不过楼上是正整数除法,而这里是整数除法。仿真读者可以自行用Modelsim来写Test Bench模块验证一下,个人建议有板子的话用Quartus自带的Signal Tap II验证更为准确。

    module DIV_SIGN_INT(
    		input clk,					//50MHz时钟
    		input rst_n,				//全局复位
    						
    		input start,				//除法器使能信号
    		
    		input [7:0] dividend;		//被除数
    		input [7:0] divisor,		//除数
    		
    		output finish,				//一次除法完成标志
    		output [7:0] quotient,		//商
    		output [7:0] reminder		//余数
    
    		);
    	
    reg [3:0] i;						//状态机
    reg [8:0] dsor;						//双符号位11_| divisor[6:0] |补码
    
    reg [15:0] temp;					//除法器移位比较运算的扩展空间,temp = 0000 00_00 |dividend|补码 
    reg [15:0] dif_compare;				//此空间是用于 |被除数|补码 左移后 与 (-|除数|)补码的比较,注意都是双符号位,当dif[15]为1则代表负数(负除数双符号位的补码表示)大,反之代表正数(指双符号位被除数正值化)大。
    reg dif;							//被除数与除同号与否的判断
    reg finish_sig;						//一次除法完成的标志位,完成后输出一个时钟正脉冲
    always @ ( posedge clk or negedge rst_n )begin
    	if( !rst_n )begin
    		i <= 4'd0;
    		dsor <= 9'd0;
    		temp <= 16'd0;
    		dif_compare <= 16'd0;
    		dif <= 1'b0;
    		finish_sig <= 1'b0;
    	end
    	else if( start )begin
    		case( i )
    		
    		0:begin
    			dif <= dividend[7] ^ divisor[7];//判断二者符号同异
    			dsor <= divisor[7] ? { 1'b1,divisor } : { 1'b1,~divisor+1'b1 };//除数取负化,且采用双符号位表示
    			temp <= dividend[7] ? { 8'd0,~dividend+1'b1 } : { 8'd0,dividend };//被除数取正化放于低八位
    			dif_compare <= 16'd0;
    			i <= i+1'b1;
    		end
    		
    		1,2,3,4,5,6,7,8:begin
    			dif_compare = temp + { dsor,7'd0 };
    			
    			if( dif_compare[15] )begin		//如果除数绝对值大,temp继续左移,低位补零
    				temp <= { temp[14:0],1'b0 };
    			else begin					  	//如果被除数大于除数绝对值,左移,并且低位补1,最后移位8次后,低位为商,高位为余数
    				temp <= { dif_compare[14:0],1'b1 };
    			end
    			
    			i <= i+1'b1;
    		end
    		
    		9:begin
    			finish_sig <= 1'b1;
    			i <= i+1'b1;
    		end
    		
    		10:begin
    			finish_sig <= 1'b0;
    			i <= 2'd0;
    		end
    		
    		endcase
    	end
    end
    
    assign finish = finish_sig;
    assign quotient = dif ? ( ~temp[7:0]+1'b1 ) : temp[7:0];
    assign reminder = temp[15:8];
    
    endmodule
    
    展开全文
  • 原码除法

    千次阅读 2020-09-19 17:21:04
    计算机原码除法主要分为恢复余数法和加减交替法,我们先从十进制除法运算中获取一些规律,再运用到二进制的除法运算中. 十进制除法 仔细观察下面十进制运算782/7的过程. 782除以7第一位商上1,余数为0.第二位上1,余数...
  • 补码的除法运算

    千次阅读 2020-09-23 20:47:03
    补码的除法运算是将两个数都使用补码的形式来进行计算,和原码的除法相比,补码的除法运算中被除数,除数以及余数都采用双符号位的形式参与计算,最后得到的余数符号位就代表着最终结果的符号位. 加减交替法 题目:假设...
  • C语言负数的除法和求余运算

    千次阅读 2021-05-19 12:42:10
    假定我们让 a 除以 b,商为 q,余数为 r: q = a / b;r = a % b;...2.如果我们改变 a 的正负号,我们希望这会改变 q 的符号,但这不会改变 q 的绝对值。3.当 b>0 时,我们希望保证 r >= 0 ...
  • 一、乘法运算 在计算机中,乘法运算是一种很重要的运算,有的机器由硬件乘法器直接...笔算乘法时乘积的符号由两数符号心算而得:正正得正;其数值部分的运算如下: 所以 A×B=+0.10001111 可见,这里包含着被乘数.
  • Python对小数进行除法运算的正确方法示例求一个算式代码如下:a=1b=2c=3print c*(a/b)运行结果总是0,反复检查拆开以后,发现在Python里,整数初整数,只能得出整数。也就是 a 除 b 这个结果永远是0,只要把a或者b...
  • Java实用教程:运算符

    千次阅读 2021-03-13 22:05:04
    所谓运算符,就好比日常生活中的运算符号“+”、“-”、“*”、“/”,这些符号几乎天天都要用到。在Java中,运算符就和日常生活中的运算符号一样,起到运算的作用,但是不再是这么简单的运算符。3.1算术运算符算术...
  • 定点除法运算

    千次阅读 2019-11-05 19:53:33
    计算机中,除法运算和乘法运算一样,是非常常用的一种运算。同样,除法运算在计算机中的实现也分为符号部分和数值部分两部分。...设被除数和除数分别为X和Y,Xf和Yf分别代表X和Y的符号位,除法运算结果为Z,Zf代...
  • 模拟手工的无符号数,原码除法
  • 二进制乘除法的实现

    万次阅读 多人点赞 2017-09-25 11:49:20
    转自:...因为无论是减法还是乘法,都可以由加法运算来替代,唯有除法不能由加法替代。 了解计算机运算的规律,可以有助于我们理解很多程序代码上无法理解的内容。比如上章提到的溢
  • 题目:在51单片机里,有两个16位(每个16位数是由两个字节组成)无符号数相除,结果放在30H、31H。例如:由R0、R1组成被数,R2、R3组成除数,被数的数值为500,除数的数值为1300,即“500/1300=0.3846”。在计算...
  • 原码和补码的除法运算

    千次阅读 2021-02-14 22:16:10
    《原码除法》 手动计算: 计算机计算: 方法一:恢复余数法 1.被除数、除数存储在ACC中,除数存储在通用寄存器中,商存储在MQ中。 2.因为计算机不知道商0还是商1,但是会默认先商1,所以恢复余数法就是如果商错了...
  • 关于c#除法运算的问题

    万次阅读 2016-04-09 22:20:10
    关于c#除法运算的问题
  • 除法和算术右移之间的巧妙取代

    千次阅读 2016-10-16 15:03:16
    在大多数机器上,整数 的除法很慢,需要30多个时钟周期,除以2的幂也可以用移位运算来实现 先码上代码  #include "stdio.h"  int main()  {  int x=-128;   int y=x/4;  printf("y=%d",y);  } 再附上汇编...
  • 这些键包括与传统打字机上相同的字母、数字、标点符号符号键。 控制键。这些键可单独使用或者与其他键组合使用来执行某些操作。最常用的控制键是 Ctrl、Alt、Windows 徽标键 和 Esc。 功能键。功能键用于执行特定...
  • 计算机组成原理 定点运算-移位、加、减、乘、(详细解析-看完就会)​blog.csdn.net定点运算一、移位运算1.移位运算的意义:计算机中的移位是数据相对于小数点移位(左移或右移),数据移动,小数点位置不发生变化2.在...
  • c语言 符号

    千次阅读 2021-05-21 16:06:11
    c语言基本符号: 先看几条有关注释的语句:int/*...*/i; 和in/*…*/t i; 到底哪一条是对的?我们一般用的注释符号是/*...*/ 和///*...*/ 注释部分其实就相当于一个空格下面就可以解释了 int/*...*/i 就是 int i;而in...
  • 符号数,因为存在符号位,符号位如果是0的话,代表这是一个正数,符号位如果是1的话,代表这个数是一个负数。   我们可以用db伪指令来声明一些数字:   编译之后: 10D的十六进制表示就是0x0A,11D的...
  • 使用移位运算符做乘除法运算

    千次阅读 2019-06-04 11:38:58
    >>(向右位移)针对二进制,转换成二进制后向右移动n位 一个整数每次执行移位运算中的左运算n次,相当于这个整数乘以2的n次方;...坐乘右 public class Main { public static void main(.........
  • 1、除法运算符‘/’ 按照常规数学计算的方式直接得出结果即可。 2、整除运算符‘//’ 1)如果被除数和除数均为正数或者均为负数,则和C语言这些编程语言一样,直接取商就行; 2)如果被除数或者除数其中一个为...
  • 矩阵除法运算 在MATLAB中有两种矩阵除法运算 \ 代表右除(常用除法)和/左除运算;例1求解线性方程组的解 ;第三章 符号运算;本章重点;3.1 符号计算基础;1. 符号函数中变量的确定;2. 函数求极限;3.符号函数求微积分;4. ...
  • Python的变量以及Python的除法

    千次阅读 2017-11-13 12:18:19
    这里主要介绍Python的三个除法符号,其作用各不相同 1、‘/’,精确除。>>>10/3 3333333333333.5 2、 ‘//’,地板除。>>>10//3 3 #取整数 3、 ‘%’,取余除、。>>>10%3 1 #取两个数相除的余数
  • 虽然我们在编程语言中可以直接使用+-/,但是对某些要求不能用/的情况下,我们有必要了解一下计算机是怎样完成乘除法的。 首先,我们要明确一下计算机所能完成的最基本操作是:+(-)和左移右移。虽然ISA中一般都有...
  • C/C++除法及取模

    千次阅读 2014-11-04 20:13:17
    除法的取整分为三类:向上取整、向下取整、向零取整。 1.向上取整:向+∞方向取最接近精确值的整数。在这种取整方式下,7/4=2,7/(-4)=-1,6/3=2,6/(-3)=-2 2.向下取整:向-∞方向取最接近精确值的整数。在这种取整...
  • 同样是同学遇到的面试题,面试官问的原题是如何用移位和加减实现除以3的操作,在此略微扩充一下,实现无符号整数除法,但是返回值也为无符号整型。   方法一:类似小学学习的除法运算,从高位开始减去除数,此处...
  • Oracle 函数

    千次阅读 2021-05-02 05:19:19
    Oracle 函数1 数值型函数abs:求绝对值函数,如:abs(?5) 5sqrt:求平方根函数,如:sqrt(2) 1.41421356...1mod:求除法余数,如:mod(1600, 300) 100ceil:求大于等于某数的最小整数,如:ceil(2.35) 3floor:求小于等于某数的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 82,082
精华内容 32,832
关键字:

代表除法的符号