精华内容
下载资源
问答
  • 二进制有符号数乘法的一些想法
    千次阅读
    2019-11-23 11:36:23

    A和B是一个8bit有符号数,C=A*B,则C应该是一个16bit的有符号数,8bit有符号能用二进制表示的最大负数为-128,补码表示为10000000;最大正数为127,补码表示为01111111。两个最小的复数相乘(-128*-128)才会溢出,但实际工程应用中,不会在8bit数的时候取到-128,只会取到-127,所以最后A和B相乘,会是一个15bit的数据,原来的16bit数据会把最高1bit截饱和。

    更多相关内容
  • 双字节二进制有符号数乘法 标号: MULS功能:双字节二进制有符号数乘法(补码) 入口条件:被乘数在R2、R3中,乘数在R6、R7中。 出口信息:乘积在R2、R3、R4、R5中。 影响资源:PSW、A、B、R2~R7 堆栈需求: ...
  • 有符号二进制乘法

    千次阅读 2020-04-13 22:16:17
    有符号二进制数的乘法 我的失误(差点误以为自己乘法问题,自己和别人算的不一样) x=101=-3 和y=011=3相乘 结果为110111=-9 我刚开始以为是简单的把连个二进制相乘得到的结果就是其答案(001111),而事实确...

    有符号二进制数的乘法

    我的失误(差点误以为自己乘法有问题,自己和别人算的不一样)

    x=101=-3 和y=011=3相乘 结果为110111=-9
    我刚开始以为是简单的把连个二进制码相乘得到的结果就是其答案(001111),而事实确非常的打脸,在我网上找了好多的例子,自己都是错的,晕了半个小时后,才迷过来。
    其实不是简单的相乘,而是把前面的符号位补出来相乘以后,才是这道题的答案(在截取n^2也就是6位数)。(111 101)*(000011)=110111=-9
    在这里插入图片描述

    展开全文
  • 有符号二进制数的乘法

    万次阅读 多人点赞 2017-01-07 12:19:07
    其中两个负数的例子:3位二进制乘法结果一般需要6为二进制表达 带符号数 x=101=-3 和y=011=3相乘 结果为110111=-9  如果直接算出来十进制是-9然后转换为6为二进制我也能理解,但是我很好奇他利用了什么规则得出...
    最近在阅读《深入理解计算机系统》讲到补码乘法,书上给了一个例子是三位无符号和补码的乘法表。其中两个负数的例子:3位二进制乘法结果一般需要6为二进制表达
    带符号数
    x=101=-3 和y=011=3相乘 结果为110111=-9 
    如果直接算出来十进制是-9然后转换为6为二进制我也能理解,但是我很好奇他利用了什么规则得出这样的结果。
    根据结果推过程我认为计算机做计算都要按照正数或者说无符号数来算,那么先把x做补码非得-x=011=3 和y相乘
    ___011
    x__011
    -------------
    ___011
    +_011
    -------------
    001001
    得到z=001001,然后根据x和y的符号位异或得到应该是负数,于是将结果再求补码非 -z=110111 即-9

    我不知道是否的确是执行了是样的位操作规则得出的结果,各种百度Google没有搜到具体的补码运算过程。

    而唯一搜到的一个这个地址给出的最后的例子,我加不出他给出的位级计算的结果(反倒用我上述的模式能得到结果但是这把我搞糊涂了)



    这样理解可能会更容易一些:
    首先,我们从书上了解到关键的几个知识点:
    1. 对无符号和补码乘法,乘法运算的位级表示都是一样的。
    2. 机器使用一种乘法指令来进行有符号和无符号整数的乘法,也就是都采用无符号乘法处理,再取低位。
    3. 无符号和补码的乘法低位是相同的,书上的图也想表达的是这个意思。证明如下:

    <img src="https://pic2.zhimg.com/fc4120501bf24acfd93509ad64d2609d_b.png" data-rawwidth="470" data-rawheight="80" class="origin_image zh-lightbox-thumb" width="470" data-original="https://pic2.zhimg.com/fc4120501bf24acfd93509ad64d2609d_r.png">

    对于题主的问题,拿书上的例子来说,计算过程如下:
    <img src="https://pic2.zhimg.com/f0dc88ecdcc1e444ea0918f3db7183f5_b.png" data-rawwidth="952" data-rawheight="504" class="origin_image zh-lightbox-thumb" width="952" data-original="https://pic2.zhimg.com/f0dc88ecdcc1e444ea0918f3db7183f5_r.png">建议仔细理解一下上述几个知识点及证明过程,然后做一下后面的习题2.75加深理解。

    展开全文
  • Verilog实现二进制有符号定点的乘法运算

    千次阅读 多人点赞 2020-08-12 15:44:33
    Verilog实现有符号数乘法运算二进制运算原理1、无符号二进制数(signed)运算 二进制运算原理 总结最近FPGA的学习,使我明白了一件事:在Verilog程序的编写中,“位”(bit)这一概念,对于程序编写至关重要,...

    二进制运算原理

    总结最近FPGA的学习,使我明白了一件事:在Verilog程序的编写中,“位”(bit)这一概念,对于程序编写至关重要,Verilog代码中,数据运算均以位来操作,因此我觉得有必要认真研习一下二进制运算的基本过程和运算方法。
    有符号二进制数的表示一般以二进制补码(two’s-complement)的形式来表示,有助于我们理解和编写底层二进制运算的程序。相信这对我们单片机和FPGA的学习将收益匪浅。

    1、无符号二进制数(unsigned)乘法运算

    1.1 无符号数常规运算

    对于无符号数的乘法运算相对简单,直接通过移位后相加得到。这里我随意举个无符号数相乘的例子来说明运算法则,比如(1001)2 和(0101)2 相乘可以写成如下形式:
    1001和0101相乘
    从上式可以看出,该运算和我们十进制的运算相差无几,在二进制运算中乘数(0101)从低位开始与被乘数(1001)相乘。在乘数为1时就相当于对被乘数进行相应的移位操作,乘数使用的是第n位,则被乘数相应的右移(n-1)位,最后对中间结果进行相加,得到运算结果。
    原理相当简单,但是在verilog代码编写中,在规定了乘数与被乘数的数据位宽后(如例子的4bits数据),结果数据位宽范围:4bits~7bits(4+4-1),为防止运算结果溢出则需要预先给结果数据给定7bits的位宽。
    根据最近的Verilog的学习,我总结了如下表的数据位宽分配规律(当然是针对无符号数而言)

    数据名数据位宽
    乘数a
    被乘数b
    乘积a+b-1

    1.2 无符号数乘法补位运算

    同时,在最近《深入理解计算机系统》一书的阅读中,我理解了另一种无符号二进制数的运算方法。是一种补位的方式,在已知乘数和被乘数的位宽后,对其进行相同于乘积位宽的补位,高位补0,一直到所定义的乘积的最高位,这里我定义乘积数据的位宽为8bits,对于高于所定义位宽的数据进行截断并舍弃。形式如下图所示:
    在这里插入图片描述
    当然补位方法是一种通用与有符号和无符号数的运算方法,对于无符号数的运算优势可能不突出,但是对于有符号的运算优势则极其突出。

    2、有符号二进制数(signed)乘法运算

    2.1 有符号定点数乘法运算

    有符号二进制数则和第1节中的无符号数运算过程有些差异,在之前的学习中我参考了一篇博客园中搬运翻译的博客:

    符号定点二进制小数(Qn format)乘法原理:https://www.cnblogs.com/Yuya-memeda/p/12708868.html
    原博客(Fixed-Point Representation: The Q Format and Addition Examples):https://www.allaboutcircuits.com/technical-articles/fixed-point-representation-the-q-format-and-addition-examples/

    运算过程分成了4种:正数 * 正数;正数 * 负数; 负数 * 正数 以及 负数 * 负数。不同的情况对应不同的运算法则,感兴趣可以去看看过程,相信会有帮助。
    在这里我就不做重复的劳动了,我这里主要要记录的是第二种方法。

    2.2 有符号定点数乘法补位运算

    该方法相比2.1节中对有符号定点数,需要分四种情况进行运算的方法会相对简单得多。
    此方法和1.2节中的补位运算相同,对于有符号数的乘法运算,对其乘数和被乘数进行位宽扩展。
    这里我总结了一下,扩展后的位数宽度为正常乘积位数 + 符号位,即:

    扩 展 后 位 宽 = 被 乘 数 位 数 a + 乘 数 位 宽 b − 1 + 符 号 位 宽 ( 1 b i t ) = a + b 扩展后位宽=被乘数位数a + 乘数位宽b -1 + 符号位宽(1bit)=a+b =a+b1+1bit=a+b
    扩展时,对高位进行补充的方式和无符号数的运算不一样,需要依据符号进行补充,符号位为‘1’则高位补‘1’,符号位为‘0’则高位补‘0’。同样的以(1001)2和(0101)2 为例。乘数与被乘数均是4bits,扩展后不至于溢出的位数为4+4=8bits
    有符号数是以补码(正数的补码为其本身,负数的补码为其反码+1)的形式来表示的,则该数据的结果为:

    补 码 : 1001 = > 反 码 : 0110 = > 原 码 : 0111 ( − 7 ) 补码:1001 =>反码:0110=>原码:0111 (-7) 1001=>0110=>01117

    补 码 : 0101 = > 原 码 : 0101 ( 5 ) 补码:0101 =>原码:0101 (5) 0101=>01015

    乘 法 运 算 : − 7 ∗ 5 = − 35 乘法运算:-7*5 = -35 75=35

    应用补位截断的方法进行有符号定点数乘法如下图所示
    在这里插入图片描述

    高于扩展位数的数据进行截断舍弃,最后结果如下

    补 码 : 11011101 = > 反 码 : 00100010 = > 原 码 : 00100011 补码:11011101=>反码:00100010=>原码:00100011 11011101=>00100010=>00100011

    结 果 为 : ( − 1 ) 1 ∗ ( 1 ∗ 2 5 + 1 ∗ 2 1 + 1 ∗ 2 0 ) = − 35 结果为:(-1)^1*(1*2^5+1*2^1+1*2^0)=-35 (1)1(125+121+120=35

    和我们乘法运算的结果相同。接下来我们再来验证 正数 * 正数,正数 * 负数, 负数 * 正数,负数 * 负数。验证方法的通用性,无需将数据分为政府4种情况进行运算,减少代码量。
    正数 * 正数的情况在1.2节中已经验证过了,它是该补位截位运算法的特殊情况,负数 * 正数的情况已在上面验证,这里不赘述。
    下面我们验证正数乘负数和负数乘负数。(下面的式子中不再写被截断舍去的数据位)

    1. 正数乘负数:
      在这里插入图片描述
    2. 负数乘负数
      最后我这里使用定点数进行运算,来验证其对于小数同样具有通用性,可用于定点数运算

    11.01 ( B ) = 00.11 ( 原 码 ) = − 1 ∗ ( 1 / 2 1 + 1 / 2 2 ) = − 0.75 11.01(B) =00.11(原码)=-1*(1/2^1 + 1/2^2) = -0.75 11.01(B)=00.11()=1(1/21+1/22)=0.75

    10.11 ( B ) = 01.01 ( 原 码 ) = − 1 ∗ ( 1 ∗ 2 0 + 1 / 2 2 ) = − 1.25 10.11(B) =01.01(原码)=-1*(1*2^0+ 1/2^2) = -1.25 10.11(B)=01.01()=1(120+1/22)=1.25
    结果为:
    0000.1111 ( B ) = 0000.1111 ( 原 码 ) = + 1 ∗ ( 1 / 2 1 + 1 / 2 2 + 1 / 2 3 + 1 / 2 4 ) = 0.9375 0000.1111(B) =0000.1111(原码)=+1*(1/2^1 + 1/2^2+ 1/2^3+ 1/2^4) = 0.9375 0000.1111(B)=0000.1111()=+1(1/21+1/22+1/23+1/24)=0.9375
    进而验证了该方法的正确性。
    在这里插入图片描述

    原理总结

    到此就完成了对定点数的乘法运算,相比于上面文献的对于有符号定点数需要分符号进行分类运算,此补位截位的操作方法更加通用。详细的可以参考《深入理解计算机系统》的内容。
    这里还有一篇博客可以参考,其中有一些简单的过程。
    有符号二进制数的乘法https://blog.csdn.net/wordwarwordwar/article/details/54172777

    Verilog代码实现

    原理过程在上面已经阐述完了,这里不过多赘述,直接放上Verilog代码。Vivado中编写的程序和仿真结果如下:(这段verilog代码里的for循环用得不太熟练,如有更好的方式,还请指教)

    `timescale 1ns / 1ps
    ///
    //   32bit,16位小数的定点数乘法
    //
    
    module Fix32_16mult(
        input    clk,
        input    rst_n,
        input    [32-1:0]  a,
        input    [32-1:0]  b,
        output   [64-1:0]  ret
        );
        
        //-----------------------------------------------
        //  扩展a,b
        reg   [64-1:0]  a_r, b_r;
        always @ (posedge clk or negedge rst_n) begin
            if(rst_n == 1'b0) begin 
                a_r <= 64'h0000_0000_0000_0000;
                b_r <= 64'h0000_0000_0000_0000;
            end
            else begin 
                a_r <= {{32{a[31]}}, a[31:0]};
                b_r <= {{32{b[31]}}, b[31:0]};
            end
        end
        
        //--------------------------------------------------
        //  依位移位
        reg [64-1:0] ret_r [64-1:0];
        integer i, j, k;
        always @ (posedge clk or negedge rst_n) 
            if(rst_n == 1'b0)
                for(i = 0; i < 64; i = i+1)
                    ret_r[i] <= 64'h0000_0000_0000_0000;
            else 
                for(k = 0; k<64; k = k + 1)
                    if(b_r[k] == 1)
                        ret_r[k] <= (a_r << k);
                    else
                        ret_r[k] <=  64'h0000_0000_0000_0000;
                        
        
        //---------------------------------------------------
        // 对结果求和 截位
        reg [64-1:0] sum;
        always @ (posedge clk or negedge rst_n) 
            if(rst_n == 1'b0)
                sum <= 64'h0000_0000_0000_0000;
            else begin 
                    sum <= ret_r[0]+ret_r[1]+ret_r[2]+ret_r[3]+ret_r[4]+ret_r[5]+ret_r[6]+ret_r[7]+ret_r[8]+ret_r[9]+ret_r[10]+ret_r[11]+ret_r[12]+ret_r[13]+ret_r[14]+ret_r[15]+ret_r[16]+ret_r[17]+ret_r[18]+ret_r[19]+ret_r[20]+ret_r[21]+ret_r[22]+ret_r[23]+ret_r[24]+ret_r[25]+ret_r[26]+ret_r[27]+ret_r[28]+ret_r[29]+ret_r[30]+ret_r[31]
                    +ret_r[32]+ret_r[33]+ret_r[34]+ret_r[35]+ret_r[36]+ret_r[37]+ret_r[38]+ret_r[39]+ret_r[40]+ret_r[41]+ret_r[42]+ret_r[43]+ret_r[44]+ret_r[45]+ret_r[46]+ret_r[47]+ret_r[48]+ret_r[49]+ret_r[50]+ret_r[51]+ret_r[52]+ret_r[53]+ret_r[54]+ret_r[55]+ret_r[56]+ret_r[57]+ret_r[58]+ret_r[59]+ret_r[60]+ret_r[61]+ret_r[62]+ret_r[63];    
            end 
            
        assign  ret = sum;
        
        
        
    endmodule
    
    

    数据为32bits定点数,16bits为小数位。

    以+810 (0000_0008)16 和 -810 (ffff_fff8)16 以及 -1110 (ffff_fff5)16 乘 -1010 (ffff_fff6)16为例,编写测试文件进行所说的32位定点数乘法模块测试,仿真结果如下图所示。
    仿真中,讲述调整为real类型,选择fix,signed有符号定点数类型,小数位数选择16bits。
    在这里插入图片描述

    仿真结果:
    1 、 ( 0000.0008 ) H = + 0.0001220703125 ; 1、(0000.0008)H = +0.0001220703125; 1(0000.0008)H=+0.0001220703125;
    ( f f f f . f f f 8 ) H = − 0.0001220703125 ; (ffff.fff8)H =-0.0001220703125; (ffff.fff8)H=0.0001220703125;
    结 果 : ( f f f f , f f f f , f f f f , f f c 0 ) H = − 1.490116119384765625 e − 08 结果:(ffff,ffff,ffff,ffc0)H=-1.490116119384765625e-08 (ffff,ffff,ffff,ffc0)H=1.490116119384765625e08
    结 果 正 确 结果正确
    2 、 ( f f f f , f f f 5 ) H = − 0.0001678466796875 ; ( f f f f , f f f 6 ) H = − 0.000152587890625 ; 2、(ffff,fff5)H = -0.0001678466796875; (ffff,fff6)H =-0.000152587890625; 2(ffff,fff5)H=0.0001678466796875;(ffff,fff6)H=0.000152587890625;
    结 果 : ( 0000 , 0000 , 0000 , 006 e ) H = 2.56113708019257 e − 08 结果:(0000,0000,0000,006e)H=2.56113708019257e-08 (0000,0000,0000,006e)H=2.56113708019257e08
    结 果 正 确 结果正确
    同样把数据作为32位有符号定点数,无小数位,结果同样正确,不多验证,直接对Vivado中Real值小数位进行设置即可。

    总结

    上述仿真中就可以验证有符号二进制定点数的乘法器设计完成,计算机二进制乘法,总结起来主要包括三个过程,1)对乘数和被乘数进行位数扩展;2)依据乘数各位上的值进行对应的移位操作;3)对所有移位的结果进行累加,得到乘法结果。

    如有错误的地方还望多多指正

    学习不总结等于没学,多做总结,共勉

    展开全文
  • 位数问题 a_width位的a,乘以B_width位的b,结果的位数是A_width + B_width。 定点小数问题 小数位数等于a的小数位数,加上b的小数位数之和。 补码相乘问题 补码 * 补码 = 补码 ...有符号数 * 有符号数 前三个加
  • 本文介绍了二进制binary数据在存储器的表示方式,C语言的位运算符号有符号和无符号混合运算的规则,主要是乘法和除法规则不同。最后以IIR滤波器定点实现的例子来说明如何提高计算精度。二进制数据与补码、原码和...
  • 三星9454实现两个无符号的八位二进制数相乘
  • 在搭建乘法器,验证波形时,多比特二进制数手算比较麻烦,所以导入matlab计算正确的输出结果。 此时要注意乘法器的特性,举个例子吧 5 × 5 = 25 也就是4‘b0101(+5) * 4’b0101(+5) = 0011001(+25) 那 -5 × 5 = -...
  • 二进制数与十进制的转换 聊二进制数的运算前,我们先看看二进制数的值与十进制的值是如何相互转换的, 十进制转换成二进制 ...只需将二进制数的各位的值和位权相乘,然后将相乘的结果相加即可,有木有...
  • 在汇编乘法中,32位数字与32位数字相乘,只能是用四次16位相乘表示。 即,int32(a)* int32(b) = (h16(a)+l16(a)) * (h16(b) + l16(b)) 。 现在我们讨论下 h16(a) 和 l16(a) 的符号情况 如果a 为负数, a的31 ...
  • 符号二进制数的算术运算

    万次阅读 2019-02-24 19:50:16
    符号二进制数的算术运算 本文内容参考自王达老师的《深入理解计算机网络》一书&amp;amp;amp;amp;amp;amp;amp;lt;中国水利水电出版社&amp;amp;amp;amp;amp;amp;amp;gt; 一、无符号二进制数的运算规则: 无...
  • (1)从外部扩展RAM中读取被乘数和乘数,乘数存放于0100H处开始,总共3个乘数,每个乘数是3字节的有符号数。被乘数存放于0200H处开始,总共3个被乘数,每个被乘数是3字节的有符号数。 (2)把结果储存到内部存储区,...
  • 本程序适用于Intel的51系统单片机例 将(R2R3)和(R6R7)两个双字节无符号数相乘,结果送R4R5R6R7。用移位和迭加的方式,步骤如下:1)清部分积(高16位)R4R5=0。循环数16。2)把R4R5R6R7右移一位,从最低位开始检查乘数R6...
  • 二进制乘法运算

    2022-04-10 00:23:01
    二进制乘法运算前言一、定点一位乘法1.定点原码一位乘法2.定点补码一位乘二、定点二位乘法1.引入库2.读入数据总结 前言 一、定点一位乘法 1.定点原码一位乘法 ➢ 乘积的符号相乘数符号的异或值,数值则为...
  • 有符号数乘法运算

    千次阅读 2021-11-03 09:28:27
    四位有符号数的乘法运算 ...两个四位符号二进制数相乘得到的结果是八位符号二进制数。 那么在此基础上,可以将有符号数的乘法运算分为以下四种情况: 1、a与b均为正数 假设a=+5,b=+3 直接相.
  • 设计、实现八位二进制数全加器 设计思路 总体设计为三输入,两输出。具体:实体声明部分描述电路模块的端口,即指定输入输出口及其大小。设计具有8位位宽的矢量或总线端口信号a,b以及标准一位输入的cin。然后在...
  • /无符号数乘法

    2021-08-03 14:22:06
    左移n位等于原来的二进制数乘以2的n次方。 比如00011010十进制是26,左移两位后是011010​00转成十进制是104恰好是26的4倍。 ps:这种倍数关系只适用于左移后被舍弃的高位不含1的情况,否则会溢出。​ 算 术右移n位...
  • 《四位二进制乘法器 c语言.doc》由会员分享,提供在线免费全文阅读可下载,此文档格式为doc,更多相关《四位二进制乘法器 c语言.doc》文档请在天天文库搜索。1、//四位二进制乘法器模拟#include #include /*******...
  • 二进制数的算术运算

    万次阅读 2019-10-27 11:24:54
    2, 二进制数的算术运算 2.1 二进制数的算术运算 二进制数的算术运算包括加法、减法、乘法和除法。 1)加法运算 加法进位规则:逢二进一。 加法运算法则: 0+0=0 0+1=1+0=1 1+1=10(向高位进位) 例:(1101)2+(1011)2=?...
  • 深入理解计算机系统中大概提到: 32位无符号相乘二进制补码乘的位级行为是一样的?也就是说 x*y==ux*uy x和y是有符号的 而ux和uy是无符号。 这个是怎么理解的。
  • 详解计算机内部存储数据的形式—二进制数 前言 要想对程序的运行机制形成一个大致印象,就要了解信息(数据)在计算机内部是以怎样的形式来表现的,又是以怎样的方法进行运算的。在 C 和 Java 等高级语言编写的 程序...
  • 详解计算机内部存储数据的形式—二进制数 前言 要想对程序的运行机制形成一个大致印象,就要了解信息(数据)在计算机内部是以怎样的形式来表现的,又是以怎样的方法进行运算的。在 C 和 Java 等高级语言编写的 程序...
  • Matlab下二进制运算

    2021-04-23 10:55:56
    ////////////////////////////////////////// unit uint8([]) uint16([]) uint64([]) dec2bin(一个十进制):将十进制转化为二进制 dec2hex(一个十进制):将十进制转化为十六进制 hex2dec十六进制转换为...
  • 3.3、指令系统对应微程序二进制代码及分析(4分) 3.4、机器程序及分析(4分) 四、实验步骤(4分) 4.1、微程序写入及校验(2分) 4.2、机器程序写入及校验(2分) 五、实验结果及分析(16分) 5.1、...
  • 零.... 1. :概念名,指代物体的多少,即物体的量的概念; 2. 值:概念属性,的值,...形式相对内涵(意义)而言,某种形式表示的符号需要人来解读才意义。十进制是人类自然而然形成的数值表示形式: a. 包...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,151
精华内容 6,060
关键字:

二进制有符号数相乘