关于取信号边沿触发的问题
时间:10-02
整理:3721RD
点击:
在RTL设计中,经常会遇到一个问题,就是希望在某个信号的上升沿或者下降沿作为判断信号触发条件。除了时钟和复位信号之外,其他信号不好用always@(*)这样的格式。
假如我希望在scl的下降沿触发,scl的时钟可能比基准的clk慢很多,我可能会通过一个寄存器scl_1打一拍,然后取(scl & !scl_1)为scl的下降沿信号。这个做法在仿真功能是可以通过的。但是综合和PnR之后,在Xilinx板上用chipscope抓波形看,波形就出问题了。仔细查看发现在代码里面用(scl & !scl_1)的地方都时不时地出现没有触发的情况。
不知道各位有没有一些这方面的解决方法或者经验呢?求教了!
谢谢!
假如我希望在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正解
很感谢您的提醒。我其实不太了解亚稳态具体该怎么去减少的。您的意思是打两拍来同步复位信号吗?能不能给我一段例子?
非常感谢!
问题已解决,非常感谢各位!
不同时钟域信号先同步消除亚稳态再取沿
