Booth算法
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算法的更多相关文章
- BOOTH 算法的简单理解
学习FPGA时,对于乘法的运算,尤其是对于有符号的乘法运算,也许最熟悉不过的就是 BOOTH算法了. 这里讲解一下BOOTH算法的计算过程,方便大家对BOOTH的理解. 上图是BOOTH ...
- 补码一位乘法(Booth算法,C语言实现)
补码一位乘法 首先了解下什么是补码? 补码概念的理解,需要先从“模”的概念开始. 我们可以把模理解为一个容器的容量.当超出这个 容量时,会自动溢出.如:我们最常见到的时钟,其容量 是 12,过了 12 ...
- Booth算法: 补码一位乘法公式推导与解析
以下讲解内容出自<计算机组成原理(第三版)>(清华大学出版社) 大二学生一只,我的计组老师比较划水,不讲公式推导,所以最近自己研究了下Booth算法的公式推导,希望能让同样在研究Booth ...
- 补码一位乘法 Booth算法 Java简易实现
本文链接:https://www.cnblogs.com/xiaohu12138/p/11955619.html. 转载,请说明出处. 本程序为简易实现补码一位乘法,若代码中存在错误,可指出,本人会不 ...
- booth乘法器原理
在微处理器芯片中,乘法器是进行数字信号处理的核心,同一时候也是微处理器中进行数据处理的wd=%E5%85%B3%E9%94%AE%E9%83%A8%E4%BB%B6&hl_tag=textli ...
- OpenRisc-42-or1200的ALU模块分析
引言 computer(计算机),顾名思义,就是用来compute(计算)的.计算机体系结构在上世纪五六十年代的时候,主要就是研究如何设计运算部件,就是想办法用最少的元器件(那时元器件很贵),最快的速 ...
- SegmentFault 巨献 1024 程序猿游戏「红岸的呼唤」第三天任务攻略
第三关也不是一般的难呐,那么继续写一下解题过程(第四关会是什么样呢?). 高速传送门:http://segmentfault.com/game/3 在用我想到的方法(booth算法.矩阵变换.各种CP ...
- 【重学计算机】计组D3章:运算方法与运算器
1. 定点数运算及溢出 定点数加减法:减法化加法,用补码直接相加,忽略进位 溢出:运算结果超出了某种数据类型的表示范围 溢出检测方法:统一思想概括为正正得负或负负得正则溢出,正负或负正不可能溢出 方法 ...
- Verilog乘法器
乘法器,不能用乘号直接表示,略坑呀 坑归坑,做还是要做的 思路:首先乘法分为有符号乘与无符号乘,所以建立两个module分别运算有符号与无符号.然后在总module中用case语句判断输出应赋的值. ...
随机推荐
- iOS 创建静态库文件时去掉当中的Symbols
在project中创建静态库文件时.默认会将一些Symbols加到静态库文件里.这样做有两个缺点: 1.假设引用静态库文件的project中发生了bug.就会直接跳转到静态库的源代码. 也许有人问:静 ...
- 设计模式(7)-结构型模式-Bridge模式
2.结构性模式 2.2 BRIDGE模式 别名:handle/body 这个模式体现了组合相对于继承的优势. 2.2.1动机 当一个抽象可能有多个实现时,通经常使用继承来协调它们.抽象类定义对该抽象 ...
- RelativeLayout-属性大全
// 相对于给定ID控件 <!--将该控件的底部置于给定ID的控件之上--> android:layout_above <!--将该控件的底部置于给定ID的控件之下--> an ...
- HDU 1007 Quoit Design 平面内最近点对
http://acm.hdu.edu.cn/showproblem.php?pid=1007 上半年在人人上看到过这个题,当时就知道用分治但是没有仔细想... 今年多校又出了这个...于是学习了一下平 ...
- 如何在实际项目中使用Promise(入门级)
你们有没有遇到过这样的情况,ES6看过了,Promise的文字概念都懂,但是我要怎么在项目中去写一个Promise呢? 那天我就是带着这样的疑问去网上搜了下.最后成功地在项目中应用了Promise,只 ...
- xml数据文件上传至数据库
上传xml文件数据到数据库思路:首先上传需要建校验xml字段的校验文件,然后程序根据后台写好的xml数据文件路径自动读取数据文件,再上传数据文件到数据库之前先根据校验文件校验上传的数据文件的字段是否合 ...
- CODEVS——T1979 第K个数
http://codevs.cn/problem/1979/ 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descript ...
- 洛谷 P2819 图的m着色问题
P2819 图的m着色问题 题目背景 给定无向连通图G和m种不同的颜色.用这些颜色为图G的各顶点着色,每个顶点着一种颜色.如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的.图的 ...
- Thinkphp5创建控制器
今天我们就来创建一个控制器: <?php namespace app\index\controller; use think\Controller; class Test extends Con ...
- VC6.0调试知识大全
VC6.0调试知识大全 分类: C++ 2010-09-06 21:33 7080人阅读 评论(5) 收藏 举报 debuggingmfcfunctionmenumicrosoftdll My Not ...
