《lecture5有限状态机》由会员分享,可在线阅读,更多相关《lecture5有限状态机(50页珍藏版)》请在金锄头文库上搜索。
1、2019/1/15,Longman,1,有限状态机 Finite State Machine,2019/1/15,Longman,2,例:计数器设计,设计一电路,包含基4计数器,和译码输出模块。计数器的输出(Present_value)从0到3循环;当计数值为2时,译码输出(DataOut)为“1”,否则输出“0”。,2019/1/15,Longman,3,00/0,01/0,10/1,11/0,2019/1/15,Longman,4,00/0,01/0,10/1,11/0,扩展一个输入端din,当din = 1时计数器递增计数;当din = 0时计数器递减计数。,2019/1/15,Long
2、man,5,再将计数器修改成一个状态转换器,状态为S0, S1, S2, S3。每个状态的取值根据具体情况而定。比如S0 = 00, S1 = 11, S3 = 01, S4 = 10。,2019/1/15,Longman,6,再将计数器修改成一个状态转换器,状态为S0, S1, S2, S3。每个状态的取值根据具体情况而定。比如S0 = 00, S1 = 11, S3 = 01, S4 = 10。,2019/1/15,Longman,7,现在我们得到了一个比较通用的时序电路,这种电路统称为状态机(State Machine)。,2019/1/15,Longman,8,有限状态机概述,数字系统
3、控制部分的每一个控制态可以看作一种状态,与每一个控制态相关的转换条件指定了当前状态的下一个状态和输出。 根据有限状态机的输出与当前状态与当前输入的关系,可以分成Moore型和Mealy型两种类型的有限状态机。,2019/1/15,Longman,9,Moore状态机和Mealy状态机,Moore状态机的输出只与当前状态有关,2019/1/15,Longman,10,Moore状态机和Mealy状态机,Mealy状态机的输出与当前状态机及当前输入信号有关,2019/1/15,Longman,11,状态机的表示方法,状态转换表 算法流程图 状态转换图,这是最流行的表示方法,2019/1/15,Lo
4、ngman,12,状态转换图,状态1,状态4,状态2,状态3,入,/出,入,入,入,/出,/出,/出,Moore,条件控制定序,直接控制定序,2019/1/15,Longman,13,状态转换图,状态1,状态4,状态2,状态3,入/出,入/出,入/出,入/出,/出,Mealy,条件控制定序,直接控制定序,2019/1/15,Longman,14,用VHDL描述状态机的组成,一个用来描述有限状态机功能的VHDL语言程序中应该包含以下几个内容: (1)至少包括一个状态信号,它们用来指定有限状态机的状态; (2)状态转移指定和输出指定,它们对应于控制单元中与每个控制步有关的转移条件; (3)时钟信号
5、,它一般是用来进行同步的; (4)同步或异步复位信号。,2019/1/15,Longman,15,状态机的VHDL描述方式,(1)单进程描述方式:单进程描述方式就是指在VHDL语言程序的结构体中,使用一个进程语句来描述有限状态机中的次态逻辑、状态寄存器和输出逻辑。 (2)双进程描述方式:一个进程语句用来描述有限状态机中次态逻辑、状态寄存器和输出逻辑中的任何两个;另外一个进程则用来描述有限状态机剩余的功能。 (3)三进程描述方式:一个进程用来描述有限状态机中的次态逻辑;一个进程用来描述有限状态机中的状态寄存器;另外一个进程用来描述有限状态机中的输出逻辑。,2019/1/15,Longman,16
6、,状态机的VHDL描述方式,2019/1/15,Longman,17,存储控制器,设计一个存储控制器,它的具体要求为:(1)存储控制器能够根据微处理器的读周期或者写周期,分别对存储器输出写使能信号we和读使能信号oe;(2)存储控制器的输入信号有3个:微处理器的准备就绪信号ready、微处理器的读写信号read_write和时钟信号clk。,2019/1/15,Longman,18,存储控制器,列出当前状态和输出值的关系,2019/1/15,Longman,19,建立状态转换表,列出次态和转换条件,2019/1/15,Longman,20,利用VHDL语言进行状态机描述 所有状态均可以表达为C
7、ASE-WHEN结构中的一条语句。 状态的转移通过if-then-else语句实现。 CASE present_state IS WHEN idle = 输出量; IF ELSE END IF;,2019/1/15,Longman,21,有些状态的转换中,在条件满足时,转换到下一个状态,否则保持原来的状态不变。这种情况对应着IF-THEN-ELSE的两个分支。 在这种情况下,ELSE分支并不是必需的。但是缺少ELSE分支,会导致额外的存储器。,状态转换,2019/1/15,Longman,22,状态描述的步骤: 对每一个状态建立一项CASE语句的分支 WHEN 状态名 = 确定输出变量 通过I
8、F-THEN-ELSE语句指定相应的次态。,2019/1/15,Longman,23,例 case present_state is - CASE分支 when idle = oe=0;we=0; -确定输出变量 if(ready = 1) then-确定次态 next_state = decision; else next_state = idle; end if;,2019/1/15,Longman,24,例:三进程描述方式1,ARCHITECTURE fsm OF memory_enable IS TYPE state_type IS(idle,decision,read,write);
9、 SIGNAL present_state,next_state: state_type; BEGIN nextstate_logic:PROCESS(present_state,ready, read_write) BEGIN CASE present_state IS WHEN idle = IF(ready = 1) THEN next_state = decision; ELSE next_state = idle; END IF; END CASE; END PROCESS nextstate_logic;,2019/1/15,Longman,25,例:三进程描述方式2,state_
10、register: PROCESS(clk) BEGIN IF(RISING_EDGE(clk) THEN present_state = next_state; END IF; END PROCESS state_registe,2019/1/15,Longman,26,例:三进程描述方式3,output_logic: PROCESS(present_state) BEGIN CASE WHEN idle = we wewewe=1;oe=0; END CASE; END PROCESS output_logic,2019/1/15,Longman,27,任务1:空调控制器,2019/1/1
11、5,Longman,28,任务1:空调控制器,2019/1/15,Longman,29,任务1:空调控制器,状态转换表,2019/1/15,Longman,30,状态机的应用设计,例子:设计一个二进制序列检测器,当检测到10110序列时,就输出1(一个时钟周期的脉冲)。其他情况下输出0。 规定检测到一次之后,检测器复位到最初始的状态,重新从头检测。如下所示:,输入:01101101101100,输出:00000001000001,2019/1/15,Longman,31,状态转换图设计(Moore),1,0,1,1,0,S0/0,S1/0,S2/0,S3/0,S4/0,S5/1,Reset,1
12、,1,0,0,1,1,0,1,0,0,1,0,1,0,1,1,0,s1,s2,s3,s4,s5,s0,问题1:如何保证状态机在初始时状态为s0?,问题2:在状态机跑飞,即脱离有效状态(s0s5)时,如何使状态机能恢复工作,Sx/0,2019/1/15,Longman,32,波形,波形如下图所示,问题:如果需要将输出脉冲往前推一个时钟周期,该如何修改设计?,1,0,1,1,0,1,0,1,1,0,s1,s2,s3,s4,s5,s0,输入,时钟,输出,当前状态,发现当当前壮态为s4,并且输入为0时,输出为1。,2019/1/15,Longman,33,状态转换图设计(Mealy),S0,S1,S2
13、,S3,S4,S5,Reset,1,0,0,1,1,0,1,0,0,1,0,1,sX,/0,/0,/0,/0,/0,/0,/0,/0,/0,/1,/0,/0,1,0,1,1,0,1,0,1,1,0,s1,s2,s3,s4,s5,s0,/0,0/1,s0,2019/1/15,Longman,34,状态机的代码实现,状态定义 Architecture rtl of Syn is - 其他信号定义。 Type SynFsmState is ( s0, s1, s2, s3, s4, s5); Signal SynCst, SynNst : SynFsmState; Begin - 结构体。 End
14、rtl;,2019/1/15,Longman,35,状态机的代码实现,状态寄存器进程描述,状态 寄存器,输出 译码,下一状 态译码,当前状态,输出,下一状态,输入,时钟clk,2019/1/15,Longman,36,状态寄存器进程描述,Process( clk, Reset ) Begin if( Reset = 1 ) then SynCst = S0; - 初始状态。 elsif( clkevent and clk = 1 ) then SynCst = SynNst; - 状态转换。 end if; End process;,2019/1/15,Longman,37,状态机的代码实现,
15、状态转换进程描述,状态 寄存器,输出 译码,下一状 态译码,当前状态,输出,下一状态,输入,时钟clk,2019/1/15,Longman,38,状态转换进程描述,Process( SynCst, din) Begin case SynCst is when s0 = when s1 = ,when s5 = End case; End process;,if( din = 1 ) then SynNst = s1; else SynNst = s0; end if;,when others = SynNst = s0;,2019/1/15,Longman,39,状态机的代码实现,输出进程描述
16、,状态 寄存器,输出 译码,下一状 态译码,当前状态,输出,下一状态,输入,时钟clk,2019/1/15,Longman,40,输出进程描述,Process(SynCst ) Begin case SynCst is when s0 = when s1 = ,when s5 = when others = End case; End process;,Moore,Mealy,Dout = 0;,Dout = 0;,Dout = 0,if( din = 1 ) then else end if;, din ),2019/1/15,Longman,41,任务3:交通灯控制器,模拟显示十字路口两个方向的交通通行情况。两个方向均用红、黄、绿灯指示实际状态。 用LE