当前位置:   article > 正文

Verilog中的有限状态机_有限状态机verilog

有限状态机verilog

什么是状态机:

状态机是由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调相关信号动作、完成特定操作的控制中心;

有限状态机(Finite State Machine)分为以下两类,分别是:摩尔(Moore)状态机和米利(Mealy)状态机;

        时序电路的输出总取决于触发器的当前状态,但却不一定直接依赖于原始输入,因此图中的细虚线表示的连线可能存在,也可能不存在;当不存在时,也即输出仅由电路状态决定的时序电路称为Moore型,而输出由电路状态和原始输入同时决定的成为Mealy型(这样的命名是为了纪念20世纪50年代上述电路行为的提出者Edward Moore和George Mealy);

再多说几点:

       无论 Moore状态机的输入信号何时到达,他的输出信号知道下一个时钟周期的上升沿都不会改变,这对于避免设置时间违例非常重要;而当Mealy状态机的输入信号在一个时钟周期的中间的某个时刻发生了改变,它的一个或多个输出和下一个状态信号可能会在一段时间后发生变化。 而这个一段时间之后可能会出现在下一个时钟上升沿的建立时间之后。 如果发生这种情况,保存 FSM 下一个状态的寄存器可能会收到不正确的输入。这对于 FSM是 一种非常痛苦且难以找到的错误QWQ。

        尽管有以上的分析,但是Mealy也有其自身的优势;比如说,Moore状态机可能会比Mealy状态机需要更多的状态来指定他的功能和作用,这是因为Moore状态机的输出信号只取决于当前的状态,而Mealy状态机则是还需要依赖输入信号,因此Mealy状态机可以为单个状态指定不同的输出行为;

 Moore状态机verilog写法实例:

  1. module simple(
  2. input clk,
  3. input rst_n,
  4. input w,
  5. output z
  6. );
  7. localparam A = 2'b00;
  8. localparam B = 2'b01;
  9. localparam C = 2'b10;
  10. reg [1:0] state;
  11. assign z = (y == C);
  12. always @(posedge clk or negedge rst_n) begin
  13. if (!rst_n) begin
  14. state <= A;
  15. end
  16. else
  17. case (state)
  18. A:
  19. begin
  20. if (w) begin
  21. state <= B;
  22. end
  23. else begin
  24. state <= A;
  25. end
  26. end
  27. B:
  28. begin
  29. if (w) begin
  30. state <= C;
  31. end
  32. else begin
  33. state <= A;
  34. end
  35. end
  36. C:
  37. begin
  38. if (w) begin
  39. state <= C;
  40. end
  41. else begin
  42. state <= A;
  43. end
  44. end
  45. default:
  46. begin
  47. state <= state;
  48. end
  49. endcase
  50. end
  51. endmodule

 Mealy状态机写法实例:

  1. module mealy(
  2. input clk,
  3. input rst_n,
  4. input w,
  5. output y,
  6. output Y,
  7. output reg z
  8. );
  9. localparam A = 1'b0;
  10. localparam B = 1'b1;
  11. always @(w,y) begin
  12. case (y)
  13. A:
  14. begin
  15. if (w) begin
  16. z = 0;
  17. y = B;
  18. end
  19. else begin
  20. z = 0;
  21. Y = A;
  22. end
  23. end
  24. B:
  25. begin
  26. if (w) begin
  27. z = 1;
  28. y = B;
  29. end
  30. else begin
  31. z = 0;
  32. Y = A;
  33. end
  34. end
  35. endcase
  36. end
  37. always @(posedge clk or negedge rst_n) begin
  38. if (!rst_n) begin
  39. y <= A;
  40. end
  41. else begin
  42. y <= Y;
  43. end
  44. end
  45. endmodule

 这篇笔记参考网上众多资料实验并整理而成,如果涉及侵权烦请请告知,我将第一时间处理。

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

闽ICP备14008679号