当前位置:   article > 正文

时序逻辑学习——跑马灯(移位法 循环移位 模块调用 参数化设计)_采用移位法编写让led灯8个一起闪

采用移位法编写让led灯8个一起闪

方法一 移位法

功能分析

八个LED灯以每个0.5s的频率闪烁

设计输入

  1. //八个LED灯以每个0.5s的频率闪烁
  2. //移位法
  3. module led_run1(
  4. Clk,
  5. Reset_n,
  6. Led
  7. );
  8. input Clk;
  9. input Reset_n;
  10. output reg [7:0]Led;
  11. reg [24:0]counter;//计数器计数0.5s
  12. always@(posedge Clk or negedge Reset_n)
  13. if(!Reset_n)
  14. counter <= 0;
  15. // else if(counter == 24_999_999)
  16. else if(counter == 24_999)
  17. counter <= 0;
  18. else
  19. counter <= counter + 1'b1;
  20. always@(posedge Clk or negedge Reset_n)
  21. if(!Reset_n)
  22. Led <= 8'b0000_0001;
  23. //else if(counter == 24_999_999)
  24. else if(counter == 24_999)
  25. begin
  26. if(Led == 8'b1000_0000)
  27. Led <= 8'b0000_0001; //当LED移到最左一位1000_0000时,手动将其设置为0000_0001
  28. else
  29. Led <= Led << 1;
  30. end
  31. else
  32. Led <= Led;
  33. endmodule

功能仿真代码

  1. `timescale 1ns/1ns
  2. module tb_led_run_1;
  3. reg Clk;
  4. reg Reset_n;
  5. wire [7:0] Led;
  6. led_run1 led_run1(
  7. .Clk(Clk),
  8. .Reset_n(Reset_n),
  9. .Led(Led)
  10. );
  11. initial Clk=1;
  12. always #10 Clk=!Clk;
  13. initial begin
  14. Reset_n=0;
  15. #150;
  16. Reset_n=1;
  17. #40000000;
  18. $stop;
  19. end
  20. endmodule

功能仿真结果

小结

方法二   循环移位  

功能分析

八个LED灯以每个0.5s的频率闪烁

循环移位

设计输入

  1. //八个LED灯以每个0.5s的频率闪烁
  2. //移位法 循环移位
  3. module led_run2(
  4. Clk,
  5. Reset_n,
  6. Led
  7. );
  8. input Clk;
  9. input Reset_n;
  10. output reg [7:0]Led;
  11. reg [24:0]counter;//计数器计数0.5s
  12. always@(posedge Clk or negedge Reset_n)
  13. if(!Reset_n)
  14. counter <= 0;
  15. // else if(counter == 24_999_999)
  16. else if(counter == 24_999)
  17. counter <= 0;
  18. else
  19. counter <= counter + 1'b1;
  20. always@(posedge Clk or negedge Reset_n)
  21. if(!Reset_n)
  22. Led <= 8'b0000_0001;
  23. //else if(counter == 24_999_999)
  24. else if(counter == 24_999)
  25. Led <= {Led[6:0],Led[7]};
  26. //每当符合一个移位条件,用第七位的值代替第六位,第六位的值代替第五位,依次类推,实现循环移位
  27. else
  28. Led <= Led;
  29. endmodule

功能仿真代码

  1. `timescale 1ns/1ns
  2. module tb_led_run_2;
  3. reg Clk;
  4. reg Reset_n;
  5. wire [7:0] Led;
  6. led_run1 led_run1(
  7. .Clk(Clk),
  8. .Reset_n(Reset_n),
  9. .Led(Led)
  10. );
  11. initial Clk=1;
  12. always #10 Clk=!Clk;
  13. initial begin
  14. Reset_n=0;
  15. #150;
  16. Reset_n=1;
  17. #40000000;
  18. $stop;
  19. end
  20. endmodule

功能仿真结果

方法三  调用模块  参数化设计

功能分析

八个LED灯以每个0.5s的频率闪烁

调用模块

设计输入

  1. //三八译码器代码
  2. module decoder_3_8(
  3. a,
  4. b,
  5. c,
  6. out
  7. );
  8. input a;
  9. input b;
  10. input c;
  11. output reg [7:0]out;
  12. //reg [7:0] out;
  13. // {a,b,c}变成一个三位的信号,这种操作叫位拼接
  14. // 位拼接,其中可用常量
  15. // wire [3:0]d;
  16. // assign d = {a,1'b0,b,c}
  17. //以alwayse块描述的信号,被赋值对象必须定义为reg类型
  18. always@(*)begin
  19. case({a,b,c})
  20. 3'b000 : out = 8'b0000_0001;
  21. 3'b001 : out = 8'b0000_0010;
  22. 3'b010 : out = 8'b0000_0100;
  23. 3'b011 : out = 8'b0000_1000;
  24. 3'b100 : out = 8'b0001_0000;
  25. 3'b101 : out = 8'b0010_0000;
  26. 3'b110 : out = 8'b0100_0000;
  27. 3'b111 : out = 8'b1000_0000;
  28. endcase
  29. end
  30. endmodule
  31. //跑马灯设计
  32. module led_run3(
  33. Clk,
  34. Reset_n,
  35. Led
  36. );
  37. input Clk;
  38. input Reset_n;
  39. output [7:0]Led;
  40. //因为Led由底层模块三八译码器驱动,已在底层模块设置为reg型,所以不能在该顶层模块再设置
  41. parameter MCNT = 25'd24_999_999;
  42. reg [24:0]counter;//计数器计数0.5s
  43. always@(posedge Clk or negedge Reset_n)
  44. if(!Reset_n)
  45. counter <= 0;
  46. else if(counter == MCNT)
  47. counter <= 0;
  48. else
  49. counter <= counter + 1'b1;
  50. reg [2:0] counter2;
  51. always@(posedge Clk or negedge Reset_n)
  52. if(!Reset_n)
  53. counter2 <= 0;
  54. // else if(counter2 == 7)
  55. // counter2 <= 0;
  56. // 因为计数器共八位,计数到7后自动溢出,所以 else if 可不写
  57. else
  58. counter2 <= counter2 + 1'b1;
  59. //例化方式与tb中一样
  60. decoder_3_8 decoder_3_8(
  61. .a(counter2[2]),
  62. .b(counter2[1]),
  63. .c(counter2[0]),
  64. .out(Led)
  65. );
  66. endmodule

功能仿真代码

  1. `timescale 1ns/1ns
  2. module tb_led_run_3;
  3. reg Clk;
  4. reg Reset_n;
  5. wire [7:0] Led;
  6. led_run3
  7. #(
  8. .MCNT(2499)
  9. )
  10. led_run3_ints0(
  11. .Clk(Clk),
  12. .Reset_n(Reset_n),
  13. .Led(Led)
  14. );
  15. defparam led_run3_ints0.MCNT = 24999;
  16. initial Clk=1;
  17. always #10 Clk=!Clk;
  18. initial begin
  19. Reset_n=0;
  20. #150;
  21. Reset_n=1;
  22. #40000000;
  23. $stop;
  24. end
  25. endmodule

功能仿真结果

小结

端口位宽也可用参数化设计

parameter WIDTH = 4;

output [ WIDTH - 1 : 0 ] out;

reg [ WIDTH  - 1 : 0 ] out;

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

闽ICP备14008679号