位数问题

a_width位的a,乘以B_width位的b,结果的位数是A_width + B_width。

定点小数问题

小数位数等于a的小数位数,加上b的小数位数之和。

补码相乘问题

  • 补码 * 补码 = 补码

  • 符号问题
    1、无符号数 * 无符号数 = 无符号数
    2、无符号数 * 有符号数 = 有符号数
    3、有符号数 * 无符号数 = 有符号数
    4、有符号数 * 有符号数 = 有符号数

    注意!上述符号关系仅适用于如下场景:
    定义unsigned类型的变量,且人为规定该变量的最高位为符号位。

    wire unsigned [3:0] data_a;  //data_a[3]表示符号位
    wire unsigned [3:0] data_b;  //data_b[3]表示符号位 	  
    assign data_a = 4'b1100;    //data_a = -4(当做有符号的负数)
    assign data_b = 4'b0100;	 //data_b = 4(当做有符号的正数,或无符号数)
    

算法原理

为什么有的加数要两个符号位?有的加数的不用补符号位,而是选择经过取反+1后的乘法结果?
比如最后一个有符号位的乘法,为啥第四个加数与其他三个加数的行为不一致??

解答上述问题需要先看一下二进制补码的一个重要特性:
算法分析
在这里插入图片描述
举个例子,-3 的二进制补码是100,所以我们在计算 100 所对应的十进制数值时:
在这里插入图片描述

这里-1表示符号位要用“负权重”,2^2的上标2表示该值要左移2位。

那么两个负数相乘时,我们以a×b = 1001×1100(即-7 × -4)为例说明:

在这里插入图片描述
在这里插入图片描述
1001*(-1)其实就是求1001取反加一,2^3就是乘完(-1)之后将乘积左移3位。同理,其余加数是:1001 * 1左位2位,1001 * 0左移1位,1001 * 0。
然后去看下边举例的case 3,很容易就可以和公式对应上了。

举例

case 0:无符号数 * 无符号数

在这里插入图片描述
另一个例子:
8*9

case 1:无符号数 * 有符号数

在这里插入图片描述
第四个加数——a先补最高位(0 0001),再连同最高位取反(1 1110)加一(1 1111),最后乘以b的符号位
结果的最高位是符号位

case 2:有符号数 * 无符号数

在这里插入图片描述
每个加数——都要补符号位
结果的最高位是符号位

case 3:有符号数 * 有符号数

在这里插入图片描述
前三个加数——都要补符号位
第四个加数——a先补符号位(1 1001),再连同符号位取反(0 0110)加一(0 0111),最后乘以b的符号位。
结果的最高位是符号位

参考资料

https://www.allaboutcircuits.com/technical-articles/multiplication-examples-using-the-fixed-point-representation/

这个博主写的非!常!清!晰!建议有需要的朋友细品!!!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐