`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
