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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2427|回复: 8

[求助] 关于取信号边沿触发的问题

[复制链接]
发表于 2013-9-5 09:15:49 | 显示全部楼层 |阅读模式

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

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

x
在RTL设计中,经常会遇到一个问题,就是希望在某个信号的上升沿或者下降沿作为判断信号触发条件。除了时钟和复位信号之外,其他信号不好用always@(*)这样的格式。

假如我希望在scl的下降沿触发,scl的时钟可能比基准的clk慢很多,我可能会通过一个寄存器scl_1打一拍,然后取(scl & !scl_1)为scl的下降沿信号。这个做法在仿真功能是可以通过的。但是综合和PnR之后,在Xilinx板上用chipscope抓波形看,波形就出问题了。仔细查看发现在代码里面用(scl & !scl_1)的地方都时不时地出现没有触发的情况。

不知道各位有没有一些这方面的解决方法或者经验呢?求教了!

谢谢!
发表于 2013-9-5 09:46:17 | 显示全部楼层
怎么可能呢?clk速度高于scl两倍就应该取的到啊?
 楼主| 发表于 2013-9-5 10:51:49 | 显示全部楼层
回复 2# asyou

  我代码里面是这样的

    always @(posedge clk or negedge rst)
    if(!rst) begin
      sda_data <= 1'b0;
      scl_data <= 1'b0;
    end
    else begin
     sda_data <=  sda_in;
     scl_data  <=  scl;
    end


    我仔细看了chipscope的波形发现,scl_data的信号边沿有时会跟scl同时变化的,所以就取不到信号了。为什么会有这个情况?
 楼主| 发表于 2013-9-5 10:55:05 | 显示全部楼层




    改成这样可以吗?

    always @(posedge clk or negedge rst)
    if(!rst) begin
      sda_data <= 1'b0;
      scl_data <= 1'b0;
    end
    else begin
     sda_data <= #1 sda_in;
     scl_data <= #1 scl;
    end
发表于 2013-9-5 11:00:11 | 显示全部楼层
先打两拍消除一下亚稳态,然后再打一拍,做下降沿检测。不会有问题
发表于 2013-9-5 11:41:41 | 显示全部楼层
LS正解
 楼主| 发表于 2013-9-5 12:10:29 | 显示全部楼层
回复 5# windflood


    很感谢您的提醒。我其实不太了解亚稳态具体该怎么去减少的。您的意思是打两拍来同步复位信号吗?能不能给我一段例子?

非常感谢!
 楼主| 发表于 2013-9-5 16:37:17 | 显示全部楼层
问题已解决,非常感谢各位!
发表于 2013-9-6 21:02:53 | 显示全部楼层
不同时钟域信号先同步消除亚稳态再取沿
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2024-9-28 13:26 , Processed in 0.031544 second(s), 10 queries , Gzip On, Redis On.

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