`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 [2:0] cnt_in ; // cnt_in always@(posedge clk or negedge rst_n)begin if(!rst_n) cnt_in <= 'd0 ; else if(cnt_in == 'd4 && (valid_a && ready_a)) cnt_in <= 'd1 ; else if(valid_a && ready_a) cnt_in <= cnt_in + 1'b1 ; end assign ready_a = ((cnt_in <= 'd3)|(cnt_in == 'd4 && ready_b)) ?1'b1:1'b0 ; // valid_b always@(posedge clk or negedge rst_n)begin if(!rst_n) valid_b <= 1'b0 ; else if(valid_b && ready_b) valid_b <= 1'b0 ; else if(cnt_in == 'd3 && valid_a && ready_a) valid_b <= 1'b1 ; end // data_out always@(posedge clk or negedge rst_n)begin if(!rst_n) data_out <= 'd0 ; else if(cnt_in <= 'd3 && valid_a && ready_a) data_out <= data_out + data_in ; else if(cnt_in == 'd4 && (valid_a && ready_a)) data_out <= data_in ; end endmodule