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
