名称:任意位宽Booth乘法器设计Verilog代码VIVADO仿真
软件:VIVADO
语言:Verilog
代码功能:
任意位宽Booth乘法器设计
乘数和被乘数均为?n?位(n的值在代码中使用参数配置),那么?Booth?算法的具体执行过程以下六个步骤:
(1)?设置一个?2n+1?位的?p?空间,并将初始化为?0;
(2)?将乘数填入?p[n:1]中;
(3)?从?p?空间的最低位依次开始向左扫描,每次扫描两位,并判断所扫描的两位二进制数为何种情况;
(4)?判断?p[2n]位,如果是逻辑?0?右移一位补?0,如果是逻辑?1?就右移一位补?1;
(5)?重复步骤(3) ,循环?n?次;
(6)?最终?p?空间的?p[2n:1]就是乘数和被乘数的乘积。
FPGA代码Verilog/VHDL代码资源下载:www.hdlcode.com
演示视频:
设计文档:
1. 工程文件
2. 程序文件
3. 仿真文件(testbench)
4. 仿真图
部分代码展示:
//假设乘数和被乘数均为?n?位,那么?Booth?算法的具体执行过程以下六个步骤:
//(1)?设置一个?2n+1?位的?p?空间,并将初始化为?0;
//(2)?将乘数填入?p[n:1]中;
//(3)?从?p?空间的最低位依次开始向左扫描,每次扫描两位,并判断所扫描的两位二进制
//数为何种情况;
//(4)?判断?p[2n]位,如果是逻辑?0?右移一位补?0,如果是逻辑?1?就右移一位补?1;
//(5)?重复步骤(3)?,循环?n?次;
//(6)?最终?p?空间的?p[2n:1]就是乘数和被乘数的乘积。
module?Multiplier_1024bit(mult_A,?mult_B,?mult_product);
parameter?n=1024;
input?[n-1:0]?mult_A;//输入乘数A
input?[n-1:0]?mult_B;//输入乘数B
output?[2*n-1:0]?mult_product;//乘积
reg?[2*n-1:0]?mult_product;
integer?Count;
reg?[2*n:0]?PA='d0,right='d0;//设置一个?2n+1?位的?p?空间
always?@?(mult_A?or?mult_B)
begin
PA[2*n:0]={1024'b0,mult_A,1'b0};?//将乘数填入?p[n:1]中=-----------------------
for(Count=0;Count<n;Count=Count+1)//循环n次
begin
?case(PA[1:0])
2'b10://-mult_B,右移一位(有符号数移位)
begin
???PA[2*n:n+1]=PA[2*n:n+1]?-?mult_B[n-1:0];//PA=PA-mult_B?;
???right[2*n:0]=(PA[2*n]==0)?{1'b0,PA[2*n:1]}:{1'b1,PA[2*n:1]};//判断?p[2n]位,如果是逻辑?0?右移一位补?0,如果是逻辑?1?就右移一位补?1
end
2'b01://+mult_B,右移一位(有符号数移位)
begin
PA[2*n:n+1]=PA[2*n:n+1]?+?mult_B[n-1:0];?//PA=PA+mult_B
点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=899
613