七日杀有没有手机版:Booth算法笔记_verilog(布斯算法)
来源:百度文库 编辑:偶看新闻 时间:2024/04/29 17:17:04
参考程序下载:Booth_mul4_v
Booth
(基于"改良"Booth算法的4位乘法器笔记见:hi.baidu.com/hlyrm/blog/item/2b9a4342760d771b73f05d04.html,http://hi.baidu.com/hlyrm/blog/item/0a5fa72b891bb6305343c105.html)
先补充一下这次写这个又巩固了的= =||
无符号数->
有符号数->
寄存器类型的值可取负数,
而booth
Booth
Booth
设y=y0,yly2…yn为被乘数,x为乘数,yi是a中的第i位(当前位).操作的方式取决于表达式(yi+1-yi)的值,这个表达式的值所代表的操作为:
0 无操作
+1 加x
-1 减x
流程图(
给出懂哥的verilog
确实写得丑陋啊…
并且遇到过的问题就是变量不能在多个always里赋值,并且加深了多次赋值可能导致的冲突理解
module mul_4(
clk,
res_n,
mul1,
mul2,
result);
parameter width=4'd4;
input clk,res_n;
input [width-1:0]mul2,mul1;//
output [2*width-1:0]result;//
wire [2*width-1:0]result;
reg [width-1:0] R0,R1,R2;//result={R0,R1},multiplier=R2
reg P;
reg ns;
assign result={R0,R1};
always@(posedge clk or negedge res_n)
begin
if(!res_n)
begin
R0<=0;
R1<=mul1;
R2<=mul2;
P<=1'b0;
ns<=0;
end
else
begin
if(!ns)
begin
case({R1[0],P})
2'b01:
begin
R0<=(R0+R2);ns<=1;
end
2'b10:
begin
R0<=(R0-R2);ns<=1;
end
default:
{R0,R1,P}<={R0[width-1],R0,R1};
endcase
end
else
begin
{R0,R1,P}<={R0[width-1],R0,R1};
ns<=0;
end
end
end
endmodule
然后就是testbench
`timescale 1ns/1ns
module t_mul_4;
parameter width=4'd4;
reg clk,res_n;
reg[width-1:0]mul1,mul2;
wire[2*width-1:0]result;
mul_4 t(clk,res_n,mul1,mul2,result);
initial
begin
clk=0;
res_n=1'b1;
mul1=4'b0111;
mul2=4'b1101;
#5 res_n=0;
#5 res_n=1'b1;
#80 $stop;
end
always #5 clk=~clk;
endmodule
设置两个乘数分别是4’b0111(4’d7),4’b1101(-4’d3)
仿真波形如图
看着波形就更好分析和理解整个过程了(R2=1101)
R0 R1 P
0000 0111 0
0011 0111 1 R0<=R0-R2
0001 1011 1
0000 1101 1
0000 0110 1
1101 0110 1 R0<=R0+R2
1110 1011 1
嗯,
废话:
嗯,
没有关系的.