|
发表于 2010-5-20 10:50:04
|
显示全部楼层
//--------------------------------------------------------------------------------------------------------------------------------
// 采用握手电路的跨时钟域信号(ClkA与ClkB异步,且ClkA周期小于ClkB周期,DataClkA只持续一个ClkA周期)
//--------------------------------------------------------------------------------------------------------------------------------
/*-------------------------------------------------------------------*/
always @(posedge ClkA)
if(DataClkA)
FlagClkA <= ~FlagClkA;
else
FlagClkA <= FlagClkA;
/*-------------------------------------------------------------------*/
always @(posedge ClkB)
SyncClkB <= {SyncClkB[1:0] , FlagClkA};
/*-------------------------------------------------------------------*/
assign DataClkB = (SyncClkB[2] ^ SyncClkB[1]);
//--------------------------------------------------------------------------------------------------------------------------------
// 采用握手电路的跨时钟域信号(ClkA与ClkB异步,且ClkA周期小于ClkB周期,DataClkA只持续一个ClkA周期)
//
// (BusyClkA会在DataClkB出现的前后两个ClkB/ClkA周期内保持为“高”,避免ClkA在此时采样DataClkA,以保护DataClkB的生成)
//--------------------------------------------------------------------------------------------------------------------------------
/*-------------------------------------------------------------------*/
always @(posedge ClkA)
if(DataClkA & ~BusyClkA)
FlagClkA <= ~FlagClkA;
else
FlagClkA <= FlagClkA;
/*-------------------------------------------------------------------*/
always @(posedge ClkB)
SyncClkB <= {SyncClkB[1:0],FlagClkA};
/*-------------------------------------------------------------------*/
always @(posedge ClkA)
SyncClkA <= {SyncClkA[0],SyncClkB[1]};
/*-------------------------------------------------------------------*/
assign DataClkB = (SyncClkB[2] ^ SyncClkB[1]);
/*-------------------------------------------------------------------*/
assign BusyClkA = FlagClkA ^ SyncClkA[1]; |
|