前言
对于串行乘法器的实现大多都是采用移位操作来实现的。用公式表示为P=xy=∑xk2ky。
一、verilog代码
1.仿真代码
代码如下(示例):
module multiplier(clk,x,y,p);
input clk = 0;
input [7:0]x;
input [7:0]y;
output reg[15:0]p;
parameter s0 =0,s1 =1,s2 =2;
reg [2:0] count = 0;
reg [1:0] state = 0;
reg [15:0] p1,t;
reg [7:0]y_reg;
always @(posedge clk)begin
case(state)
s0:begin
y_reg <= y;
count <= 0;
p1 <= 0;
t<= {{8{x[7]}},x};
state <= s1;
end
s1:begin
if(count==7)
state <= s2;
else
begin
if(y_reg[0]==1)
p1<= p1 + t;
y_reg <= y_reg>>1;
t= t<<1;
count <= count +1;
state <= s1;
end
end
s2:begin
p <= p1;
state <= s0;
end
default: begin
state <= s0;
end
endcase
end
endmodule
大多数教材中由于没有设置default,并且对于state没有设置初值,所以永远也无法进入s0,s1,s2这三个状态。
2.测试文件
代码如下(示例):
module tb_multiplier(
);
reg [7:0] x;
reg [7:0] y;
reg clk=0;
wire [15:0] p;
multiplier tb_multiplier(
.clk(clk),
.x(x),
.y(y),
.p(p)
);
always begin
#1 clk = ~clk;
end
initial begin
x = 8'b00000001;y = 8'b00000001;
repeat(32)
#20 x = x + 1;
end
initial begin
x = 8'b00000001;y = 8'b00000001;
repeat(32)
#20 y = y + 2;
end
endmodule
二仿真结果
总结
从仿真结果可以看出,上述串行乘法器数度比较慢,时延很大,但是这种乘法器的优点是所占用的资源是所有乘法器中最少的,其在低速的信号处理中有着广泛的应用。