当前位置:   article > 正文

FPGA的Verilog打拍方式无法打拍,测试的仿真结果不打拍的解决方法。_vivado 仿真 输入的信号实际没有打拍

vivado 仿真 输入的信号实际没有打拍

       先附上参考链接:http://t.csdn.cn/krJki

        最近做项目涉及到边缘检测,发现对输入信号打拍时仿真结果无法实现打两拍的功能。这些年多多少少都遇到过类似打拍失效的情况,因为当时项目的原因起初没有太过注意,但现在需要对周期数严格把控,就需要实时的仿真观测到到底是多少拍,由此开始了面向CSDN的学习过程,网上所讲甚少,为了方便后来的小伙伴快速解决,所以根据参考链接和测试有了以下的解决方式。

先提出解决方法:在编写测试激励文件也就是tb文件设计时:

时钟复位用阻塞赋值(=),其他信号用非阻塞赋值(<=)。

        为了更具体的看到效果,做下面的测试。简单的设计的一个.v文件,代码如下:

  1. module Beat(
  2. input clk,rst,
  3. input wire Flag_in,
  4. output wire Flag_out
  5. );
  6. reg Flag_R0,Flag_R1;
  7. always@(posedge clk)
  8. if(rst)
  9. begin
  10. Flag_R0<=1'b0;
  11. Flag_R1<=1'b0;
  12. end
  13. else begin
  14. Flag_R0<=Flag_in;
  15. Flag_R1<=Flag_R0;
  16. end
  17. assign Flag_out =Flag_R1;
  18. endmodule

        其实现的功能就是将输入的Flag_in信号打两拍然后输出给到Flag_out信号。接下来就是仿真激励文件代码如下:

  1. `timescale 1ns / 1ps
  2. module Beat_tb;
  3. reg clk,rst;
  4. reg Flag_in;
  5. wire Flag_out;
  6. Beat b0(
  7. .clk(clk),
  8. .rst(rst),
  9. .Flag_in(Flag_in),
  10. .Flag_out(Flag_out)
  11. );
  12. initial
  13. begin
  14. clk =1'b1;
  15. rst =1'b1;
  16. #2
  17. rst =1'b0;
  18. forever #2 clk =!clk;
  19. end
  20. initial
  21. begin
  22. Flag_in =1'b0;
  23. #10
  24. Flag_in =1'b1;
  25. #20
  26. Flag_in =1'b0;
  27. end
  28. endmodule

        当我们对所有的输入信号都通过阻塞的方式赋值时,就会产生如下结果

        可以直观的看到,从输入Flag_in到Flag_R0时没有实现打拍效果的,R0到R1是可以打拍。接下来我继续测试了1、所有信号非阻塞赋值和2、时钟复位非阻塞赋值,其他信号阻塞赋值,这两种赋值组合,结果都跟上图一样无法实现打两拍操作

        最后就是正确方法的测试代码:

  1. `timescale 1ns / 1ps
  2. module Beat_tb;
  3. reg clk,rst;
  4. reg Flag_in;
  5. wire Flag_out;
  6. Beat b0(
  7. .clk(clk),
  8. .rst(rst),
  9. .Flag_in(Flag_in),
  10. .Flag_out(Flag_out)
  11. );
  12. initial
  13. begin
  14. clk =1'b1;
  15. rst =1'b1;
  16. #2
  17. rst =1'b0;
  18. forever #2 clk =!clk;
  19. end
  20. // always #2 clk=!clk;
  21. initial
  22. begin
  23. Flag_in <=1'b0;
  24. #10
  25. Flag_in <=1'b1;
  26. #20
  27. Flag_in <=1'b0;
  28. end
  29. endmodule

测试的结果如下图:

        可以看到利用 时钟复位用阻塞赋值(=),其他信号用非阻塞赋值(<=)的方式成功的实现了打拍的操作,输入到R0成功打了一拍。

        深究原因还是仿真中阻塞赋值和非阻塞赋值的使用原因,如果有知道其原理的大佬可以麻烦在评论区指教一下,因为本文只提出了解决方法,也是知其然,不知其所以然。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/676216
推荐阅读
相关标签
  

闽ICP备14008679号