Booth算法

算法描述(载自维基百科)


对于N位乘数Y,布斯算法检查其2的补码形式的最后一位和一个隐含的低位,命名为y-1,初始值为0。对于yi, i = 0, 1, ..., N - 1,考察yi和yi - 1。当这两位相同时,存放积的累加器P的值保持不变。当yi = 0且yi - 1 = 1时,被乘数乘以2i加到P中。当yi = 1且yi - 1 = 0时,从P中减去被乘数乘以2i的值。算法结束后,P中的数即为乘法结果。

该算法对被乘数和积这两个数的表达方式并没有作规定。一般地,和乘数一样,可以采用2的补码方式表达。也可以采用其他计数形式,只要支持加减法就行。这个算法从乘数的最低位执行到最高位,从i = 0开始,接下来和2i的乘法被累加器P的算术右移所取代。较低位可以被移出,加减法可以只在P的前N位上进行。

算法原理


请参考维基百科 布斯乘法算法

Verilog代码


Design code


module booth
#(
parameter MUT_WIDTH = 6,
parameter CNT_WIDTH = MUT_WIDTH/2
)
(
output reg [MUT_WIDTH - 1:0] A,
output reg [MUT_WIDTH - 1:0] Q,
output reg done, input clk,
input rst_n,
input [MUT_WIDTH:0] Qi,
input [MUT_WIDTH:0] M,
input start
); reg Q1;
reg [CNT_WIDTH - 1:0] cnt;
reg [CNT_WIDTH - 1:0] cnt_next;
reg [MUT_WIDTH - 1:0] Atemp; always@(posedge clk,negedge rst_n)
begin
if(!rst_n)
begin
A <= 0;
Q <= 0;
Q1 <= 1'b0;
done <= 1'b0;
end
else if(start)
begin
A <= 6'b0;
Q <= Qi;
Q1 <= 1'b0;
done <= 1'b0;
end
else if(cnt > 0)
{A,Q,Q1} <= {Atemp[MUT_WIDTH - 1],Atemp,Q};
else
done <= 1'b1;
end always@(*)
begin
if(!start && cnt >0)
begin
case({Q[0],Q1})
2'b10:Atemp = A - M;
2'b01:Atemp = A + M;
default: Atemp = A;
endcase
end
else
Atemp = 6'b0;
end always@(posedge clk,negedge rst_n)
begin
if(!rst_n)
cnt <= 0;
else if(start)
cnt <= MUT_WIDTH;
else
cnt <= cnt_next;
end always@(*)
begin
if(start)
cnt_next = cnt;
else if(cnt > 0)
cnt_next = cnt - 1'b1;
else
cnt_next = cnt;
end
endmodule endmodule

testbench


module booth_tb;
parameter n=12; wire [n-1:0] A;
wire [n-1:0] Q;
reg [n-1:0] Qi;
reg [n-1:0] M;
reg start;
wire done;
reg clk;
reg rst_n;
wire [2*n-1:0] result; booth #(.MUT_WIDTH(n),
.CNT_WIDTH(n/2)
)
u_booth(
.A(A),
.Q(Q),
.done(done), .clk(clk),
.rst_n(rst_n),
.Qi(Qi),
.M(M),
.start(start)
); initial
begin
clk=1'b1;
rst_n = 1'b0;
#20 rst_n = 1'b1; M=12;
Qi=-17;
#1 start=1;
#4 start=0;
#40 start=1; M=5;
Qi=-5;
#20 start=0;
#100 $finish;
end always
#1 clk=~clk; assign result={A,Q}; initial begin
$fsdbDumpfile("tb.fsdb");
$fsdbDumpvars;
end endmodule

仿真结果


参考资料


[1].布斯乘法算法

[2].Booth算法的硬件实现

[3].Booth算法

Booth算法的更多相关文章

  1. BOOTH 算法的简单理解

    学习FPGA时,对于乘法的运算,尤其是对于有符号的乘法运算,也许最熟悉不过的就是 BOOTH算法了. 这里讲解一下BOOTH算法的计算过程,方便大家对BOOTH的理解.        上图是BOOTH ...

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

    补码一位乘法 首先了解下什么是补码? 补码概念的理解,需要先从“模”的概念开始. 我们可以把模理解为一个容器的容量.当超出这个 容量时,会自动溢出.如:我们最常见到的时钟,其容量 是 12,过了 12 ...

  3. Booth算法: 补码一位乘法公式推导与解析

    以下讲解内容出自<计算机组成原理(第三版)>(清华大学出版社) 大二学生一只,我的计组老师比较划水,不讲公式推导,所以最近自己研究了下Booth算法的公式推导,希望能让同样在研究Booth ...

  4. 补码一位乘法 Booth算法 Java简易实现

    本文链接:https://www.cnblogs.com/xiaohu12138/p/11955619.html. 转载,请说明出处. 本程序为简易实现补码一位乘法,若代码中存在错误,可指出,本人会不 ...

  5. booth乘法器原理

    在微处理器芯片中,乘法器是进行数字信号处理的核心,同一时候也是微处理器中进行数据处理的wd=%E5%85%B3%E9%94%AE%E9%83%A8%E4%BB%B6&hl_tag=textli ...

  6. OpenRisc-42-or1200的ALU模块分析

    引言 computer(计算机),顾名思义,就是用来compute(计算)的.计算机体系结构在上世纪五六十年代的时候,主要就是研究如何设计运算部件,就是想办法用最少的元器件(那时元器件很贵),最快的速 ...

  7. SegmentFault 巨献 1024 程序猿游戏「红岸的呼唤」第三天任务攻略

    第三关也不是一般的难呐,那么继续写一下解题过程(第四关会是什么样呢?). 高速传送门:http://segmentfault.com/game/3 在用我想到的方法(booth算法.矩阵变换.各种CP ...

  8. 【重学计算机】计组D3章:运算方法与运算器

    1. 定点数运算及溢出 定点数加减法:减法化加法,用补码直接相加,忽略进位 溢出:运算结果超出了某种数据类型的表示范围 溢出检测方法:统一思想概括为正正得负或负负得正则溢出,正负或负正不可能溢出 方法 ...

  9. Verilog乘法器

    乘法器,不能用乘号直接表示,略坑呀 坑归坑,做还是要做的 思路:首先乘法分为有符号乘与无符号乘,所以建立两个module分别运算有符号与无符号.然后在总module中用case语句判断输出应赋的值. ...

随机推荐

  1. 移动GPU全解读(二)

    [编者按]:本文作者为爱搞机特约作者.技术达人"炮神"@ioncannon. 在上一篇移动GPU解读中,对移动GPU的架构.相关參数进行了介绍,本部分介绍的则是移动GPU的Shad ...

  2. Kali Linux下安装VMware Tools

    引言 Kali Linux是基于Debian的Linux发行版, 设计用于数字取证和渗透測试.安装Kali Linux非常easy,可是安装VMware Tools的过程就有点麻烦了,由于在安装中途会 ...

  3. 给指定的用户无需密码执行 sudo 的权限

    给指定的用户无需密码执行 sudo 的权限 cat /etc/passwd 可以查看所有用户的列表 w 可以查看当前活跃的用户列表 cat /etc/group 查看用户组 cat /etc/pass ...

  4. java三元表达式编程规范问题

    package day01; public class Program { public static void main(String[] args) {        // TODO Auto-g ...

  5. Linux下基于LDAP统一用户认证的研究

    Linux下基于LDAP统一用户认证的研究                   本文出自 "李晨光原创技术博客" 博客,谢绝转载!

  6. mobx项目创建 + mobx项目流程代码

    一. 安装mobx 1. react 安装并 reject抽离配置 1. 全局安装 create-react-app 这个脚手架 npm/cnpm i create-react-app -g yarn ...

  7. numpy_basic

    一.Numpy是什么 Numerical Python,数值的Python,补充了Python语言所欠缺的数值计算能力. Numpy是其它数据分析及机器学习库的底层库. Numpy完全标准C语言实现, ...

  8. JavaScript学习总结(2)——JavaScript数据类型判断

    最近做项目中遇到了一些关于javascript数据类型的判断处理,上网找了一下资料,并且亲自验证了各种数据类型的判断,在此做一个总结吧! 一.JS中的数据类型  1.数值型(Number):包括整数. ...

  9. 洛谷 P2097 资料分发1

    P2097 资料分发1 题目描述 有一些电脑,一部分电脑有双向数据线连接.如果一个电脑得到数据,它可以传送到的电脑都可以得到数据.现在,你有这个数据,问你至少将其输入几台电脑,才能使所有电脑得到数据. ...

  10. 10559 - Blocks(方块消除|DP)

    该题乍一看和矩阵链乘非常类似,但是有一个不同之处就是该题能够拼接 .   为了达到这个目的.我们不得不拓展维度d[i][j][k].用一个k表示最右边拼接了k个和a[j]同样颜色的方块. 问题的关键在 ...