如何写好状态机
状态机:
摩尔状态机:输出与输入无关
米利状态机:输出与输入有关
l 如何写好状态机:
写状态机可能遇到的问题:
1、两个状态转换时,出现过渡状态;
2、在运行过程中,进入非法状态;
3、在一种器件上综合出理想结果,移植后不能得到相同结果;
4、能够稳定工作但是占用资源过多。
摩尔状态机输出与时钟同步,可以在一定程度上剔除抖动,建议使用摩尔状态机。
l 3种编码形式的分析:
1、顺序码:即state_0=00,state_1=01,state_2=10;
2、格雷码:即state_0=00,state_1=01,state_2=11,state_3=10;
3、独热码:即state_0=000,state_1=001,state_2=010,state_3=100;
分析:使用顺序码时,“01”到“10”这种转化过程可能出现过渡态“11”或“00”,当高位翻转过快“11”当低位翻转过快“00”,所以如果状态机状态值更多的话,产生过渡状态的概率更大。
使用格雷码时,由于相邻只有一个不同,所以可以很大程度上消除延时引起的过渡状态,但是当下一个状态有多种路径时(不会只变化相邻位),可以采用独热码。
l 状态机形式
由于很多状态机的输出是组合逻辑,很容易产生毛刺,所以推荐写状态机时用时序逻辑:
例:always@(posedge clk or negedge rst)
bgein
if ( rst )
初始化
else if (clk event and clk = 1)
case ()
注意画蓝色部分,由于是异步复位,如果直接进行状态跳转,可能进入非法状态。