一、三种状态机风格
1、一段式
一个always块,既描述状态转移,又描述状态的输入输出,当前状态用寄存器输出;
2、二段式
两个always块,时序逻辑与组合逻辑分开,一个always块采用同步时序描述状态转移;另一个always块采用组合逻辑判断状态转移条件,描述状态转移规律以及输出,当前状态用组合逻辑输出,可能出现竞争冒险,产生毛刺,而且不利于约束,不利于综合器和布局布线器实现高性能的设计;
(当然,第二个always里的状态跳转和输出可以拆分用组合逻辑描述,也可能有三个always块,但是这并不是三段式,和三段式的区别在于输出到底是组合逻辑还是时序逻辑)
3、三段式
三个always块,一个always块同于同步状态转移,一个always块用于组合逻辑判断状态转移条件,完成状态转移;第三个always块使用同步时序描述状态输出,寄存器输出。
二、状态机种类
1、Moore
状态机的输出只与当前状态有关
2、Mealy
状态机的输出不仅与当前状态有关,还与当前输入有关
区别:Moore型状态机的输出比Mealy型状态机的输出晚一个时钟周期
三、状态机编码
1、二进制码
例如:四个状态编码:s0=2'b00,s1=2'b01,s2=2'b10,s3=2'b11
2、格雷码
格雷码相邻位只有一个bit不同
四个状态编码:s0=2'b00,s1=2'b01,s2=2'b11,s3=2'b10
二进制码Binary Code和格雷码Gray Code占用的位宽少,相应的使用的触发器资源少,但是状态对比时需要比较多个bit,消耗的组合逻辑比较多,适用于组合电路资源丰富的情况(CPLD);
3、独热码
状态编码中只有一位为1
四个状态编码:s0=4'b0001,s1=4'b0010,s2=4'b0100,s3=4'b1000
独热码One-Hot Code的状态比较时只比较1 bit,节省逻辑资源,使用的触发器资源比较多,适用于触发器资源丰富的情况(FPGA);
有时候也是用连续编码,状态值连续:
S0 = 2’d0;
S1 = 2’d1;
S2 = 2’d2;
S3 = 2’d3;
总体来讲,状态较少时(4-24个状态)用独热码效果好,状态多时格雷码(状态数大于24)效果好。
参考:根据状态转移表实现时序电路_牛客题霸_牛客网 (nowcoder.com)