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

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

在這裏插入圖片描述

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章