`timescale 1ns/1ns module data_driver( input clk_a, input rst_n, input data_ack, output reg [3:0]data, output reg data_req ); reg data_ack_1,data_ack_2; reg [2:0] cnt; always@(posedge clk_a or negedge rst_n) if(!rst_n) begin data_ack_1 <= 1'b0; data_ack_2 <= 1'b0; end else begin data_ack_1 <= data_ack; data_ack_2 <= data_ack_1; end always@(posedge clk_a or negedge rst_n) if (!rst_n) data <= 4'd0; else if(data_ack_1 && !data_ack_2 && data == 4'd7) data <= 4'd0; else if(data_ack_1 && !data_ack_2) data <= data +1'b1; else data <= data; always@(posedge clk_a or negedge rst_n) if (!rst_n) cnt <= 3'd0; else if(data_ack_1 && !data_ack_2) cnt <= 3'd0; else if(data_req) cnt <= cnt; else cnt <= cnt + 1'b1; always@(posedge clk_a or negedge rst_n) if (!rst_n) data_req <= 1'b0; else if(cnt==3'd4) data_req <= 1'b1; else if(data_ack_1 && !data_ack_2) data_req <= 1'b0; else data_req <= data_req; endmodule module data_receiver ( input wire clk_b, input wire rst_n, input wire [3:0] data, input wire data_req, output reg data_ack ); reg data_req_1,data_req_2; reg data_reg; always@(posedge clk_b or negedge rst_n) if(!rst_n) begin data_req_1 <= 1'b0; data_req_2 <= 1'b0; end else begin data_req_1 <= data_req; data_req_2 <= data_req_1; end always@(posedge clk_b or negedge rst_n) if(!rst_n) data_ack <= 1'b0; else if(data_req_1) data_ack <= 1'b1; else data_ack <= 1'b0; always@(posedge clk_b or negedge rst_n) if(!rst_n) data_reg <= 4'd0; else if(data_req_1 && !data_req_2) data_reg <= data; else data_reg <= data_reg; endmodule