比如说两个模块由同一个时钟控制,完成的功能是 在同一个时钟沿到达的那一刻,A模块的对信号 sign1进行置位,同时B模块sign1是否置位,如果是的话就进行某项操作。
比如
- module A
- (
- rst,clk,sign1
- );
- input clk;
- input rst;
- output reg sign1;
-
- always @(posedge clk or negedge rst)
- if(!rst)
- sign1<=1'b0;
- else
- sign1<=~sign1;
-
- endmodule
- module B
- (
- rst,clk,sign1,sign2
- );
- input clk;
- input rst;
- input sign1;
- output reg sign2;
-
- always @(posedge clk or negedge rst)
- if(!rst)
- sign2<=1'b0;
- else if(sign1)
- sign2<=1'b1;
- else
- sign2<=1'b0;
- endmodule
- module top
- (
- clk,sign2,rst
- );
- input clk;
- input rst;
- wire sign1;
- output sign2;
- A a1
- (
- .rst(rst),
- .clk(clk),
- .sign1(sign1)
- );
- B B1
- (
- .rst(rst),
- .clk(clk),
- .sign1(sign1),
- .sign2(sign2)
- );
- endmodule
复制代码
如果按道理来说如果clk同时到达的话,A模块对sign1进行置位的时刻,B已经完成对数据sign1的检测,而sign1物理传输到B还要时间,所以这样本来应该会导致在一个时钟沿不能完成想要的功能,但是结果根据我这几个月做的东西来看,都是满足的。
所以我有以下的猜想
1.有可能是当综合软件检测到有这样行为的时候,会在综合时对布线进行控制,使得clk到达A的时间稍微早于B,那样就可以满足A的信号变化传递到B模块时clk才到B模块,使得模块不出问题。
2.综合软件并不会对布线进行控制,并且clk确实是同时到达,但是因为信号在线上的延时时间远小于寄存器建立时间,所以即使晚传递到B的信号也有足够的寄存器建立时间去建立数据,所以没有问题。
以上就是我自己的猜想,不知道是不是正确,如果都不正确那么究竟是怎么出现这样的情况呢。
希望懂的人能够回答,另外希望能够附上与这个问题相关资料供大家分享
刚开始学
FPGA因为什么都不懂,也不懂什么亚稳态什么所以写起模块很容易,觉得很简单,写出来也是好使的,越是学的深了就越觉得无从入手,总是怕出现亚稳态,现在每写模块的时候都要考虑再三但是最后一分析还是存在可能导致亚稳态的问题。
答案是no,你自己仿真下就清楚了,它会在下一个clk的上升沿,才会检测到sign1为1,从而把sign2变成1。
你肉眼上看到sign2确实在变化,却没有搞清楚sign1和sign2变化的时钟关系,所以导致你的那些乱猜想,其实是很简单的寄存器时序而已。
或者换个说法,在这个上升沿,sign1任是0,moduleB里在这个上升沿检测到的sign1任然是0,所以sign2根本不会变化,而这个上升沿后,sign1变成了1,所以在下一个上升沿,moduleB检测到sign1变成了1,才会把sign2变成1。
你说对了一点,sign1变成1,和moduleB里检测sign1是否为确实是在同一个clk的上升沿,但是后面全是乱猜哈,你要纠正思路,这是很简单的时序。
评分
查看全部评分
哦,想起来了,昨天晚上脑子有点转不过弯就和用
<= 一样,都是我没有表达清楚,是A模块翻转一个电平,另一个模块检测这个电平做出相应的反应,如果这样呢在同一个时钟,都是在沿检测电平,同一个时钟A翻转电平,B检测电平,最后会出现什么样的结果
一周热门 更多>