当前位置:   article > 正文

Verilog有限状态机设计

有限状态机设计

一、 什么使有限状态机

二、 有限状态机的分类

三、用状态机实现模5计数器

实现步骤:

1、状态编码

2、定义状态存储变量cs,ns

3、3个always,分别实现当前状态的更新cs、下一个状态的更新以及输出的更新。

verilog代码

  1. module count5(clk,z);
  2. input clk;
  3. output z;
  4. parameter s0=3'b000,s1=3'b001,s2=3'b010,s3=3'b011,s4=3'b100;//状态编码
  5. reg [2:0] cs,ns; //定义状态存储变量current state,next state;
  6. always@(posedge clk)//基于clk,当前状态的更新
  7. cs=ns;
  8. always@(cs)//基于cs,ns的更新
  9. begin
  10. case(cs)
  11. s0:ns=s1;
  12. s1:ns=s2;
  13. s2:ns=s3;
  14. s3:ns=s4;
  15. s4:ns=s0;
  16. defualt:ns=s0;
  17. endcase
  18. end
  19. always@(cs)//基于cs,输出z的更新
  20. begin
  21. if(cs==s4) z=1;
  22. else z=0;
  23. end
  24. endmodle

 四、“101”序列检测器的Verilog描述

Verilog代码

  1. module sy(x,clk,clr,z);
  2. input x,clk,clr;
  3. output reg z;
  4. parameter s0=0,s1=1,s2=2,s3=3,s4=4;
  5. reg [2:0] cs,ns;
  6. always@(posedge clk or posedge clr)
  7. begin
  8. if(clr) cs=s0;
  9. eles cs=ns;
  10. end
  11. always@(cs or x)
  12. begin
  13. case(cs)
  14. s0:begin if(x) ns=s1;else ns=s0;end
  15. s1:begin if(x) ns=s2;else ns=s0;end
  16. s2:begin if(x) ns=s2;else ns=s3;end
  17. s3:begin if(x) ns=s1;else ns=s4;end
  18. s4:begin if(x) ns=s1;else ns=s0;end
  19. defualt ns=s0;
  20. endcase
  21. end
  22. always@(cs)
  23. begin
  24. if(cs==s4) z=1;
  25. else z=0;
  26. end
  27. endmodule

如果要对当前状态进行修改,如使用清零信号clr,则放在第一个always中。

五、状态编码

后三种编码方式都是相邻编码,即相邻两个编码只有一位数字不同。 

状态编码的定义

六、有限状态机的设计要点

多余状态的处理

七、用状态机设置流水灯

1、控制4个led灯从左往右顺序循坏点亮

  1. module sy(clk1,en,led);
  2. input clk1,en;//1HZ的时钟,使能开关
  3. output reg [3:0] led;//4个led灯
  4. parameter s0=0,s1=1,s2=2,s3=3;
  5. reg [1:0] cs,ns;
  6. always@(posedge clk)
  7. cs=ns;
  8. always@(cs)
  9. begin
  10. case(cs)
  11. s0:ns=s1;
  12. s1:ns=s2;
  13. s2:ns=s3;
  14. s3:ns=s0;
  15. default:ns=s0;
  16. endcase
  17. end
  18. always@(cs)
  19. begin
  20. if(`en) led=4'bz;
  21. else
  22. begin
  23. case(cs)
  24. s0:led=4'b1000;
  25. s1:led=4'b0100;
  26. s2:led=4'b0010;
  27. s3:led=4'b0001;
  28. defualt:led=4'bz;
  29. endcase
  30. end
  31. end
  32. endmolue

2、控制18个led灯从两边往中间逐个亮后全灭,再从中间往两边逐个亮后全灭,循环执行上述过程。 

 过程1(除全灭)一共有18/2=9个状态,过程2亦有9个状态,再加上2个全灭状态(这两个状态并不相同,因为其下一状态不是同一个状态),一共20个状态。

 Verilog代码

  1. module sy(clk1,led,en);
  2. input clk1,en;
  3. output reg [17:0] led;
  4. parameter s0=0,s1=1,s2=2,s3=3,s4=4,...,s19=19;//20个状态
  5. reg[4:0] cs,ns;
  6. always@(posedge clk) cs=ns;
  7. always@(cs)
  8. begin
  9. case(cs)
  10. s0:ns=s1;
  11. s1:ns=s2;
  12. s2:ns=s3;
  13. ...
  14. s19:ns=s0;
  15. default:ns=s0;
  16. endcase
  17. end
  18. always@(cs)
  19. begin
  20. if(~en) led=18'bz;
  21. else
  22. begin
  23. case(cs)
  24. s0:led=18'b0;
  25. s1:led=18'100000000000000001;
  26. s2:led=18'b11000000000000011;
  27. ...
  28. s19:led=18'b1111111111111111;
  29. defualt:led=18'bz;
  30. endcase
  31. end
  32. end
  33. endmodule

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

闽ICP备14008679号