第 8章 有限状态机设计
<EDA技术 与应用 > 课程讲义
下一章
合肥工业大学 彭良清
上一章
本章内容
1,什么是有限状态机?
2,FSM的应用
3,使用 FSM设计电路有何好处?
4,VHDL代码 FSM的组成、分类
5,单进程状态机 & 多进程状态机
6,Moore状态机 & Mealy状态机
7,状态编码的选择
8,状态机应用实例,SDRAM控制器
什么是有限状态机?
将对象(电路)的工作过程表达为:
各种不同状态

事件控制下
的变迁过程
这种描述方法称为有限状态机( FSM)
有限状态机:实例
? 上图是一个接受者 FSM 模型,用来分析单词,nice”。该分
析器只接受字符输入,包含 6种状态,状态切换由输入的字
符驱动
有限状态机:要素
FSM包含
1,一组状态集( states)、
2,一个起始状态( start state)、
3,一组输入符号集( input alphabet)、
4,一组输出符号集( output alphabet )
5,一个映射输入符号和当前状态到下一状态的
转换函数( transition function)
有限状态机:表达
1,一般结构
2,状态机的形式化表达
I,状态转移 图
II,状态转移 表
状态机的一般结构
8状态的 Mealy状态机
16状态的 Moore状态机
PPP协议状态转移表
IEEE802
协议
状态机
FSM的应用
1,通信协议描述
例如,ITU建议,IEEE标准,RFC建议
2,应用客体的过程描述
VC等软件设计中也常使用 FSM
2,硬件电路的 HDL语言表达
本章所介绍的内容
使用 FSM设计电路有何好处?
1,可以将复杂的过程简单化
2,可以完成复杂的过程表达
3,表达严谨,无二义性
4,状态机实现代码很规范,实现容易
5,容易构成同步时序模块
6,适合与高速电路设计
VHDL代码 FSM的组成、分类
? 组成
1,说明部分
2,主控时序进程
3,主控组合进程
4,辅助进程
举 例
? 分类
1,Mealy状态机 & Moore状态机
2,单进程状态机 & 多进程状态机
3,符号化状态机 & 确定状态编码状态机
4,顺序编码 & 一位热 & 其他编码状态机
说明部分
?说明状态的数目和取值,例如:
ARCHITECTURE,..IS
TYPE FSM_ST IS (s0,s1,s2,s3);
SIGNAL current_state,next_state,
FSM_ST;
主控时序进程
?负责状态机运转,在 时钟驱动 下完成状态转

?必须由 clk 信号驱动
?将 次态的 状态量 送入 现态的 状态量
current_state <= next_state
主控组合进程
?根据外部输入的控制信号
(包括来自状态机外部的信号和来自状态机内部其它非主控的
组合或时序进程的信号),
或(和)当前状态的状态值
确定下一状态( next_state)的取向,
即 next_state的取值内容,
以及确定对外输出 或
对内部其它 组合 或 时序进程
输出控制信号的内容。
辅助进程
?配合状态机工作的组合或者时序进程
状态机的结构举例(一)
1,LIBARY IEEE;
2,USE IEEE.STD_LOGIC_1164.ALL;
3,ENTITY s_machine IS
4,PORT ( clk,reset, IN STD_LOGIC;
5,state_inputs,IN STD_LOGIC_VECTOR(0 DOWNTO 1);
comb_outputs:OUT INTEGER RANGE 0 TO 15
6,);
7,END ENTITY s_machine;
8,ARCHITECTURE BEHAV OF s_machine IS
9,TYPE FSM_ST IS ( s0,s1,s2,s3 );
10,SIGNAL current_state,next_state,FSM_ST;
11,BEGIN
状态机的结构举例(续一)
1,REG:
2,PROCESS ( reset,clk )
3.
4,IF reset = '1' THEN
5,current_state <= s0;
6,ELSIF clk = '1' AND clk'EVENT THEN
7,current <= next_state;
8,END IF;
9,END PROCESS;
状态机的结构举例(续二)
1,COM:
2,PROCESS ( current_state,state_inputs )
3,BEGIN
4.
5,CASE current_state IS
6,WHEN s0 =>
7,comb_outputs <= 5;
8,IF state_inputs = "00" THEN
9,next_state <= s0;
10,ELSE
11,next_state <= s1;
12,END IF;
13,WHEN s1 =>
14,comb_outputs <= 8;
15,IF state_inputs = "00" THEN
16,next_state <= s1;
17,ELSE
18,next_state <= s2;
19,END IF;
20.
状态机的结构举例(续三)
1,WHEN s2 =>
2,comb_outputs <= 12;
3,IF state_inputs = "11" THEN
4,next_state <= s0;
5,ELSE
6,next_state <= s3;
7,END IF;
8,WHEN s3 =>
9,comb_outputs <= 14;
10,IF state_inputs = "11" THEN
11,next_state <= s3;
12,ELSE
13,next_state <= s0;
14,END IF;
15,END CASE;
16,END PROCESS;
17,END ARCHITECTURE BEHAV;
单进程状态机 & 多进程状态机
?单进程状态机
? 结构:时序和组合控制在 1个进程中
? 特点:适合简单应用,输出有 1个时钟周期的延

?多进程状态机
? 结构:时序和组合控制在 2个进程中
? 特点:适合复杂应用,容易修改
?一般采用多进程状态机。
单进程状态机的设计
? 设计方法
1,只定义一个 PROCESS
2,必须有时钟控制输入
3,避免产生嵌入的时序逻辑,和 tips(毛刺产生 )
? 举例
单进程状态机:实例 1(一)
1,LIBRARY IEEE;
2,USE IEEE,STD_LOGIC_1164,ALL;
3,ENTITY oneprocess_fsm IS
4,PORT ( ip,reset,clk, IN BIT; --DECLARES THE INPUTS
5,op, OUT BIT ); --DECLARES THE OUTPUT
6,END oneprocess_fsm;
7,ARCHITECTURE operation_oneprocess_fsm OF oneprocess_fsm IS
8,TYPE statetype IS (S0,S1,S2,S3,S4,S5);
9,--ENUMERATED DATA TYPE
10,SIGNAL state,statetype;
11,BEGIN
单进程状态机:实例 1(二)
12,PROCESS( ip,reset,clk ) --BEGINING OF PROCESS WITH SENSITIVITY LIST
13,BEGIN
14,IF(reset='1') THEN
15,state<= S0;
16,ELSIF(clk'event and clk='1') THEN --ON CLK EVENT STATE IS LOADED
17,CASE state IS
18.
19,-- CASE CHECKS FOR VARIOUS CONDITIONS DEPENDING ON THE STATES
20,WHEN S0 =>
21,IF(ip='1') THEN
22,state <= S1;
23,ELSE
24,state <= S0;
25,END IF;
26,WHEN S1 =>
27,IF(ip='0') THEN
28,state <= S2;
29,ELSE
30,state <= S1;
31,END IF;
32,WHEN S2 =>
33,IF(ip='0') THEN
34,state <= S3;
35,ELSE
36,state <= S1;
37,END IF;
单进程状态机:实例 1(三)
38,WHEN S3 =>
39,IF ( ip = '1‘ ) THEN
40,state <= S4;
41,ELSE
42,state <= S0;
43,END IF;
44,WHEN S4 =>
45,IF ( ip ='1') THEN
46,state <= S5;
47,ELSE
48,state <= S2;
49,END IF;
50,WHEN S5 =>
51,IF ( ip = '1 ') THEN
52,state <= S1;
53,ELSE
54,state <= S2;
55,END IF;
56,END CASE; --END CASE
57,END IF;
58,END PROCESS;
单进程状态机:实例 1(四)
38,-- USE OF WITH SELECT TO GIVE OUPUT BASED
39,-- ON STATE CONDITION
40,WITH state SELECT
41,op <= '0' WHEN S0,
42,'0' WHEN S1,
43,'0' WHEN S2,
44,'0' WHEN S3,
45,'0' WHEN S4,
46,'1' WHEN S5,
47,'0' WHEN OTHERS;
48,END operation_oneprocess_fsm;
单进程状态机:实例 1- RTL图
单进程状态机:实例 1-状态转移图
单进程状态机:实例 1-状态转移表
单进程状态机:实例 1-(代码修改)
1,WHEN S0 =>
2,IF(ip='1') THEN
3,state <= S1;
4,ELSE
5,state <= S0;
6,END IF;
7,op <= '0' ;
8,WHEN S1 =>
9,IF(ip='0') THEN
10,state <= S2;
11,ELSE
12,state <= S1;
13,END IF;
14,op <= '0' ;
15,WHEN S2 =>
16,IF(ip='0') THEN
17,state <= S3;
18,ELSE
19,state <= S1;
20,END IF;
21,op <= '0' ;
单进程状态机:实例 1- RTL图
(代码修改)
单进程状态机:实例 1--问题?
1,为何 2种代码的 RTL图 不同?
2,状态机的具体电路如何?(使用其他第三方
EDA工具观察)
2进程状态机
? 设计方法
1,有主控时序进程和主控组合进程组成
2,适合负责复杂逻辑设计
3,容易修改
? 举例
2进程状态机:实例 1-代码
1,LIBRARY IEEE;
2,USE IEEE,STD_LOGIC_1164,ALL;
3,ENTITY twoprocess_fsm IS
4,PORT ( ip,reset,clk, IN BIT; --DECLARES THE INPUTS
5,op, OUT BIT ); --
DECLARES THE OUTPUT
6,END twoprocess_fsm;
7,ARCHITECTURE operation_twoprocess_fsm OF twoprocess_fsm IS
8,TYPE statetype IS (S0,S1,S2,S3,S4,S5);--ENUMERATED DATA
TYPE
9,SIGNAL currentstate,nextstate,statetype;
10,BEGIN
2进程状态机:实例 1-代码(续一)
11,--BEGINING OF PROCESS ONE WITH SENSITIVITY LIST
12,PROCESS ( reset,clk)
13,BEGIN
14,IF(reset='1') THEN
15,-- ON RESET STATE BECOMES S0
16,currentstate<= S0;
17,ELSIF(clk'event and clk='1') THEN
18,-- ON CLK EVENT STATE IS LOADED
19,currentstate <= nextstate;
20,END IF;
21,END PROCESS;
2进程状态机:实例 1-代码(续二)
22,PROCESS(ip,currentstate,nextstate) --BEGINING OF PROCESS TWO WITH SENSITIVITY LIST
23,BEGIN
24,CASE currentstate IS
25,-- CASE CHECKS FOR VARIOUS CONDITIONS DEPENDING ON THE STATES
26,WHEN S0 =>
27,IF(ip='1') THEN
28,nextstate <= S1;
29,ELSE
30,nextstate <= S0;
31,END IF;
32,WHEN S1 =>
33,IF(ip='0') THEN
34,nextstate <= S2;
35,ELSE
36,nextstate <= S1;
37,END IF;
38,WHEN S2 =>
39,IF(ip='0') THEN
40,nextstate <= S3;
41,ELSE
42,nextstate <= S1;
43,END IF;
2进程状态机:实例 1-代码(续三)
44,WHEN S3 =>
45,IF(ip='1') THEN
46,nextstate <= S4;
47,ELSE
48,nextstate <= S0;
49,END IF;
50,WHEN S4 =>
51,IF(ip='1') THEN
52,nextstate <= S5;
53,ELSE
54,nextstate <= S2;
55,END IF;
56,WHEN S5 =>
57,IF(ip='1') THEN
58,nextstate <= S1;
59,ELSE
60,nextstate <= S2;
61,END IF;
62,END CASE; --END CASE
63,END PROCESS;
2进程状态机:实例 1-代码(续四)
64,WITH nextstate SELECT
65,op <='0' WHEN S0,
66,'0' WHEN S1,
67,'0' WHEN S2,
68,'0' WHEN S3,
69,'0' WHEN S4,
70,'1' WHEN S5,
71,'0' WHEN OTHERS;
72,END operation_twoprocess_fsm;
2进程状态机:实例 1-RTL图
Moore状态机 & Mealy状态机
1,Moore机
输出仅是 当前状态 的函数
2,Mealy机
输出信号是 当前状态 和 所有输入信号
的函数,
Moore状态机:特点
1,在时钟跳变后的有限个门延迟后,输出达
到稳定值。
2,输出会在一个完整的时钟周期内保持稳定
3,输入对输出的影响要到下一个时钟周期才
能反映。
4,把输入与输出隔离开来是 moore机的一个
重要特点
Moore状态机:实例 1-代码
1,-- Moore State Machine with Concurrent Output Logic
2,-- dowload from,www.fpga.com.cn & www.pld.com.cn
3,library ieee;
4,use ieee.std_logic_1164.all;
5,entity moore1 is port(
6,clk,rst,in std_logic;
7,id,in std_logic_vector(3 downto 0);
8,y,out std_logic_vector(1 downto 0));
9,end moore1;
10,architecture archmoore1 of moore1 is
11,type states is (state0,state1,state2,state3,state4);
12,signal state,states;
13,begin
Moore状态机:实例 1-代码(续一)
14,moore,process (clk,rst) --this process defines the next state only
15,begin
16,if rst='1' then
17,state <= state0;
18,elsif (clk'event and clk='1') then
19,case state is
20,when state0 =>
21,if id = x"3" then
22,state <= state1;
23,else
24,state <= state0;
25,end if;
26,when state1 =>
27,state <= state2;
28,when state2 =>
29,if id = x"7" then
30,state <= state3;
31,else
32,state <= state2;
33,end if;
Moore状态机:实例 1-代码(续二)
34,when state3 =>
35,if id < x"7" then
36,state <= state0;
37,elsif id = x"9" then
38,state <= state4;
39,else
40,state <= state3;
41,end if;
42,when state4 =>
43,if id = x"b" then
44,state <= state0;
45,else
46,state <= state4;
47,end if;
48,end case;
49,end if;
50,end process;
Moore状态机:实例 1-代码(续二)
51,--assign state outputs concurrently;
52,y <= "00" when (state=state0) else
53,"10" when (state=state1 or state=state3) else
54,"11";
55,end archmoore1;
Moore状态机:实例 1-RTL图
Mealy状态机:特点
1,输出是在输入变化后立即发生变化
2,输入变化可能出现在时钟周期内的任何时候
3,对输入的响应比 moore机对输入的响应早一
个时钟周期。
Mealy状态机:实例 1-代码
1,-- Mealy State Machine with Registered Outputs
2,-- dowload from,www.fpga.com.cn & www.pld.com.cn
3,library ieee;
4,use ieee.std_logic_1164.all;
5,entity mealy1 is port(
6,clk,rst, in std_logic;
7,id, in std_logic_vector(3 downto 0);
8,y, out std_logic_vector(1 downto 0) );
9,end mealy1;
10,architecture archmealy of mealy1 is
11,type states is (state0,state1,state2,state3,state4);
12,signal state,states;
13,begin
Mealy状态机:实例 1-代码(续一)
14,moore,process (clk,rst)
15,begin
16,if rst='1' then
17,state <= state0;
18,y <= "00";
19,elsif (clk'event and clk='1') then
20,case state is
21,when state0 =>
22,if id = x"3" then
23,state <= state1;
24,y <= "10";
25,else
26,state <= state0;
27,y <= "00";
28,end if;
Mealy状态机:实例 1-代码(续二)
29,when state1 =>
30,state <= state2;
31,y <= "11";
32,when state2 =>
33,if id = x"7" then
34,state <= state3;
35,y <= "10";
36,else
37,state <= state2;
38,y <= "11";
39,end if;
Mealy状态机:实例 1-代码(续三)
40,when state3 =>
41,if id < x"7" then
42,state <= state0;
43,y <= "00";
44,elsif id = x"9" then
45,state <= state4;
46,y <= "11";
47,else
48,state <= state3;
49,y <= "10";
50,end if;
Mealy状态机:实例 1-代码(续四)
51,when state4 =>
52,if id = x"b" then
53,state <= state0;
54,y <= "00";
55,else
56,state <= state4;
57,y <= "11";
58,end if;
59,end case;
60,end if;
61,end process;
62,end archmealy;
Mealy状态机:实例 1-RTL图
状态编码的选择
1,One-hot编码
{001,010,100}
2,顺序编码
{000,001,010,011,100…}
3,状态位直接输出型编码
Quartus II软件中的 FSM控制
?FSM设计输入
?状态编码选择
时序电路设计的 FSM表达
The end.
以下内容

正文的引用,
可不阅读。