0%

状态机基础介绍

状态机的本质是对具有逻辑顺序或时序规律事件的一种描述方法。

状态机的基本概念


应用思路

  • 从状态变量入手

    根据电路的时序规律或者逻辑顺序,规划状态,分析状态的输入、转移及输出

  • 明确电路的输出关系,这些输出对应于状态的输出,进而回溯规划每个状态和状态转移条件及输入

基本要素:状态、输出、输入

描述方式:状态转移图、状态转移列表、HDL语言描述

常见分类:

  • 摩尔型状态机,输出仅依赖于当前状态,而与输入条件无关

  • 米勒型状态机,输出不仅依赖于当前状态,而且取决于该状态的输入条件

  • 根据状态机的数量是否为有限个,可分为有限状态机(Finite State Machine,FSM)和无限型状态机(Infinite State Machine,ISM)

如何写好状态机


好的RTL级FSM描述具备以下特点:

  • FSM要安全,稳定性高;
  • FSM速度快,满足设计的频率要求;
  • FSM面积小,满足设计的面积要求;
  • FSM要清晰易懂、易于维护

即在FSM中需要注意完备性,综合的结果无毛刺等异常扰动,在满足时序要求的前提下,占用最小的面积,或者在满足面积要求的情况下,是设计的时序余量更大,频率更高。

一段式状态机

应该避免的写法。

设计的整个状态机写到1各always模块中,在该模块既描述状态转移,又描述状态的输入输出,这种写法称为一段式。

状态机1.png

主要缺点:

  • 状态转移判断的组合逻辑和状态寄存器转移的时序逻辑混写在同一always模块中,不符合时序和组合逻辑分开描述的coding style;
  • 代码结构不清晰,不利于维护,且不利于附加约束,不利于综合器和布局布线对设计的优化;
  • 另外该描述方法冗长,一般来说,一段式代码长度会比两段式长大约80%~150%。

两段式状态机

推荐的FSM描述方法之一。

实现方法,一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律。

状态机2.jpg

缺点:输出一般使用组合逻辑描述,容易产生毛刺等不稳定因素。

三段式状态机

比较推荐的写法。

关键在于使用同步时序逻辑寄存FSM的输出。

两段式状态机根据CS 决定输出结果,而三段式状态机根据NS 决定输出结果

状态机3.png

优势:

  • 使FSM做到了同步逻辑;

  • 消除了组合逻辑输出的不稳定与毛刺的隐患;

  • 更利于时序路径分组;

  • 在FPGA/CPLD等可编程逻辑器件上的综合与布局布线效果更佳

RTL

两段式状态机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
//Add a default state to make it more safe
module state2_default ( nrst,clk,
i1,i2,
o1,o2,
err
);

input nrst,clk;
input i1,i2;
output o1,o2,err;
reg o1,o2,err;


reg [2:0] NS,CS;

parameter [2:0] //one hot with zero idle
IDLE = 3'b000,
S1 = 3'b001,
S2 = 3'b010,
ERROR = 3'b100;

//sequential state transition
always @ (posedge clk or negedge nrst)
if (!nrst)
CS <= IDLE;
else
CS <=NS;

//combinational condition judgment
always @ (nrst or CS or i1 or i2)
begin
NS = 3'bx;
ERROR_out;
case (CS)
IDLE: begin
IDLE_out;
if (~i1) NS = IDLE;
if (i1 && i2) NS = S1;
if (i1 && ~i2) NS = ERROR;
end
S1: begin
S1_out;
if (~i2) NS = S1;
if (i2 && i1) NS = S2;
if (i2 && (~i1)) NS = ERROR;
end
S2: begin
S2_out;
if (i2) NS = S2;
if (~i2 && i1) NS = IDLE;
if (~i2 && (~i1)) NS = ERROR;
end
ERROR: begin
ERROR_out;
if (i1) NS = ERROR;
if (~i1) NS = IDLE;
end
default: begin
IDLE_out;
NS = IDLE;
end
endcase
end


//output task
task IDLE_out;
{o1,o2,err} = 3'b000;
endtask

task S1_out;
{o1,o2,err} = 3'b100;
endtask

task S2_out;
{o1,o2,err} = 3'b010;
endtask

task ERROR_out;
{o1,o2,err} = 3'b111;
endtask

endmodule

三段式状态机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//3-paragraph method to describe FSM
//Describe sequential state transition in the 1st sequential always block
//State transition conditions in the 2nd combinational always block
//Describe the FSM out in the 3rd sequential always block
//Westor, Dec. 2006
//Verilog Usage Book
module state3 ( nrst,clk,
i1,i2,
o1,o2,
err
);

input nrst,clk;
input i1,i2;
output o1,o2,err;
reg o1,o2,err;


reg [2:0] NS,CS;

parameter [2:0] //one hot with zero idle
IDLE = 3'b000,
S1 = 3'b001,
S2 = 3'b010,
ERROR = 3'b100;

//1st always block, sequential state transition
always @ (posedge clk or negedge nrst)
if (!nrst)
CS <= IDLE;
else
CS <=NS;

//2nd always block, combinational condition judgment
always @ (nrst or CS or i1 or i2)
begin
NS = 3'bx;
case (CS)
IDLE: begin
if (~i1) NS = IDLE;
if (i1 && i2) NS = S1;
if (i1 && ~i2) NS = ERROR;
end
S1: begin
if (~i2) NS = S1;
if (i2 && i1) NS = S2;
if (i2 && (~i1)) NS = ERROR;
end
S2: begin
if (i2) NS = S2;
if (~i2 && i1) NS = IDLE;
if (~i2 && (~i1)) NS = ERROR;
end
ERROR: begin
if (i1) NS = ERROR;
if (~i1) NS = IDLE;
end
endcase
end


//3rd always block, the sequential FSM output
always @ (posedge clk or negedge nrst)
if (!nrst)
{o1,o2,err} <= 3'b000;
else
begin
{o1,o2,err} <= 3'b000;
case (NS)
IDLE: {o1,o2,err}<=3'b000;

S1: {o1,o2,err}<=3'b100;
S2: {o1,o2,err}<=3'b010;
ERROR: {o1,o2,err}<=3'b111;
endcase
end

endmodule

Reference

1.轻松成为设计高手–Verilog HDL 实用精讲

Thank you for your accept!
-------------本文结束感谢您的阅读-------------