2021-09-08

二进制运算原理

总结最近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 
   
  
 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.36687em; vertical-align: 0em;"></span><span class="mord cjk_fallback">扩</span><span class="mord cjk_fallback">展</span><span class="mord cjk_fallback">后</span><span class="mord cjk_fallback">位</span><span class="mord cjk_fallback">宽</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.66666em; vertical-align: -0.08333em;"></span><span class="mord cjk_fallback">被</span><span class="mord cjk_fallback">乘</span><span class="mord cjk_fallback">数</span><span class="mord cjk_fallback">位</span><span class="mord cjk_fallback">数</span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.77777em; vertical-align: -0.08333em;"></span><span class="mord cjk_fallback">乘</span><span class="mord cjk_fallback">数</span><span class="mord cjk_fallback">位</span><span class="mord cjk_fallback">宽</span><span class="mord mathdefault">b</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.72777em; vertical-align: -0.08333em;"></span><span class="mord">1</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.69444em; vertical-align: 0em;"></span><span class="mord cjk_fallback">符</span><span class="mord cjk_fallback">号</span><span class="mord cjk_fallback">位</span><span class="mord cjk_fallback">宽</span><span class="mord cjk_fallback">(</span><span class="mord">1</span><span class="mord mathdefault">b</span><span class="mord mathdefault">i</span><span class="mord mathdefault">t</span><span class="mord cjk_fallback">)</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.66666em; vertical-align: -0.08333em;"></span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.69444em; vertical-align: 0em;"></span><span class="mord mathdefault">b</span></span></span></span></span></span><br data-filtered="filtered"> 扩展时,对高位进行补充的方式和无符号数的运算不一样,需要依据符号进行补充,符号位为‘1’则高位补‘1’,符号位为‘0’则高位补‘0’。同样的以(1001)<sub>2</sub>和(0101)<sub>2</sub> 为例。乘数与被乘数均是4bits,扩展后不至于溢出的位数为4+4=8bits<br data-filtered="filtered"> 有符号数是以补码(正数的补码为其本身,负数的补码为其反码+1)的形式来表示的,则该数据的结果为:</p> 

     补
    
    
     码
    
    
     :
    
    
     1001
    
    
     =
    
    
     &gt;
    
    
     反
    
    
     码
    
    
     :
    
    
     0110
    
    
     =
    
    
     &gt;
    
    
     原
    
    
     码
    
    
     :
    
    
     0111
    
    
     (
    
    
     −
    
    
     7
    
    
     )
    
   
   
     补码:1001 =&gt;反码:0110=&gt;原码:0111 (-7) 
   
  
 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0em;"></span><span class="mord cjk_fallback">补</span><span class="mord cjk_fallback">码</span><span class="mord cjk_fallback">:</span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">1</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span></span><span class="base"><span class="strut" style="height: 0.5782em; vertical-align: -0.0391em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0em;"></span><span class="mord cjk_fallback">反</span><span class="mord cjk_fallback">码</span><span class="mord cjk_fallback">:</span><span class="mord">0</span><span class="mord">1</span><span class="mord">1</span><span class="mord">0</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span></span><span class="base"><span class="strut" style="height: 0.5782em; vertical-align: -0.0391em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.72777em; vertical-align: -0.08333em;"></span><span class="mord cjk_fallback">原</span><span class="mord cjk_fallback">码</span><span class="mord cjk_fallback">:</span><span class="mord">0</span><span class="mord">1</span><span class="mord">1</span><span class="mord">1</span><span class="mord cjk_fallback">(</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0em;"></span><span class="mord">7</span><span class="mord cjk_fallback">)</span></span></span></span></span></span></p> 

     补
    
    
     码
    
    
     :
    
    
     0101
    
    
     =
    
    
     &gt;
    
    
     原
    
    
     码
    
    
     :
    
    
     0101
    
    
     (
    
    
     5
    
    
     )
    
   
   
     补码:0101 =&gt;原码:0101 (5) 
   
  
 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0em;"></span><span class="mord cjk_fallback">补</span><span class="mord cjk_fallback">码</span><span class="mord cjk_fallback">:</span><span class="mord">0</span><span class="mord">1</span><span class="mord">0</span><span class="mord">1</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span></span><span class="base"><span class="strut" style="height: 0.5782em; vertical-align: -0.0391em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0em;"></span><span class="mord cjk_fallback">原</span><span class="mord cjk_fallback">码</span><span class="mord cjk_fallback">:</span><span class="mord">0</span><span class="mord">1</span><span class="mord">0</span><span class="mord">1</span><span class="mord cjk_fallback">(</span><span class="mord">5</span><span class="mord cjk_fallback">)</span></span></span></span></span></span></p> 

     乘
    
    
     法
    
    
     运
    
    
     算
    
    
     :
    
    
     −
    
    
     7
    
    
     ∗
    
    
     5
    
    
     =
    
    
     −
    
    
     35
    
   
   
     乘法运算:-7*5 = -35 
   
  
 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.66666em; vertical-align: -0.08333em;"></span><span class="mord cjk_fallback">乘</span><span class="mord cjk_fallback">法</span><span class="mord cjk_fallback">运</span><span class="mord cjk_fallback">算</span><span class="mord cjk_fallback">:</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0em;"></span><span class="mord">7</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0em;"></span><span class="mord">5</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.72777em; vertical-align: -0.08333em;"></span><span class="mord">−</span><span class="mord">3</span><span class="mord">5</span></span></span></span></span></span></p> 

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

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

     补
    
    
     码
    
    
     :
    
    
     11011101
    
    
     =
    
    
     &gt;
    
    
     反
    
    
     码
    
    
     :
    
    
     00100010
    
    
     =
    
    
     &gt;
    
    
     原
    
    
     码
    
    
     :
    
    
     00100011
    
   
   
     补码:11011101=&gt;反码:00100010=&gt;原码:00100011 
   
  
 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0em;"></span><span class="mord cjk_fallback">补</span><span class="mord cjk_fallback">码</span><span class="mord cjk_fallback">:</span><span class="mord">1</span><span class="mord">1</span><span class="mord">0</span><span class="mord">1</span><span class="mord">1</span><span class="mord">1</span><span class="mord">0</span><span class="mord">1</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span></span><span class="base"><span class="strut" style="height: 0.5782em; vertical-align: -0.0391em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0em;"></span><span class="mord cjk_fallback">反</span><span class="mord cjk_fallback">码</span><span class="mord cjk_fallback">:</span><span class="mord">0</span><span class="mord">0</span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">1</span><span class="mord">0</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span></span><span class="base"><span class="strut" style="height: 0.5782em; vertical-align: -0.0391em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0em;"></span><span class="mord cjk_fallback">原</span><span class="mord cjk_fallback">码</span><span class="mord cjk_fallback">:</span><span class="mord">0</span><span class="mord">0</span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">1</span><span class="mord">1</span></span></span></span></span></span></p> 

     结
    
    
     果
    
    
     为
    
    
     :
    
    
     (
    
    
     −
    
    
     1
    
    
     
      )
     
     
      1
     
    
    
     ∗
    
    
     (
    
    
     1
    
    
     ∗
    
    
     
      2
     
     
      5
     
    
    
     +
    
    
     1
    
    
     ∗
    
    
     
      2
     
     
      1
     
    
    
     +
    
    
     1
    
    
     ∗
    
    
     
      2
     
     
      0
     
    
    
     )
    
    
     =
    
    
     −
    
    
     35
    
   
   
     结果为:(-1)^1*(1*2^5+1*2^1+1*2^0)=-35 
   
  
 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1.11411em; vertical-align: -0.25em;"></span><span class="mord cjk_fallback">结</span><span class="mord cjk_fallback">果</span><span class="mord cjk_fallback">为</span><span class="mord cjk_fallback">:</span><span class="mopen">(</span><span class="mord">−</span><span class="mord">1</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.864108em;"><span class="" style="top: -3.113em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.947438em; vertical-align: -0.08333em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.864108em;"><span class="" style="top: -3.113em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">5</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0em;"></span><span class="mord">1</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.947438em; vertical-align: -0.08333em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.864108em;"><span class="" style="top: -3.113em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0em;"></span><span class="mord">1</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.864108em; vertical-align: 0em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.864108em;"><span class="" style="top: -3.113em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span></span></span></span></span><span class="mord cjk_fallback">)</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.72777em; vertical-align: -0.08333em;"></span><span class="mord">−</span><span class="mord">3</span><span class="mord">5</span></span></span></span></span></span></p> 

和我们乘法运算的结果相同。接下来我们再来验证 正数 * 正数,正数 * 负数, 负数 * 正数,负数 * 负数。验证方法的通用性,无需将数据分为政府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 
   
  
 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord">1</span><span class="mord">1</span><span class="mord">.</span><span class="mord">0</span><span class="mord">1</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right: 0.05017em;">B</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord">0</span><span class="mord">0</span><span class="mord">.</span><span class="mord">1</span><span class="mord">1</span><span class="mopen">(</span><span class="mord cjk_fallback">原</span><span class="mord cjk_fallback">码</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.72777em; vertical-align: -0.08333em;"></span><span class="mord">−</span><span class="mord">1</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 1.11411em; vertical-align: -0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mord">/</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.864108em;"><span class="" style="top: -3.113em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 1.11411em; vertical-align: -0.25em;"></span><span class="mord">1</span><span class="mord">/</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.864108em;"><span class="" style="top: -3.113em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.72777em; vertical-align: -0.08333em;"></span><span class="mord">−</span><span class="mord">0</span><span class="mord">.</span><span class="mord">7</span><span class="mord">5</span></span></span></span></span></span></p> 

     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 
   
  
 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">.</span><span class="mord">1</span><span class="mord">1</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right: 0.05017em;">B</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord">0</span><span class="mord">1</span><span class="mord">.</span><span class="mord">0</span><span class="mord">1</span><span class="mopen">(</span><span class="mord cjk_fallback">原</span><span class="mord cjk_fallback">码</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.72777em; vertical-align: -0.08333em;"></span><span class="mord">−</span><span class="mord">1</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.947438em; vertical-align: -0.08333em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.864108em;"><span class="" style="top: -3.113em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 1.11411em; vertical-align: -0.25em;"></span><span class="mord">1</span><span class="mord">/</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.864108em;"><span class="" style="top: -3.113em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.72777em; vertical-align: -0.08333em;"></span><span class="mord">−</span><span class="mord">1</span><span class="mord">.</span><span class="mord">2</span><span class="mord">5</span></span></span></span></span></span><br data-filtered="filtered"> 结果为:<br data-filtered="filtered"> <span class="katex--display"><span class="katex-display"><span class="katex"><span class="katex-mathml">
 
  
   
    
     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 
   
  
 </span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">.</span><span class="mord">1</span><span class="mord">1</span><span class="mord">1</span><span class="mord">1</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right: 0.05017em;">B</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">.</span><span class="mord">1</span><span class="mord">1</span><span class="mord">1</span><span class="mord">1</span><span class="mopen">(</span><span class="mord cjk_fallback">原</span><span class="mord cjk_fallback">码</span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.72777em; vertical-align: -0.08333em;"></span><span class="mord">+</span><span class="mord">1</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">∗</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 1.11411em; vertical-align: -0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mord">/</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.864108em;"><span class="" style="top: -3.113em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 1.11411em; vertical-align: -0.25em;"></span><span class="mord">1</span><span class="mord">/</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.864108em;"><span class="" style="top: -3.113em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 1.11411em; vertical-align: -0.25em;"></span><span class="mord">1</span><span class="mord">/</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.864108em;"><span class="" style="top: -3.113em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 1.11411em; vertical-align: -0.25em;"></span><span class="mord">1</span><span class="mord">/</span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height: 0.864108em;"><span class="" style="top: -3.113em; margin-right: 0.05em;"><span class="pstrut" style="height: 2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">4</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">9</span><span class="mord">3</span><span class="mord">7</span><span class="mord">5</span></span></span></span></span></span><br data-filtered="filtered"> 进而验证了该方法的正确性。<br data-filtered="filtered"> <img src="https://img-blog.csdnimg.cn/20200811171024710.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NjI2NDkz,size_16,color_FFFFFF,t_70" alt="在这里插入图片描述"></p> 

原理总结

到此就完成了对定点数的乘法运算,相比于上面文献的对于有符号定点数需要分符号进行分类运算,此补位截位的操作方法更加通用。详细的可以参考《深入理解计算机系统》的内容。
这里还有一篇博客可以参考,其中有一些简单的过程。
有符号二进制数的乘法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
);

<span class="token comment">//-----------------------------------------------</span>
<span class="token comment">//  扩展a,b</span>
reg   <span class="token punctuation">[</span><span class="token number">64</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">:</span><span class="token number">0</span><span class="token punctuation">]</span>  a_r<span class="token punctuation">,</span> b_r<span class="token punctuation">;</span>
always @ <span class="token punctuation">(</span>posedge clk or negedge rst_n<span class="token punctuation">)</span> begin
    <span class="token keyword">if</span><span class="token punctuation">(</span>rst_n <span class="token operator">==</span> <span class="token number">1</span>'b0<span class="token punctuation">)</span> begin 
        a_r <span class="token operator">&lt;=</span> <span class="token number">64</span>'h0000_0000_0000_0000<span class="token punctuation">;</span>
        b_r <span class="token operator">&lt;=</span> <span class="token number">64</span>'h0000_0000_0000_0000<span class="token punctuation">;</span>
    end
    <span class="token keyword">else</span> begin 
        a_r <span class="token operator">&lt;=</span> <span class="token punctuation">{<!-- --></span><span class="token punctuation">{<!-- --></span><span class="token number">32</span><span class="token punctuation">{<!-- --></span>a<span class="token punctuation">[</span><span class="token number">31</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">,</span> a<span class="token punctuation">[</span><span class="token number">31</span><span class="token punctuation">:</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
        b_r <span class="token operator">&lt;=</span> <span class="token punctuation">{<!-- --></span><span class="token punctuation">{<!-- --></span><span class="token number">32</span><span class="token punctuation">{<!-- --></span>b<span class="token punctuation">[</span><span class="token number">31</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token punctuation">,</span> b<span class="token punctuation">[</span><span class="token number">31</span><span class="token punctuation">:</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
    end
end

<span class="token comment">//--------------------------------------------------</span>
<span class="token comment">//  依位移位</span>
reg <span class="token punctuation">[</span><span class="token number">64</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">:</span><span class="token number">0</span><span class="token punctuation">]</span> ret_r <span class="token punctuation">[</span><span class="token number">64</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">:</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
integer i<span class="token punctuation">,</span> j<span class="token punctuation">,</span> k<span class="token punctuation">;</span>
always @ <span class="token punctuation">(</span>posedge clk or negedge rst_n<span class="token punctuation">)</span> 
    <span class="token keyword">if</span><span class="token punctuation">(</span>rst_n <span class="token operator">==</span> <span class="token number">1</span>'b0<span class="token punctuation">)</span>
        <span class="token keyword">for</span><span class="token punctuation">(</span>i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> <span class="token number">64</span><span class="token punctuation">;</span> i <span class="token operator">=</span> i<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span>
            ret_r<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">&lt;=</span> <span class="token number">64</span>'h0000_0000_0000_0000<span class="token punctuation">;</span>
    <span class="token keyword">else</span> 
        <span class="token keyword">for</span><span class="token punctuation">(</span>k <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> k<span class="token operator">&lt;</span><span class="token number">64</span><span class="token punctuation">;</span> k <span class="token operator">=</span> k <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span>
            <span class="token keyword">if</span><span class="token punctuation">(</span>b_r<span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span>
                ret_r<span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">&lt;=</span> <span class="token punctuation">(</span>a_r <span class="token operator">&lt;&lt;</span> k<span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword">else</span>
                ret_r<span class="token punctuation">[</span>k<span class="token punctuation">]</span> <span class="token operator">&lt;=</span>  <span class="token number">64</span>'h0000_0000_0000_0000<span class="token punctuation">;</span>
                

<span class="token comment">//---------------------------------------------------</span>
<span class="token comment">// 对结果求和 截位</span>
reg <span class="token punctuation">[</span><span class="token number">64</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">:</span><span class="token number">0</span><span class="token punctuation">]</span> sum<span class="token punctuation">;</span>
always @ <span class="token punctuation">(</span>posedge clk or negedge rst_n<span class="token punctuation">)</span> 
    <span class="token keyword">if</span><span class="token punctuation">(</span>rst_n <span class="token operator">==</span> <span class="token number">1</span>'b0<span class="token punctuation">)</span>
        sum <span class="token operator">&lt;=</span> <span class="token number">64</span>'h0000_0000_0000_0000<span class="token punctuation">;</span>
    <span class="token keyword">else</span> begin 
            sum <span class="token operator">&lt;=</span> ret_r<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">5</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">6</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">7</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">9</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">10</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">11</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">12</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">13</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">14</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">15</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">16</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">17</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">18</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">19</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">20</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">21</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">22</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">23</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">24</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">25</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">26</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">27</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">28</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">29</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">30</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">31</span><span class="token punctuation">]</span>
            <span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">32</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">33</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">34</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">35</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">36</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">37</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">38</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">39</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">40</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">41</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">42</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">43</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">44</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">45</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">46</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">47</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">48</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">49</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">50</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">51</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">52</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">53</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">54</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">55</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">56</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">57</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">58</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">59</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">60</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">61</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">62</span><span class="token punctuation">]</span><span class="token operator">+</span>ret_r<span class="token punctuation">[</span><span class="token number">63</span><span class="token punctuation">]</span><span class="token punctuation">;</span>    
    end 
    
assign  ret <span class="token operator">=</span> sum<span class="token punctuation">;</span>

endmodule

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

数据为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;
  
 
</span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord">1</span><span class="mord cjk_fallback">、</span><span class="mopen">(</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">.</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">8</span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right: 0.08125em;">H</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.83888em; vertical-align: -0.19444em;"></span><span class="mord">+</span><span class="mord">0</span><span class="mord">.</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">1</span><span class="mord">2</span><span class="mord">2</span><span class="mord">0</span><span class="mord">7</span><span class="mord">0</span><span class="mord">3</span><span class="mord">1</span><span class="mord">2</span><span class="mord">5</span><span class="mpunct">;</span></span></span></span></span><br data-filtered="filtered"> <span class="katex--inline"><span class="katex"><span class="katex-mathml">

 
  
   
    (
   
   
    f
   
   
    f
   
   
    f
   
   
    f
   
   
    .
   
   
    f
   
   
    f
   
   
    f
   
   
    8
   
   
    )
   
   
    H
   
   
    =
   
   
    −
   
   
    0.0001220703125
   
   
    ;
   
  
  
   (ffff.fff8)H =-0.0001220703125;
  
 
</span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord">.</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord">8</span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right: 0.08125em;">H</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.83888em; vertical-align: -0.19444em;"></span><span class="mord">−</span><span class="mord">0</span><span class="mord">.</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">1</span><span class="mord">2</span><span class="mord">2</span><span class="mord">0</span><span class="mord">7</span><span class="mord">0</span><span class="mord">3</span><span class="mord">1</span><span class="mord">2</span><span class="mord">5</span><span class="mpunct">;</span></span></span></span></span><br data-filtered="filtered"> <span class="katex--inline"><span class="katex"><span class="katex-mathml">

 
  
   
    结
   
   
    果
   
   
    :
   
   
    (
   
   
    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
  
 
</span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord cjk_fallback">结</span><span class="mord cjk_fallback">果</span><span class="mord cjk_fallback">:</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault">c</span><span class="mord">0</span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right: 0.08125em;">H</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.72777em; vertical-align: -0.08333em;"></span><span class="mord">−</span><span class="mord">1</span><span class="mord">.</span><span class="mord">4</span><span class="mord">9</span><span class="mord">0</span><span class="mord">1</span><span class="mord">1</span><span class="mord">6</span><span class="mord">1</span><span class="mord">1</span><span class="mord">9</span><span class="mord">3</span><span class="mord">8</span><span class="mord">4</span><span class="mord">7</span><span class="mord">6</span><span class="mord">5</span><span class="mord">6</span><span class="mord">2</span><span class="mord">5</span><span class="mord mathdefault">e</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0em;"></span><span class="mord">0</span><span class="mord">8</span></span></span></span></span><br data-filtered="filtered"> <span class="katex--inline"><span class="katex"><span class="katex-mathml">

 
  
   
    结
   
   
    果
   
   
    正
   
   
    确
   
  
  
   结果正确
  
 
</span><span class="katex-html"><span class="base"><span class="strut" style="height: 0em; vertical-align: 0em;"></span><span class="mord cjk_fallback">结</span><span class="mord cjk_fallback">果</span><span class="mord cjk_fallback">正</span><span class="mord cjk_fallback">确</span></span></span></span></span><br data-filtered="filtered"> <span class="katex--inline"><span class="katex"><span class="katex-mathml">

 
  
   
    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;
  
 
</span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord">2</span><span class="mord cjk_fallback">、</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord">5</span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right: 0.08125em;">H</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord">−</span><span class="mord">0</span><span class="mord">.</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">1</span><span class="mord">6</span><span class="mord">7</span><span class="mord">8</span><span class="mord">4</span><span class="mord">6</span><span class="mord">6</span><span class="mord">7</span><span class="mord">9</span><span class="mord">6</span><span class="mord">8</span><span class="mord">7</span><span class="mord">5</span><span class="mpunct">;</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord mathdefault" style="margin-right: 0.10764em;">f</span><span class="mord">6</span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right: 0.08125em;">H</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.83888em; vertical-align: -0.19444em;"></span><span class="mord">−</span><span class="mord">0</span><span class="mord">.</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">1</span><span class="mord">5</span><span class="mord">2</span><span class="mord">5</span><span class="mord">8</span><span class="mord">7</span><span class="mord">8</span><span class="mord">9</span><span class="mord">0</span><span class="mord">6</span><span class="mord">2</span><span class="mord">5</span><span class="mpunct">;</span></span></span></span></span><br data-filtered="filtered"> <span class="katex--inline"><span class="katex"><span class="katex-mathml">

 
  
   
    结
   
   
    果
   
   
    :
   
   
    (
   
   
    0000
   
   
    ,
   
   
    0000
   
   
    ,
   
   
    0000
   
   
    ,
   
   
    006
   
   
    e
   
   
    )
   
   
    H
   
   
    =
   
   
    2.56113708019257
   
   
    e
   
   
    −
   
   
    08
   
  
  
   结果:(0000,0000,0000,006e)H=2.56113708019257e-08
  
 
</span><span class="katex-html"><span class="base"><span class="strut" style="height: 1em; vertical-align: -0.25em;"></span><span class="mord cjk_fallback">结</span><span class="mord cjk_fallback">果</span><span class="mord cjk_fallback">:</span><span class="mopen">(</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right: 0.166667em;"></span><span class="mord">0</span><span class="mord">0</span><span class="mord">6</span><span class="mord mathdefault">e</span><span class="mclose">)</span><span class="mord mathdefault" style="margin-right: 0.08125em;">H</span><span class="mspace" style="margin-right: 0.277778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right: 0.277778em;"></span></span><span class="base"><span class="strut" style="height: 0.72777em; vertical-align: -0.08333em;"></span><span class="mord">2</span><span class="mord">.</span><span class="mord">5</span><span class="mord">6</span><span class="mord">1</span><span class="mord">1</span><span class="mord">3</span><span class="mord">7</span><span class="mord">0</span><span class="mord">8</span><span class="mord">0</span><span class="mord">1</span><span class="mord">9</span><span class="mord">2</span><span class="mord">5</span><span class="mord">7</span><span class="mord mathdefault">e</span><span class="mspace" style="margin-right: 0.222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right: 0.222222em;"></span></span><span class="base"><span class="strut" style="height: 0.64444em; vertical-align: 0em;"></span><span class="mord">0</span><span class="mord">8</span></span></span></span></span><br data-filtered="filtered"> <span class="katex--inline"><span class="katex"><span class="katex-mathml">

 
  
   
   - 结
   
   
    果
   
   
    正
   
   
    确
   
  
  
   结果正确
  
 
</span><span class="katex-html"><span class="base"><span class="strut" style="height: 0em; vertical-align: 0em;"></span><span class="mord cjk_fallback">结</span><span class="mord cjk_fallback">果</span><span class="mord cjk_fallback">正</span><span class="mord cjk_fallback">确</span></span></span></span></span><br data-filtered="filtered"> <mark>同样把数据作为32位有符号定点数,无小数位,结果同样正确,不多验证,直接对Vivado中Real值小数位进行设置即可。</mark></p> 

总结

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

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

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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值