`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
);
reg	[1:0]	data_cnt;

always@(posedge clk or negedge rst_n)
	if(!rst_n)
		data_cnt	<=	2'b0;
	else	if(valid_a && ready_a)
		data_cnt	<=	data_cnt + 1'b1;

always@(posedge clk or negedge rst_n)
    if(!rst_n)
        valid_b <=  1'b0;
    else    if(data_cnt==2'd3 && valid_a && ready_a) 
        valid_b <=  1'b1;
    else    if(valid_b && ready_b)
        valid_b <=  1'b0;

assign  ready_a = !valid_b || ready_b;

always@(posedge clk or negedge rst_n)
    if(!rst_n)
        data_out    <=  10'd0;
    else    if(valid_a && ready_a && ready_b && (data_cnt == 2'd0))
        data_out    <=  data_in;
    else    if(valid_a && ready_a)
        data_out    <=  data_out + data_in;
endmodule