一个困扰小弟3个月的FPGA难题,希望高手解答,不胜感激

2019-07-16 00:20发布

比如说两个模块由同一个时钟控制,完成的功能是 在同一个时钟沿到达的那一刻,A模块的对信号 sign1进行置位,同时B模块sign1是否置位,如果是的话就进行某项操作。
比如

  1. module A
  2. (
  3.         rst,clk,sign1
  4. );

  5.         input clk;
  6.         input rst;
  7.         output  reg sign1;
  8.         
  9.         always @(posedge clk or negedge rst)
  10.                 if(!rst)
  11.                         sign1<=1'b0;
  12.                 else
  13.                         sign1<=~sign1;
  14.                         

  15. endmodule


  16. module B
  17. (
  18.         rst,clk,sign1,sign2
  19. );

  20.         input clk;
  21.         input rst;
  22.         input sign1;
  23.         output reg sign2;
  24.         
  25.         always @(posedge clk or negedge rst)
  26.                 if(!rst)
  27.                         sign2<=1'b0;
  28.                 else if(sign1)
  29.                         sign2<=1'b1;
  30.                 else
  31.                         sign2<=1'b0;

  32. endmodule


  33. module top
  34. (
  35.         clk,sign2,rst
  36. );

  37.         input clk;
  38.         input rst;
  39.         wire sign1;
  40.         output sign2;
  41.         A a1
  42. (
  43.         .rst(rst),
  44.         .clk(clk),
  45.         .sign1(sign1)
  46. );

  47.         B B1
  48. (
  49.         .rst(rst),
  50.         .clk(clk),
  51.         .sign1(sign1),
  52.         .sign2(sign2)
  53. );


  54. endmodule
复制代码





如果按道理来说如果clk同时到达的话,A模块对sign1进行置位的时刻,B已经完成对数据sign1的检测,而sign1物理传输到B还要时间,所以这样本来应该会导致在一个时钟沿不能完成想要的功能,但是结果根据我这几个月做的东西来看,都是满足的。
所以我有以下的猜想

1.有可能是当综合软件检测到有这样行为的时候,会在综合时对布线进行控制,使得clk到达A的时间稍微早于B,那样就可以满足A的信号变化传递到B模块时clk才到B模块,使得模块不出问题。

2.综合软件并不会对布线进行控制,并且clk确实是同时到达,但是因为信号在线上的延时时间远小于寄存器建立时间,所以即使晚传递到B的信号也有足够的寄存器建立时间去建立数据,所以没有问题。

以上就是我自己的猜想,不知道是不是正确,如果都不正确那么究竟是怎么出现这样的情况呢。

希望懂的人能够回答,另外希望能够附上与这个问题相关资料供大家分享

刚开始学FPGA因为什么都不懂,也不懂什么亚稳态什么所以写起模块很容易,觉得很简单,写出来也是好使的,越是学的深了就越觉得无从入手,总是怕出现亚稳态,现在每写模块的时候都要考虑再三但是最后一分析还是存在可能导致亚稳态的问题。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
glace12123
1楼-- · 2019-07-16 06:07
我可以很负责的高速你,你关于综合、布线的猜想全是错误的,而且很明显你现在的知识积累,还没有达到讨论那些程度,你先在把寄存器时序搞清楚了再说吧,你说的问题,是很简单的寄存器时序问题,两个always都同步于clk,比如在前1刻,sign1为0,经过1个clk的上升沿后,sign1为1,那么请问,在这个clk的上升沿,moduleB的always里会检测到sign1为1而导致sign2变成1吗?
答案是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的上升沿,但是后面全是乱猜哈,你要纠正思路,这是很简单的时序。

评分

参与人数 1积分 +10 收起 理由 A670521546 + 10 必须加分,很中肯的建议

查看全部评分

q8959526
2楼-- · 2019-07-16 06:09
glace12123 发表于 2014-11-27 00:05
我可以很负责的高速你,你关于综合、布线的猜想全是错误的,而且很明显你现在的知识积累,还没有达到讨论那 ...

哦,想起来了,昨天晚上脑子有点转不过弯就和用
<= 一样,都是我没有表达清楚,是A模块翻转一个电平,另一个模块检测这个电平做出相应的反应,如果这样呢在同一个时钟,都是在沿检测电平,同一个时钟A翻转电平,B检测电平,最后会出现什么样的结果
glace12123
3楼-- · 2019-07-16 07:07
 精彩回答 2  元偷偷看……
Laputa_fly
4楼-- · 2019-07-16 11:53
楼上正解,学习了。
108545930
5楼-- · 2019-07-16 15:50
我也思考过类似问题,楼上正解!
ysc917
6楼-- · 2019-07-16 20:22
楼上正解,初学时候时序最容易乱

一周热门 更多>