四位流水线乘法器(用加法器替代乘法器)

module cy4(
            clk     ,
            rst_n   ,
            vld_in  ,//输入有效指示信号
            x       ,
            y       ,
            p       ,//乘积结果
            vld_out  //输出有效指示信号    
);

input      clk                      ;
input      rst_n                    ;
input      vld_in                   ;//输入有效指示信号
input      x                        ;
input      y                        ;
output     p                        ; 
output     vld_out                  ;//输出有效指示信号

wire [3:0] x                        ;
wire [3:0] y                        ;
reg  [7:0] p                        ;
wire       vld_in                   ;
reg        vld_out                  ;
reg        vld_in_ff0               ;//缓存输入有效信号

wire [7:0] a0                       ;
wire [7:0] b0                       ;
wire [7:0] a1                       ;
wire [7:0] b1                       ;

reg  [7:0] tmp0                     ;
reg  [7:0] tmp1                     ;

assign a0 = x[0]?{4'b0,y}: 0        ;
assign b0 = x[1]?{3'b0,y,1'b0}: 0   ;

assign a1 = x[2]?{2'b0,y,2'b0} : 0  ;
assign b1 = x[3]?{1'b0,y,3'b0} : 0  ;

//将最终的和分为tmp0和tmp1两部分
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        tmp0 <= 0;
		tmp1 <= 0;
    end
    else if(vld_in) begin
        tmp0 <= a0 + b0 ;
		tmp1 <= a1 + b1;
    end
end

//tmp0和tmp1相加即为最终的结果
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        p <= 0;
    end
    else if(vld_in_ff0) begin
        p <= tmp0 + tmp1;
    end
end
//输入有效指示信号vld_in缓存到vld_in_ff0寄存器中
//加入vld_in_ff0中间寄存器符合流水线分布(即“对称性”)
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        vld_out    <= 0;
        vld_in_ff0<=0;
    end
    else  begin
        vld_in_ff0  <= vld_in;
        vld_out  <= vld_in_ff0;
    end
end
endmodule

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41982581/article/details/82902532