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. JavaScript中的*top、*left、*width、*Height具体解释

    来源:http://www.ido321.com/911.html html代码 1: <body> 2: <div class="father" id=&quo ...

  2. struts2中action手动获取參数

    struts2中action手动获取Session,jsp页面參数 1. ActionContext 在Struts2开发中,除了将请求參数自己主动设置到Action的字段中,我们往往也须要在Acti ...

  3. index action分析

    上一篇从结构上分析了action的,本篇将以index action为例仔分析一下action的实现方式. 再概括一下action的作用:对于每种功能(如index)action都会包括两个基本的类* ...

  4. 根据点画线java

    package com.yang; import java.awt.Color; import java.awt.Graphics; import java.util.ArrayList; impor ...

  5. BZOJ3277: 串(后缀自动机,Parent树,Dfs序)

    Description 字符串是oi界常考的问题.现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中 至少k个字符串的子串(注意包括本身). Input 第一行两个整数n, ...

  6. Docker 内程序时间设置,很重要

    原文:Docker 内程序时间设置,很重要 重要!!!!! 创建容器时候需要修改一个参数,设置tomcat的时区 -e TZ="Asia/Shanghai" -v /etc/loc ...

  7. 【Codeforces Round #452 (Div. 2) B】Months and Years

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 闰,平,平 平,闰,平 平,平,闰 平,平,平 4种情况都考虑到就好. 可能有重复的情况. 但是没关系啦. [代码] #includ ...

  8. Java 学习(16):集合框架

    Java 集合框架 早在Java 2中之前,Java就提供了特设类.比如:Dictionary, Vector, Stack,  Properties 这些类用来存储和操作对象组. 虽然这些类都非常有 ...

  9. RHEL6安装调试过程中遇到的问题集

    /*** **问题集 2014/6/9 20:55:52** **Autor: Weigong Xu ** ***/ 1. Linux中开启22port: 22port是ssh服务的.你仅仅要启动ss ...

  10. .NET中StringBuilder用法实例分析

    string s1 = "33"; string s2 = "44"; string s3 = "55"; //需求是把s1 s2 s3拼接 ...