设计32bit*32bit的乘法器
input clk,rst_n,x1,x2,mult_begin
output product,mult_end
先求有符号位x1,x2的补码,分别记为x1_abs,x2_abs
assign x1_sign=x1[31];
x1_abs=x1_sign? (~x1+1) :x1;
乘法
加载x1,mult_vld期间,x1每T左移1位
if (rst_n)begin
y1<=64'b0;
end
else if (mult_vld) begin
y1<={y1[62:0],1'b0};
end
else if (mult_begin) begin
y1<={32'b0,x1_abs};
end
加载x2,mult_vld期间,x2每T右移1位
if (rst_n)begin
y2<=32'b0;
end
else if (mult_vld) begin
y2<={1'b0,y1[31:1]};
end
else if (mult_begin) begin
y2<=x2_abs;
end
mult_vld时序逻辑,复位及 (没开始或已结束)期间为0,其余为高。
assgin mult_end = mult_vld && ~(|y2);//y2全为0,即乘完了
assign part_product=y2[0] ? y1:64'b0;
时序
if (mult_vld)
product_temp<=product_temp+part_product;
最终
assign product=product_sign? (~product_temp+1):product_temp;