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
四位流水線乘法器(用加法器替代乘法器)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.