原创 【数字IC】高级数字 IC 设计(6)Booth 乘法器设计

2023-3-18 21:34 134 0 分类: FPGA/CPLD 文集: 数字IC

乘法器想必大家都知道是干什么用的,普通的乘法器的实现是基于乘法可以转换成加法这一事实。比如 3×4 实际上可以理解成 3 个 4 相加。

笔者翻遍资料发现主要就是如下的三种类型的乘法器:

    普通类型的乘法器:主要体现用加法计算乘法的思想,引入“乘法计算”这一概念。

    LUT乘法器:主要体现FPGA设计中用空间换时间的思想。

    Booth乘法器(包括ModifiedBooth乘法器):主要体现硬件设计中位操作的优良特性。

本文给大家分享一下Booth乘法器的代码部分。

 基 4 RTL 代码

Plaintext
`timescale 1ns / 1ps


module Mul_Booth(
clk,a,b,product
);
input clk;
input [7:0] a;
input [7:0] b;
output [15:0] product;


reg [3:0] Booth4,Booth3,Booth2,Booth1;
wire [15:0] product1,product2,product3,product4;
wire [7:0] fb;
wire [8:0] fbb;
/*-----------------//基4 Booth 编码表----------------*/
always @(posedge clk) begin
case(a[7:5])
3'b000:Booth4=0;//0
3'b001:Booth4=1;//1
3'b010:Booth4=1;//1
3'b011:Booth4=2;//2
3'b100:Booth4=4;//-2
3'b101:Booth4=3;//-1
3'b110:Booth4=3;//-1
default:Booth4=0;//0
endcase
end
always @(posedge clk) begin
case(a[5:3])
3'b000:Booth3=0;
3'b001:Booth3=1;
3'b010:Booth3=1;
3'b011:Booth3=2;
3'b100:Booth3=4;
3'b101:Booth3=3;
3'b110:Booth3=3;
default:Booth3=0;
endcase
end
always @(posedge clk) begin
case(a[3:1])
3'b000:Booth2=0;
3'b001:Booth2=1;
3'b010:Booth2=1;
3'b011:Booth2=2;
3'b100:Booth2=4;
3'b101:Booth2=3;
3'b110:Booth2=3;
default:Booth2=0;
endcase
end
always @(posedge clk) begin
case({a[1:0],1'b0})
3'b000:Booth1=0;
3'b001:Booth1=1;
3'b010:Booth1=1;
3'b011:Booth1=2;
3'b100:Booth1=4;
3'b101:Booth1=3;
3'b110:Booth1=3;
default:Booth1=0;
endcase
end
/*--------------------部分积相加--------------------*/
assign product=product1+(product2<<2)+(product3<<4)+(product4<<6);


BuFenJi p1(.clk(clk),.Booth(Booth1),.b(b),.product(product1),.fb(fb),.fbb(fbb));
BuFenJi p2(.clk(clk),.Booth(Booth2),.b(b),.product(product2),.fb(fb),.fbb(fbb));
BuFenJi p3(.clk(clk),.Booth(Booth3),.b(b),.product(product3),.fb(fb),.fbb(fbb));
BuFenJi p4(.clk(clk),.Booth(Booth4),.b(b),.product(product4),.fb(fb),.fbb(fbb));


endmodule

 

Plaintext
`timescale 1ns / 1ps


module BuFenJi(
clk,Booth,b,product,fb,fbb
);
input clk;
input [3:0] Booth;
input [7:0] b;
output reg [15:0] product;
output wire [7:0] fb;
output wire [8:0] fbb;
/*-----------------//针对基4 Booth 编码表操作----------------*/
always @(posedge clk) begin
case(Booth)
3'd0:product=16'b0;
3'd1:begin
if(b[7]) product={8'b11111111,b[7:0]};
else product={8'b00000000,b[7:0]};end
3'd2:begin
if(b[7]) product={7'b1111111,b[7:0],1'b0};
else product={7'b0000000,b,1'b0};end
3'd4:begin
if(!b[7]) product={7'b1111111,fbb[8:0]};
else product={7'b0000000,fbb[8:0]};end//-2
default:begin
if(!b[7]) product={8'b11111111,fb[7:0]};
else product={8'b00000000,fb[7:0]};end
endcase
end
/*-----------------对于-1、-2事先求反加1----------------*/
assign fb =(~b[7:0]+8'b00000001);
assign fbb=~{b[7:0],1'b0}+1'b1;


endmodule

基 2 RTL 代码

Plaintext
`timescale 1ns / 1ps


module Multi_Booth(
clk,rst,a,b,result
);
input clk;
input rst;
input [WIDTH-1:0] a,b;
output [2*WIDTH-1:0] result;
parameter WIDTH=4;
reg [WIDTH-1:0] temp1,temp2;
reg tempq,nd;
reg [3:0] i;
assign result={temp2,temp1};
always @(posedge clk or negedge rst) begin
if(!rst)begin
temp1<=a;temp2<=0;tempq<=0;nd<=0;i<=0;end
else begin
if(i
if(!nd)
case({temp1[0],tempq})
2'b01:begin temp2<=temp2+b;nd<=1;end
2'b10:begin temp2<=temp2-b;nd<=1;end
default:begin
{temp2,temp1,tempq}<={temp2[WIDTH-1],temp2,temp1};
i<=i+1;
end
endcase
else begin
{temp2,temp1,tempq}<={temp2[WIDTH-1],temp2,temp1};
nd<=0;
i<=i+1;
end
end
end
end
endmodule

 

文章评论0条评论)

登录后参与讨论
相关推荐阅读
责任全在软件 2023-03-19 20:38
发福利|盘点下ICer常用的8个宝藏工具
本文详细地总结了各式各样的宝藏工具,对于不同的技术开发具有较好的实用性、高效性、集成性,希望能够协助数字芯片设计爱好者们完成一些核心的开发工作。另外,文末给出了 21 各宝藏工具详细全称、主题领域、应...
责任全在软件 2023-03-18 22:19
【数字IC】高级IC程序设计(18)关于 FPGA 设计知识的一百问
Verilog和 C 语言有点像,容易混淆,注意区分。 先有电路,再写代码;写完代码,打开电路。 (RTL && Schematic)。 Do 文件为自动化仿真。(do sim.do)。...
责任全在软件 2023-03-18 22:07
【数字IC】高级IC程序设计(17)SoC 的卷积神经网络车牌识别系统设计
对于《基于 SoC 的卷积神经网络车牌识别系统设计》的设计总览,可以参考上一篇文章《基于 SoC 的卷积神经网络车牌识别系统设计(1)引言》。接下来,就大概讲一下整体的设计流程,主要分为系统的搭建和车...
责任全在软件 2023-03-18 22:06
【数字IC】高级IC程序设计(16)选择器
在数字 IC 设计中,有时候需要从一组输入数据中挑出某一个数据出来,比如,输入有 “A、B、C、D” 四个数据,我们需要在特定的条件和特定的时刻输出特定的数据,如何输出特定的数据就是 “选择开关” ;...
责任全在软件 2023-03-18 22:04
【数字IC】高级IC程序设计(15)比较器
在数字 IC 设计中,总是需要对一些数据进行大小的比较,例如比较两个或者三个以上的数据的大小,接着进行排序,最终输出等等。于是,比较器(Comparator)的数字逻辑电路就应运而生。 基于 8 位...
责任全在软件 2023-03-18 22:03
【数字IC】高级IC程序设计(14)加法器
加法器(Adder)是非常重要的,它不仅是其它复杂算术运算的基础,也是 CPU 中 ALU 的核心部件(全加器)。在数字计算机中,两个二进制数之间的算术逻辑运算(加、减、乘、除),基本上都是化成若干步...
我要评论
0
0
1
2
3
4
5
6
7
8
9
0
关闭 热点推荐上一条 /4 下一条