微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于取信号边沿触发的问题

关于取信号边沿触发的问题

时间:10-02 整理:3721RD 点击:
在RTL设计中,经常会遇到一个问题,就是希望在某个信号的上升沿或者下降沿作为判断信号触发条件。除了时钟和复位信号之外,其他信号不好用always@(*)这样的格式。
假如我希望在scl的下降沿触发,scl的时钟可能比基准的clk慢很多,我可能会通过一个寄存器scl_1打一拍,然后取(scl & !scl_1)为scl的下降沿信号。这个做法在仿真功能是可以通过的。但是综合和PnR之后,在Xilinx板上用chipscope抓波形看,波形就出问题了。仔细查看发现在代码里面用(scl & !scl_1)的地方都时不时地出现没有触发的情况。
不知道各位有没有一些这方面的解决方法或者经验呢?求教了!
谢谢!

怎么可能呢?clk速度高于scl两倍就应该取的到啊?


  我代码里面是这样的
    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同时变化的,所以就取不到信号了。为什么会有这个情况?

    改成这样可以吗?
    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

先打两拍消除一下亚稳态,然后再打一拍,做下降沿检测。不会有问题

LS正解



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

问题已解决,非常感谢各位!

不同时钟域信号先同步消除亚稳态再取沿

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top