`timescale 1ns/1ns
module valid_ready(
input clk ,
input rst_n ,
input [7:0] data_in ,
input valid_a ,//data_in的有效性
input ready_b ,//下游是否准备好接收本模块的输出数据
output ready_a ,//是否准备好接收上游数据
output reg valid_b ,//data_out的有效性
output reg [9:0] data_out
);
reg [1:0]cnt;
//复位
always@(negedge rst_n)begin
if(!rst_n)begin
cnt <= 0;
valid_b <= 0;
data_out <= 10'd0;
end
else begin
cnt <= cnt;
end
end
//上游
assign ready_a = !valid_b | ready_b;//下游 准备和输出有效,任意一个都可以拉高上游准备
always@(posedge clk)begin
if(valid_a && ready_a && (cnt!=2'd3) )begin
cnt <= cnt + 1;
end
else if(valid_a && ready_a && (cnt==2'd3))begin
cnt <= 0;
end
else begin
cnt <= cnt;
end
end
always@(posedge clk)begin
if(valid_a && ready_a && (cnt==2'd0))begin
data_out <= data_in;
end
else if(valid_a && ready_a && (cnt!=2'd0))begin
data_out <= data_out + data_in;
end
else begin
data_out <= data_out;
end
end
//下游
always@(posedge clk)begin
if(cnt == 2'd3 && valid_a && ready_a)begin//
valid_b <= 1;
end
else if(valid_b && ready_b)begin
valid_b <= 0;
end
else begin
valid_b <= valid_b;
end
end
endmodule