当前位置:   article > 正文

verilog线性序列机的应用

verilog线性序列机的应用

应用1:写一个周期变化的流水灯如下图

实现思路:用计数器计数一秒的周期,然后在指定位置实现变化(想象计数器是一个线性尺子,每一个时间长度单位就是一个刻度)

代码框架:计数器实现一秒周期——在0.25秒时拉低点评

  1. module led_run(
  2. Clk,
  3. Reset_n,
  4. Led
  5. );
  6. input Clk;
  7. input Reset_n;
  8. output reg Led;
  9. //计数一秒钟
  10. reg [24:0]counter;
  11. parameter MCNT = 50000000-1;
  12. always@(posedge Clk or negedge Reset_n)
  13. if(!Reset_n)
  14. counter <= 0;
  15. else if(counter == MCNT)
  16. // else if(counter == 25'd24999)
  17. counter <= 0;
  18. else
  19. counter <= counter + 1'b1;
  20. //控制led
  21. always@(posedge Clk or negedge Reset_n)
  22. if(!Reset_n)
  23. led <= 0;
  24. else if(counter == 0)
  25. led <= 1'b1;
  26. else if(counter == 12500000)
  27. led <= 1'b0;
  28. endmodule

注意:为何在0.25秒counter == 12500000而不是== 12500000-1

答:最大值变零的时候还依旧需要耗费一个时钟周期,而在取值的过程中需不要耗费额外的周期

应用2:写一个周期变化的流水灯如下图

按照上面的常规写法就是多写几个else if的分支就行

下面介绍另一种思路,如图,吧最小的变化周期当作一个单位

代码框架:一个周期计数器——周期内最小单位的计数——对每一个单位的电平进行赋值

  1. module led_run(
  2. Clk,
  3. Reset_n,
  4. Led
  5. );
  6. input Clk;
  7. input Reset_n;
  8. output reg Led;
  9. //计数一秒钟
  10. reg [24:0]counter;
  11. parameter MCNT = 50000000-1;
  12. always@(posedge Clk or negedge Reset_n)
  13. if(!Reset_n)
  14. counter <= 0;
  15. else if(counter == MCNT)
  16. counter <= 0;
  17. else
  18. counter <= counter + 1'b1;
  19. //计数一个周期
  20. reg [24:0]counter0;
  21. always@(posedge Clk or negedge Reset_n)
  22. if(!Reset_n)
  23. counter0 <= 0;
  24. else if(counter == 12500000)
  25. counter0 <= 0;
  26. else
  27. counter0 <= counter0 + 1'b1;
  28. //控制每一个周期的电平
  29. always@(posedge Clk or negedge Reset_n)
  30. if(!Reset_n)
  31. led <= 0;
  32. else begin
  33. case(counter0)
  34. 0: led <= 1;
  35. 1: led <= 0;
  36. 2: led <= 0;
  37. 3: led <= 1;
  38. 4: led <= 1;
  39. 5: led <= 1;
  40. 6: led <= 0;
  41. 7: led <= 0;
  42. 8: led <= 0;
  43. 9: led <= 0;
  44. default: led <= led;
  45. endcase
  46. end
  47. endmodule

应用3:每过一段时间执行一轮8个led的状态切换

在上一个代码进行修改即可,使用一个拨码开关来对八个led的状态进赋值,在case语句中把拨码开关赋值到led即可

  1. module led_run(
  2. Clk,
  3. Reset_n,
  4. sw,
  5. Led
  6. );
  7. input Clk;
  8. input Reset_n;
  9. input [7:0] sw;
  10. output reg Led;
  11. //计数一秒钟
  12. reg [24:0]counter;
  13. parameter MCNT = 50000000-1;
  14. always@(posedge Clk or negedge Reset_n)
  15. if(!Reset_n)
  16. counter <= 0;
  17. else if(counter == MCNT)
  18. counter <= 0;
  19. else
  20. counter <= counter + 1'b1;
  21. //计数一个周期
  22. reg [24:0]counter0;
  23. always@(posedge Clk or negedge Reset_n)
  24. if(!Reset_n)
  25. counter0 <= 0;
  26. else if(counter == 12500000)
  27. counter0 <= 0;
  28. else
  29. counter0 <= counter0 + 1'b1;
  30. //控制每一个周期的电平
  31. always@(posedge Clk or negedge Reset_n)
  32. if(!Reset_n)
  33. led <= 0;
  34. else begin
  35. case(counter0)
  36. 0: led <= sw[0];
  37. 1: led <= sw[1];
  38. 2: led <= sw[2];
  39. 3: led <= sw[3];
  40. 4: led <= sw[4];
  41. 5: led <= sw[5];
  42. 6: led <= sw[6];
  43. 7: led <= sw[7];
  44. default: led <= led;
  45. endcase
  46. end
  47. endmodule

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

闽ICP备14008679号