Verilog实现有符号数乘法运算
二进制运算原理
总结最近FPGA的学习,使我明白了一件事:在Verilog程序的编写中,“位”(bit)这一概念,对于程序编写至关重要,Verilog代码中,数据运算均以位来操作,因此我觉得有必要认真研习一下二进制运算的基本过程和运算方法。
有符号二进制数的表示一般以二进制补码(two’s-complement)的形式来表示,有助于我们理解和编写底层二进制运算的程序。相信这对我们单片机和FPGA的学习将收益匪浅。
1、无符号二进制数(unsigned)乘法运算
1.1 无符号数常规运算
对于无符号数的乘法运算相对简单,直接通过移位后相加得到。这里我随意举个无符号数相乘的例子来说明运算法则,比如(1001)2 和(0101)2 相乘可以写成如下形式:
从上式可以看出,该运算和我们十进制的运算相差无几,在二进制运算中乘数(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
=
>
反
码
:
0110
=
>
原
码
:
0111
(
−
7
)
补码:1001 =>反码:0110=>原码: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">></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">></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
=
>
原
码
:
0101
(
5
)
补码:0101 =>原码: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">></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
=
>
反
码
:
00100010
=
>
原
码
:
00100011
补码:11011101=>反码:00100010=>原码: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">></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">></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节中已经验证过了,它是该补位截位运算法的特殊情况,负数 * 正数的情况已在上面验证,这里不赘述。
下面我们验证正数乘负数和负数乘负数。(下面的式子中不再写被截断舍去的数据位)
- 正数乘负数:
- 负数乘负数
最后我这里使用定点数进行运算,来验证其对于小数同样具有通用性,可用于定点数运算
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"><=</span> <span class="token number">64</span>'h0000_0000_0000_0000<span class="token punctuation">;</span>
b_r <span class="token operator"><=</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"><=</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"><=</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"><</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"><=</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"><</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"><=</span> <span class="token punctuation">(</span>a_r <span class="token operator"><<</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"><=</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"><=</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"><=</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)对所有移位的结果进行累加,得到乘法结果。
如有错误的地方还望多多指正
学习不总结等于没学,多做总结,共勉