A sponsor a request(REQ) for sending data out
B return with an ACK and start to receive the data once recognizing the request from A
module TwoPhaseHandshake(clkA,rsta_n, clkB,rstb_n, DataA, ReqA, Ack, AckA, DataB, Req, ReqB);
input clkA;
input clkB;
input rsta_n;
input rstb_n;
input DataA;
input ReqA;
output Ack;
output AckA;
output DataB;
output Req;
output ReqB;
wire SysADFOUT;
wire SysASync;
wire SysASyncOUT;
wire SysAxorOUT;
wire SysBDFOUT;
wire SysBSync;
wire SysBSyncOUT;
wire SysBxorOUT;
wire ReqBOUT;
wire AckOUT;
wire ReqOUT;
assign Ack = AckOUT;
assign Req = ReqOUT;
assign ReqB = ReqBOUT;
assign AckA = SysASyncOUT^ SysADFOUT ;
assign ReqBOUT = SysBSyncOUT^ SysBDFOUT;
always @(posedge clkA or negedge rsta_n)
if(~rsta_n)
{ SysADFOUT,SysASyncOUT ,SysASync} <= 3'b0;
else
{ SysADFOUT,SysASyncOUT ,SysASync} <= { SysASyncOUT,SysASync, AckOUT };
always @(posedge clkA or negedge rsta_n)
if(~rsta_n)
ReqOUT <=1'b0;
else
ReqOUT <= ReqOUT^ReqA;
always @(posedge clkB or negedge rstb_n)
if (~rstb_n)
{ SysBDFOUT,SysBSyncOUT ,SysBSync} <= 3'b000;
else
{ SysBDFOUT,SysBSyncOUT ,SysBSync} <= { SysBSyncOUT,SysBSync, ReqOUT };
// Once request from clkA was received, will return ACK back!
always @(posedge clkB or negedge rstb_n)
if (~rstb_n)
AckOUT <= 1'b0;
else
AckOUT <= AckOUT^ReqBOUT;
always @(posedge clkB)
if(ReqBOUT)
DATAB<=DATAA;
endmodule