`timescale 1ns/1ns

module valid_ready(
	input 				clk 		,   
	input 				rst_n		,
	input		[7:0]	data_in		,
	input				valid_a		,
	input	 			ready_b		,
 
 	output		 		ready_a		,
 	output	reg			valid_b		,
	output  reg [9:0] 	data_out
);
	assign ready_a = ready_b | (~valid_b);
	reg [1:0] cnt;
	always@(posedge clk or negedge rst_n) begin
		if(!rst_n) begin
			cnt <= 2'd0;
		end
		else begin
			cnt <= (valid_a & ready_a)?(cnt+2'd1):cnt;
		end
	end
	always@(posedge clk or negedge rst_n) begin
		if(!rst_n) begin
			data_out <= 'd0;
		end
		else if(cnt==2'd0) begin
			data_out <= (valid_a & ready_a)?data_in:data_out;
		end
		else begin
			data_out <= (valid_a & ready_a)?(data_out+data_in):data_out;
		end
	end
	always@(posedge clk or negedge rst_n) begin
		if(!rst_n) begin
			valid_b <= 1'b0;
		end
		else begin
			valid_b <= (valid_a & ready_a)?(cnt==2'd3):((valid_b & ready_b)?1'b0:valid_b);
		end
	end
endmodule