![v2-ad5224ea9b42824751137e2a0fa054a0_1440w.jpg?source=172ae18b](http://img-01.proxy.5ce.com/view/image?&type=2&guid=fc21ed57-fb2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-ad5224ea9b42824751137e2a0fa054a0_1440w.jpg?source=172ae18b)
一、数的表示及乘法的范围
对于n比特数B,其二进制数转换为有符号十进制整数的公式如下:
当B>=0,B的第n-1比特为0,则B可用下式表示:
![v2-cff5fbff4a615dfe0469e55a121e97d5_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=fc21ed57-fb2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-cff5fbff4a615dfe0469e55a121e97d5_b.jpg)
设n=4,“5”的二进制位为0101,则5 = 1*4 + 1*1。
当B<0时,B的第n-1比特为1,B已为补码表示。
![v2-dd2e9ef31409ac66fca83d34f44de779_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=fc21ed57-fb2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-dd2e9ef31409ac66fca83d34f44de779_b.jpg)
所以-|B|表示如下:
![v2-c4bca1ee219c11d6af86e0b26eab0f66_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=fc21ed57-fb2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-c4bca1ee219c11d6af86e0b26eab0f66_b.jpg)
综上所述,有符号数与无符号与十进制的转换表示可统一为如下格式:
![v2-c6cab67b2bae36e9cddaa6034b5733cf_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=fc21ed57-fb2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-c6cab67b2bae36e9cddaa6034b5733cf_b.jpg)
对于正数或0,Bn-1=0;对于负数,Bn-1=1;与上述结果一致。
对于n比特无符号数:
最小数:
![v2-ee7ffdfc15fca0601e40b87dcad8e8f4_b.png](http://img-01.proxy.5ce.com/view/image?&type=2&guid=fc21ed57-fb2f-eb11-8da9-e4434bdf6706&url=https://pic1.zhimg.com/v2-ee7ffdfc15fca0601e40b87dcad8e8f4_b.png)
最大数:
![v2-c982c64684878b4ce1fc2db92d60a656_b.png](http://img-02.proxy.5ce.com/view/image?&type=2&guid=fc21ed57-fb2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-c982c64684878b4ce1fc2db92d60a656_b.png)
对于n比特有符号数:
最小数:
![v2-63111eb473cfdaf53a4a4b3de0fe28df_b.png](http://img-01.proxy.5ce.com/view/image?&type=2&guid=fc21ed57-fb2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-63111eb473cfdaf53a4a4b3de0fe28df_b.png)
最大数:
![v2-c48937e43285c4f073b7fc6960fb02db_b.png](http://img-03.proxy.5ce.com/view/image?&type=2&guid=fc21ed57-fb2f-eb11-8da9-e4434bdf6706&url=https://pic4.zhimg.com/v2-c48937e43285c4f073b7fc6960fb02db_b.png)
从上式可以看出,n比特乘法,输出位宽2n比特,无论有符号数相乘还是无符号数相乘均不会产生溢出。
二、乘法竖式计算
我们先来做一道小学数学题,A=5,B=12,求A*B的结果;
相信你很快就列出了乘法竖式并得出5*12=60的结果。让我们看下计算机如何计算?
5的二进制位为(0101),12的二进制位(1100),按照二进制我们列出其竖式如下:
![v2-9e6c01e8c3a9ec9cff85c5c82308ac86_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=fc21ed57-fb2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-9e6c01e8c3a9ec9cff85c5c82308ac86_b.jpg)
将结果(111100)转化为10进制,结果依然为60,以上是无符号数竖式计算,有符号数乘法二进制竖式计算请参考以下思考题。
思考题:A=-5,B=12,求A*B的结果,请列出其二进制竖式。
三、乘累加乘法器
乘法器的本质为加法器的累加和。乘累加乘法器,通过乘->移位->累加的方式,通过多次加法求和的方式计算结果。从上述竖式可以看出,B的每一位比特与A相乘后进行移位,最后按列相加,结果表示如下,其中i为比特序号,n为位宽:
![v2-34aa24718630db96714075ffaadec461_b.jpg](http://img-02.proxy.5ce.com/view/image?&type=2&guid=fc21ed57-fb2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-34aa24718630db96714075ffaadec461_b.jpg)
其展开的结构如下:
![v2-1d061bccc424b962fc9a2c9f9b353505_b.jpg](http://img-03.proxy.5ce.com/view/image?&type=2&guid=fc21ed57-fb2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-1d061bccc424b962fc9a2c9f9b353505_b.jpg)
以上结构使用了n-1个n比特加法器,将耗费大量的资源;所以有使用如下串行结构的乘法器。
![v2-4cf6b6c17f845677a07101d638377b01_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=fc21ed57-fb2f-eb11-8da9-e4434bdf6706&url=https://pic2.zhimg.com/v2-4cf6b6c17f845677a07101d638377b01_b.jpg)
该串行结构乘法器使用一个加法器,由控制逻辑和输入数寄存器A,B组成,此种结构多种多样,基本原理均在于移位加。一个16位乘法器,n=16,乘累加次数为16,由Sum作为中间数暂存,Bi作为控制A是否被加入到Sum中,且每次A向左移位1比特,A*B输出比特位宽32。
串行乘法器时间延迟大,但面积消耗小。
在Verilog设计中,直接使用“*”即可以,用好signed和unsigned关键字。
或者根据上述原理,也可以设计自己的“*”符号。
下期预告:阵列乘法器
欢迎批评指正,更多阅读,关注“纸上谈芯”,不定期更新,共同学习:
![v2-5f62185ff9e8ffa46f3fb9ea3eb90cba_b.jpg](http://img-01.proxy.5ce.com/view/image?&type=2&guid=fc21ed57-fb2f-eb11-8da9-e4434bdf6706&url=https://pic3.zhimg.com/v2-5f62185ff9e8ffa46f3fb9ea3eb90cba_b.jpg)