状态机的常见问题

Posted on 2020-09-10 16:23  绿叶落秋风  阅读(1032)  评论(0编辑  收藏  举报

状态机的常见问题

一、状态机的常见问题

标准的状态机包括摩尔状态机和米勒状态机:摩尔状态机的输出只与当前状态有关,而米勒状态机则和输入和状态都有关。状态机能够稳定工作,但是占用资源过多。在摩尔状态机中的时钟偏斜可能会导致状态转换时会出现过渡状态(状态转化出现时序问题),米勒状态机由于输出异步,更加容易出现时序问题。

二、选择状态机的编码方式

(1)状态机的定义

//使用逻辑向量定义状态
signal current_state: std_logic_vector(1 downto 0);
signal next_state: std_logic_vector(1 downto 0);

//定义方法二
type mystate is (st0,std1,std2,std3);
signal current_state,next_state:mystate;


//定义方法三
constant std0: std_logic_vector(1 downto 0): ="00";
constant std1: std_logic_vector(1 downto 0): ="01";
constant std2: std_logic_vector(1 downto 0): ="10";
constant std3: std_logic_vector(1 downto 0): ="11";

signal current_state,next_state:std_logic_vectro(1 downto 0);

(2)编码方式

顺序码:使用二进制序列

格雷码:二进制数每次只改变一位

读热码:为状态机中每个状态分配一个触发器,只有当前设置为有效,其他设置均无效。

三、合理选择单进程和多进程来设计状态机

单进程使用的不多,主要是可读性较差。单进程状态机一般需要在组合逻辑输出后加上一级时序逻辑缓存。多进程中,双进程的输出描述和某个状态描述混合在一起。三进程中,可以分为组合逻辑输出和时序逻辑输出两种情况。不推荐组合逻辑输出,容易和状态转移的组合逻辑产生毛刺问题。一般使用时序逻辑输出比较好·。

四、设计工具能够实现的状态机

设计状态机的基本原则:

给输出分配默认值,放置产生锁存器;

状态的状态逻辑和输出逻辑分立;

多个状态需要使用某个计算逻辑,采用调用形式。

使用简单的复位逻辑实现状态机的上位状态。

五、小结

状态机需要考虑状态转化和逻辑输出,分别设计后可以有效提高数据的可读性和设计的稳定性。具体的操作还是需要在实际的操作中实现。