在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4129|回复: 14

[求助] 请教一个异步的问题

[复制链接]
发表于 2010-5-17 09:02:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
时钟CLKA与CLKB,可否这样操作一个信号(en):
    时钟CLKA下检测到某条件(A)时,将en置为“1”;
    然后时钟CLKB检测到en为高后,输出一个时钟宽度的脉冲,并将en拉低,置为“0”?
烦请各位高手告之,这样做可不可以?不可以的话,又是因为什么原因呢?
发表于 2010-5-17 10:06:07 | 显示全部楼层
可以,前提是CLKA与CLKB的频率足够小,能采到(A)和en的变化
发表于 2010-5-17 10:37:07 | 显示全部楼层
可以做成锁存器或者利用寄存器的复位置位端。但要根据你的两个时钟分析一下,能不能保证时序。比如会不会出现置0和置1同时出现。
个人意见还是换一种设计结构更保险。
 楼主| 发表于 2010-5-17 12:39:28 | 显示全部楼层


可以做成锁存器或者利用寄存器的复位置位端。但要根据你的两个时钟分析一下,能不能保证时序。比如会不会出现置0和置1同时出现。
个人意见还是换一种设计结构更保险。
wycawyc 发表于 2010-5-17 10:37


那换成什么结构比较保险呢?
发表于 2010-5-17 13:36:39 | 显示全部楼层
本帖最后由 wycawyc 于 2010-5-17 13:42 编辑

那要根据你的实际设计要求来更改了。我的意思是换一个设计思路。不要把两个时钟域这样混杂在一起。如果实在避不开。就要好好考虑一下能不能满足时间要求了。如果时间裕量足够也可以放心使用。
发表于 2010-5-19 18:35:19 | 显示全部楼层
看着有点像CLKA和CLKB之间的握手,en应该做成CLKA的Req,CLKB再做一个Ack替换楼主所说的一个时钟脉冲(一个时钟可能不够),当CLKA收到Ack后将en置0。
 楼主| 发表于 2010-5-20 09:33:14 | 显示全部楼层
哦。知道了。谢谢楼上诸位。
因为这是一道题,所以就没办法考虑“不把两个时钟域的混在一起做”和“一个时钟不够”的问题了。原题如下:
CLKA与CLKB是不同的两个时钟,它们之间的关系任意。A时钟下有一个时钟宽度的脉冲信号A_EN,如何将该信号传递到B时钟域,得到B_EN,且脉冲宽度为一个B时钟的宽度。A_EN的频率远低于CLKA与CLKB的频率。
发表于 2010-5-20 09:45:45 | 显示全部楼层
可行,我也這樣做,FPGA verify ok!
发表于 2010-5-20 10:19:22 | 显示全部楼层
这个就是把1bit的数据从a域传到b域吧?
大家看看这个结构行不行。A_EN信号作为一个寄存器的时钟,在上升沿将1打入寄存器R.  R的输出作为B域寄存器Rb的时钟使能,Rb输入端接高,时钟端送入CLKB,输出作为B_EN,同时接入R的复位端(R高电平清零,否则加非门)。
大家看看这个结构可行吗?
发表于 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];
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

X

小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-6-27 12:35 , Processed in 0.025122 second(s), 9 queries , Gzip On, MemCached On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表