booth算法实现乘法器

booth算法充分的利用到了补码的重要性,使得我们在利用补码进行计算时减少了很多时序。下面的表格是我们假设2 作为乘数所进行的分析。接下来,我将用代码向大家阐述。

1、开始的时候在乘数2的‘负一位’加上一个默认0值 00100
 2、先判断[0:-1],结果是2‘b00,表示’0‘ 即没有操作 00100
 3、判断[1:0] 结果是2’b10,表示‘1’即‘-被乘数’操作 00100          
  4、判断【2:1】结果是2‘b10,表示’1‘即’+被乘数‘操作 00100
 5、判断【3:2】 结果是2’b00,表示‘0’即无操作 00100

本次试验进行两个八位数的乘法运算。

[email protected](posedge clk or negedge rst_n)
if(!rst_n )
begin
i<=4‘b0;
a<=8‘b0;
b<=8‘b0;
s<=8‘b0;
p<=17‘b0;
X<=4‘b0;
isDone<=1‘b0;
end
else if(Start_sig)
case(i)
0:
begin
a<=A;
s<=(~A+1‘b1);
p<={8‘d0,B,1‘b0};
i<=i+1‘b1;
end
1:
if(X==8)
begin
X<=4‘d0;
i<=i+4‘d2;
end
else if(p[1:0]==2‘b01)
begin
p<={p[16:9]+a,p[8:0]};
i<=i+1‘b1;
end
else if(p[1:0]==2‘b10)
begin
p<={p[16:9]+s,p[8:0]};
i<=i+1‘b1;
end
else i<=i+1‘b1;
2:
begin
p<={p[16],p[16:1]};
X<=X+1‘b1;
i<=i+1‘b1;
end
3:
begin
isDone<=1‘b1;
i<=i+1‘b1;
end
4:
begin
i<=3‘b0;
isDone<=1‘b0;
end
endcase

以上是核心代码,这里我们将被乘数A放入两个寄存器中,一个存储源数据a,一个存储补码s。将乘数B放入p空间中,进行移位操作。

同时设置移位计数器X,当达到8位时停止执行。否则,我们将对数据的末两位进行判断如果p[1:0]是10,则对p[16:9]+s,低八位保持,如果p[1:0]=01,则进行p[16:9]+a,低八位保持。其余的全部保持。

在下一步中,进行移位操作,首位是什么就补什么,将数据进行右移。我们通过测试文件可以看到结果。

时间: 2024-10-14 04:43:14

booth算法实现乘法器的相关文章

BOOTH 算法的简单理解

学习FPGA时,对于乘法的运算,尤其是对于有符号的乘法运算,也许最熟悉不过的就是 BOOTH算法了. 这里讲解一下BOOTH算法的计算过程,方便大家对BOOTH的理解.        上图是BOOTH算法的数学表达.由于FPGA擅长进行并行移位计算,所以BOOTH算法倒也好实现. 上图是对乘数的加码过程,具体可以见下面的例子. 7 x (-3),其中R1表示被乘数 7, R2 表示乘数 -3,那么二者对应的补码,为 R1 0111,R2 1101, P代码最终结果容量,应该为 2x 4 + 1

补码一位乘法(Booth算法,C语言实现)

补码一位乘法 首先了解下什么是补码? 补码概念的理解,需要先从“模”的概念开始. 我们可以把模理解为一个容器的容量.当超出这个 容量时,会自动溢出.如:我们最常见到的时钟,其容量 是 12,过了 12 点之后,就会变为 1 点, 2 点……也就是 说,超过12的部分将被丢弃.那么,在这个例子当中,时钟 的模就是12.模的概念可以帮助我们理解补码的含义. 补码的引出:假设现在时钟的时针指向 4 点的位 置,要使其指向 3 点,可以怎么操作呢?很明显,共有 2 种方法,顺时针拨 11 格(+11),

Booth算法(有符号数的乘法)

求 M3M2M1M0×Q3Q2Q1Q0 :  0110×0101  (有符号数用补码表示,最高位表示正负) 1.添加辅助位:A=0000     Q-1=0 2.控制逻辑判断: ①Q0Q-1=01 时:A=A+M 然后 A.Q.Q-1算术右移 (两步) ②Q0Q-1=10 时:A=A-M  然后 A.Q.Q-1算术右移 (两步) 补码加减:(A-M)补码=A补码+(-M)补码 ③Q0Q-1=00或11 时:A.Q.Q-1算术右移 (一步) 补码右移:空位填1 3.Q有几位就做几次右移运算.(如:

[计算机组成原理] Booth算法 —— 补码一位乘法

x * y = z 运算规则: 1.和原码一位乘法不同,补码一位乘法的符号位是参加运算的,且运算结果和所有参加运算的数都是补码形式. 2.乘数 x 取双符号位参与运算,部分积的初始值为0: 乘数 y 取单符号位参与运算. 3.乘数 y 首先在末尾添加一个辅助位 0 ,每次讨论都是取 y 的最后两位,但每次移动仅移动一位. 4.判断 y 的最后两位是规则如下: 00 或者 11 时,直接右移一位: 01 时,先加 x 的补,然后右移一位: 10 时,先加 -x 的补,然后右移一位. 5.有个特例,

booth乘法器原理

在微处理器芯片中,乘法器是进行数字信号处理的核心,同时也是微处理器中进行数据处理的关键部件.乘法器完成一次操作的周期基本上决定了微处理器的主频.乘法器的速度和面积优化对于整个CPU的性能来说是非常重要的.为了加快乘法器的执行速度,减少乘法器的面积,有必要对乘法器的算法.结构及电路的具体实现做深入的研究. Booth算法与乘法器的一般结构 乘法器工作的基本原理是首先生成部分积,再将这些部分积相加得到乘积.在目前的乘法器设计中,基4Booth算法是部分积生成过程中普遍采用的算法.对于N位有符号数乘法

乘法器verilog实现

今天重新补习了一下二进制原码,反码和补码之间的关系以及正数变负数,负数变正数之间的关系.瞬间感觉好晕,赶紧仔细研究: 原码就是符号位加上真值的绝对值.正数原码是其本身,负数符号位为1. 正数的反码和补码都是其本身,负数反码为符号位不变,其余各位依次取反:补码为符号位不变,其余各位依次取反后加1. 这都好理解,那一个正数怎么变为负数呢? 注意计算机内存储负数是其补码形式! 正数取反后加1就得到负数(其实是负数的补码),例如:7二进制为0111:取反后为1000:然后+1为1001=(-7)补码.

verilog乘法器的设计

在verilog编程中,常数与寄存器变量的乘法综合出来的电路不同于寄存器变量乘以寄存器变量的综合电路.知乎里的解释非常好https://www.zhihu.com/question/45554104,总结乘法器模块的实现https://blog.csdn.net/yf210yf/article/details/70156855 乘法的实现是移位求和的过程 乘法器模块的实现主要有以下三种方法 1.串行实现方法 占用资源最多,需要的时钟频率高些,但是数据吞吐量却不大 两个N位二进制数x.y的乘积用简

串行乘法与并行乘法

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 串行乘法 OR1200中串行乘法采用的是"移位--加"迭代算法,这种算法借鉴了手工计算乘法的过程,对于二进制乘法,比如:1101*1011,手工计算过程如图8.1所示. 图8.1 手工计算二进制乘法的过程 从图中可知手工计算时会将被乘数与乘数中每一位依次相乘,最后将所有的乘积项一并相加.这种方法速度快,但是用硬件实现时,会耗费较多硬件资源."移位--加"迭代算法对此作了修改:每算出一乘积项,就加到乘

中国石油大学胜利学院15级软件工程计算机组成原理复习提纲(上)

第一章 绪论 计算机的性能指标 吞吐量 相应时间 利用率 处理机字长 总线宽度 存储器容量 存储器带宽 主频 第二章 计算机中数据信息表示法 数值转换 数的编码表示 原码:符号位数值化,数值位不变 (1)       零的原码表示不唯一(有+0和-0) (2)       原码的表示范围: 1)  整数范围:-127<=x<=127 2)  小数范围:-(1-2-7 )<= x <=1-2-7 补码: (1)       正数:原反补表示相同 (2)       负数:对原码,符号