`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