当前位置:   article > 正文

关于时序逻辑赋值是否延拍的问题_复位信号为什么会延迟一拍

复位信号为什么会延迟一拍

1,时序逻辑赋值基础

  1. reg [31:0] cnt1;
  2. reg [31:0] cnt2;
  3. always@(posedge clk)
  4. if(rst)
  5. cnt1<='d0;
  6. else
  7. cnt1<=cnt1+1'b1;
  8. always@(posedge clk)
  9. if(rst)
  10. cnt2<='d0;
  11. else if(enable)
  12. cnt2<=cnt2+1'b1;

        上述代码中,计数器cnt1与时钟clk之间,没有同步信号(指clk从产生以来,cnt1和clk之间没有任何关系),也就是clk上升沿到来的时候,cnt1直接发生变化;计数器cnt2与时钟clk之间,具有同步信号enable,也就是clk上升沿到来的时候,cnt2需要在enable使能拉高后,延时一拍才会发生变化。具体如下面波形图所示。

        复位信号拉低后,cnt1在第一个clk上升沿马上发生变化(0-1),没有延时。

        复位信号拉低后,cnt2在enable拉高的时候,在下一个时钟上升沿才会发生变化(0-1)。

2,时序逻辑赋值进阶

        如果同时出现同步信号cnt和与clk_h无关的信号a,data该如何赋值?

  1. reg [31:0] cnt;
  2. always@(posedge clk_h)
  3. if(rst)
  4. cnt<='d0;
  5. else
  6. cnt<=cnt+1'b1;
  7. reg [3:0] data1;
  8. reg [3:0] data2;
  9. always@(posedge clk_h)
  10. if(rst)
  11. data1<='d0;
  12. else if(cnt>=2)
  13. data1<=a;
  14. else
  15. data1<='d0;
  16. always@(posedge clk_h)
  17. if(rst)
  18. b<='d0;
  19. else
  20. b<=a;
  21. always@(posedge clk_h)
  22. if(rst)
  23. data2<='d0;
  24. else if(cnt>=2)
  25. data2<=b;
  26. else
  27. data2<='d0;

        当rst拉低后,a从15开始递减,cnt本身也从1开始递增,当cnt>=2的时候,data1开始赋值,由仿真可以看到,data1相对于cnt==2的时候,延时了一拍,满足同步信号延时一拍的规则;但是data赋值与a在同一个周期,而不是与cnt==2时刻对齐的13,这是因为a不是同步信号,也可以理解为a不是在clk_h这个时钟域下进行变化的,所以在下个时钟上升沿的时候,data1赋值12。

        同理,data2在cnt==2的时候赋值b,b因为在clk_h时钟域进行了同步,因此,data2赋值b的时候具有同步信号,因此,data2赋值13。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号