状态机的常见问题
一、状态机的常见问题
标准的状态机包括摩尔状态机和米勒状态机:摩尔状态机的输出只与当前状态有关,而米勒状态机则和输入和状态都有关。状态机能够稳定工作,但是占用资源过多。在摩尔状态机中的时钟偏斜可能会导致状态转换时会出现过渡状态(状态转化出现时序问题),米勒状态机由于输出异步,更加容易出现时序问题。
二、选择状态机的编码方式
(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)编码方式
顺序码:使用二进制序列
格雷码:二进制数每次只改变一位
读热码:为状态机中每个状态分配一个触发器,只有当前设置为有效,其他设置均无效。
三、合理选择单进程和多进程来设计状态机
单进程使用的不多,主要是可读性较差。单进程状态机一般需要在组合逻辑输出后加上一级时序逻辑缓存。多进程中,双进程的输出描述和某个状态描述混合在一起。三进程中,可以分为组合逻辑输出和时序逻辑输出两种情况。不推荐组合逻辑输出,容易和状态转移的组合逻辑产生毛刺问题。一般使用时序逻辑输出比较好·。
四、设计工具能够实现的状态机
设计状态机的基本原则:
给输出分配默认值,放置产生锁存器;
状态的状态逻辑和输出逻辑分立;
多个状态需要使用某个计算逻辑,采用调用形式。
使用简单的复位逻辑实现状态机的上位状态。
五、小结
状态机需要考虑状态转化和逻辑输出,分别设计后可以有效提高数据的可读性和设计的稳定性。具体的操作还是需要在实际的操作中实现。
======== ======\\ ======= -
|| || \\ // \\ /-\
|| || || // // \\
|| || // || // \\
====== ======= || === ========
|| || || \\ // \\
|| || \\ || // \\
|| || \\ // // \\
|| || ======= // \\
作者:绿叶落秋风,专注FPGA技术分析和分享,转载请注明原文链接:https://www.cnblogs.com/electricdream/p/13646481.html,文中资源链接如下:
1. GITHUB开源仓库