有关毛刺的问题
- [code]
- reg [9:0] waddr;
- reg [9:0] raddr ;
- reg [9:0] waddr_lat;
- always @ (posedge clk80 or negedge rst1_n)
- if(!rst1_n)
- req <= 0;
- else if((waddr > raddr) & (waddr - raddr > 128))
- req <= 1;
- else
- req <= 0;
- always @ (posedge clk100 or negedge rst2_n)
- if(!rst2_n)
- waddr <= 10'b0;
- else
- waddr <= waddr_lat
clk100 clk80 代表100M与80M时钟
现在的出现的问题是,在chipscope中抓到的波形req总是很随机的无效(后果挺严重的)的起来一拍(有效的情况req是要大于1拍的),而且每次都是在waddr发生变化时,(此时raddr与waddr_lat不会发生变化),并且此时看到的(waddr > raddr) & (waddr - raddr > 128) 条件也不成立,所以我们就分析是在waddr变化时产生了毛刺(2进制编码),多位发生变化时,路径延迟不一致产生了一个满足(waddr > raddr) & (waddr - raddr > 128) 条件的waddr ,然后在经过比较器,减法器,与门,这根刺刚好被上升沿踩到,才会出现req无效起来的情况,请大家分析分析这种问题的定位对不对。
我的问题是: 1. 是不是所有的2进制地址在变化时都会出现这种情况?
2. 时钟沿正好踩到毛刺的现象常见么?是不是会有时序违例,还是说有很随机。
3.怎么解决这种问题?
尝试了一种方法,将clk100下的waddr由同步器同步到了clk80下(但是我觉得这样只是避免了亚稳态,对消除这里的毛刺有作用么),再比较,结果还是会有,但是貌似错误的概率降低了一些,所以求助大家看怎么解决。不知道问题描述的大家有没有明白,不明白的就问我再补充,共同学习。
问题已经解决,给大家反馈一下
就是4,5楼两位说的,没有做同步处理,在慢时钟域正好踩到了快时钟域多位信号变化的时刻产生毛刺,造成后续电路出错
解决方法 开始采用2级同步器,这样还会出错,因为还是有可能踩到变化时刻,所以换了握手,问题解决,其实现在看来问题也不难,考虑的不全面,积累经验了。
楼下还有一些好人提到的一些方法我觉得都可以吧,只不过在这不适合用。
发散一下,问问还有那些情况会产生毛刺呢?还有那些方法解决毛刺呢?
求科普啊!~谢谢
时序电路没有毛刺这个说法,应该是你同异步没处理好。
标题
if判断条件里是组合逻辑,这里不会有毛刺么,现在的问题也总是出现在那里。
看到两个问题:
第一就是((waddr > raddr) & (waddr - raddr > 128),只要 (waddr - raddr > 128不就行了吗
第二个就是异步问题,你的waddr是在clk100的时钟域,但它却在clk80的时钟域作为else if条件;就是说clk80的时钟有可能采到未稳定的waddr导致req出现毛刺。
那个相当于寄存器前的组合逻辑,只是你这里的组合逻辑产生跟你的寄存器不是同一时钟域,才导致有问题,还是异步问题。说到底还是你跨时钟域没处理好
标题
第一个问题其实还有一个waddr小于raddr的情况,这里我没有写出来,而且问题不会出现在那里,所以不能按你说的这样改。
第二个问题把waddr经过同步器处理再做判断条件,但还是会有错,只不过概率下降了(按错误出现的频率来说),就算慢踩快有可能踩不到,但是不至于出错吧。是不是换种同步方式能好点呢?
&->&&,128->10‘d128
raddr 是clk80下的?
确实跨时钟域没有处理,但是要是单独把判断条件引一个组合逻辑输出,你说这个信号会不会有刺呢?
在时序逻辑中,组合逻辑有毛刺没关系,只要采样的时候没采到毛刺就行了,而这个由你那个判断条件如果寄存器同步之后,静态时序分析会check是不是会采到毛刺,毛刺其实就是数据不稳定,变化有先后,timing满足的另一种意思就是能保证采样的时候数据都稳定,也就是这个时候毛刺过去了。
这个我理解了,那是不是所有的2进制编码多位变化时,都有可能出线毛刺,只不过同步电路中不会踩到,而在跨时钟域时才会凸显出来,只要同步做好了,这个刺就不会被踩到,可以这样理解吧?
嗯,对,但是比较器输出单bit吧,不用换& &也可以吧,
差不多吧
你是说把waddr送进clk80打两拍,再作为else if的判断条件,仍有错?
像&&,和10‘d128,尽量书写规范。
有,但是概率低了,你说会不会是同步的时候也会踩到waddr变化的时刻,产生错误,再传播到第二拍,换种同步方式是不是会好点。
那有没有什么好的方法解决呢?
这个很灵活的,一般根据你在不同时钟域传递的信号的特点具体怎么实现,一般最简单的策略,单信号一般打两拍同步就行了,多个数据信号一般会采用握手
谢谢两位
谢谢两位
binggo
You can used the gray code to translate the read/write address to different clock domain.
端口滤波就能解决
这样理论上应该可以解决,但是这样改是不是代码改动的地方比较大 谢谢 参与回复
端口指的是哪?你的意思是加滤波电容来解决毛刺?书上提到过这种方法,但是在这怎么用? 有没有必要?
That's right. The signals across the different clock domain is the designer guarantee that can work correctly.So you must to modify the code. The gray code is the general purpose method to do the signal across two different
clock domain. I hope it can help your reference.
