当前位置:   article > 正文

流水灯Verilog

流水灯Verilog

需要实现的效果

波形图如下,时钟周期假设为50MHz,每隔0.5s转换一次灯的效果。

Verilog代码如下

  1. module water_led
  2. #(parameter CNT_MAX=25'd24_999_999)
  3. (
  4. input wire sys_clk,
  5. input wire sys_rst_n,
  6. output reg [3:0]led_out
  7. );
  8. reg [24:0]cnt;
  9. reg cnt_flag;
  10. always@(posedge sys_clk or negedge sys_rst_n)
  11. begin
  12. if(sys_rst_n==1'b0)
  13. cnt<=25'd0;
  14. else if(cnt==CNT_MAX)
  15. cnt<=25'd0;
  16. else
  17. cnt<=cnt+25'd1;
  18. end
  19. always@(posedge sys_clk or negedge sys_rst_n)
  20. begin
  21. if(sys_rst_n==1'b0)
  22. cnt_flag<=1'b0;
  23. else if(cnt==(CNT_MAX-25'd1))
  24. cnt_flag<=1'b1;
  25. else
  26. cnt_flag<=1'b0;
  27. end
  28. always@(posedge sys_clk or negedge sys_rst_n)
  29. begin
  30. if(sys_rst_n==1'b0)
  31. led_out<=4'b1110;
  32. else if((led_out==4'b0111)&&(cnt_flag==1'b1))
  33. led_out<=4'b1110;
  34. else if(cnt_flag==1'b1)
  35. led_out<=~((~led_out)<<1);//由于循环左移是补0,需要特别地注意这一点
  36. else
  37. led_out<=led_out;
  38. end
  39. endmodule

 

仿真测试代码

  1. `timescale 1ns / 1ns
  2. module tb_water_led();
  3. reg sys_clk;
  4. reg sys_rst_n;
  5. wire [3:0]led_out;
  6. initial
  7. begin
  8. sys_clk=1'b1;
  9. sys_rst_n=1'b0;
  10. #20
  11. sys_rst_n=1'b1;
  12. end
  13. always #10 sys_clk=~sys_clk;
  14. water_led
  15. #(.CNT_MAX(25'd24))//假设计数的最大值为25
  16. water_led_inst
  17. (
  18. .sys_clk(sys_clk),
  19. .sys_rst_n(sys_rst_n),
  20. .led_out(led_out)
  21. );
  22. endmodule

 vivado仿真波形

计数到最大值减1是产生一个时钟脉冲,并且led灯变换一次状态,

 

vivado波形图整体状态

 

 

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

闽ICP备14008679号