当前位置:   article > 正文

在FPGA中利用Verilog代码获得双边沿计数器_veriloghdl 如何在时钟上升沿下降沿都能计数

veriloghdl 如何在时钟上升沿下降沿都能计数

在Verilog代码中,计数器可在时钟上升沿有效,也可在时钟下降沿有效,但无法在时钟上升沿和下降沿同时有效,即以下代码无法编译通过:

  1. reg [3:0] cnt;
  2. always@(posedge clk or negedge clk or rst_n)begin
  3. if(!rst_n)
  4. cnt<=4'd0;
  5. else if(cnt==8-1)
  6. cnt<=4'd0;
  7. else
  8. cnt<=cnt+1'b1;
  9. end

本文研究了一种计算方法,可实现计数器在时钟信号的上升沿和下降沿同时有效,效果如图所示:

Verilog代码如下:

  1. //双边沿计数器;
  2. module cnt_2(
  3. input wire clk,
  4. input wire rst_n,
  5. output reg [4:0] cnt
  6. );
  7. parameter N = 5'd4;
  8. reg [4:0] cnt_p;
  9. reg [4:0] cnt_n;
  10. always@(posedge clk or negedge rst_n)
  11. begin
  12. if(!rst_n)
  13. cnt_p<=5'd0;
  14. else if(cnt==N-1)
  15. cnt_p<=5'd0;
  16. else
  17. cnt_p<=cnt+5'd1;
  18. end
  19. always@(negedge clk or negedge rst_n)
  20. begin
  21. if(!rst_n)
  22. cnt_n<=5'd0;
  23. else if(cnt==N-1)
  24. cnt_n<=5'd0;
  25. else
  26. cnt_n<=cnt+5'd1;
  27. end
  28. //assign cnt = ((cnt_p==0)&&(cnt_n==N-1)||(cnt_p==N-1)&&(cnt_n==0)) ? 0 : (cnt_p >= cnt_n) ? cnt_p : cnt_n;
  29. always@(*) begin
  30. if((cnt_p==0)&&(cnt_n==N-1)||(cnt_p==N-1)&&(cnt_n==0))
  31. cnt=0;
  32. else if(cnt_p >= cnt_n)
  33. cnt=cnt_p;
  34. else
  35. cnt=cnt_n;
  36. end
  37. endmodule

 

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

闽ICP备14008679号