什么是状态机 状态机的描述三种方法

状态机
1、状态机是许多数字系统的核心部件,是一类重要的时序逻辑电路。通常包括三个部分:一是下一个状态的逻辑电路,二是存储状态机当前状态的时序逻辑电路,三是输出组合逻辑电路。
2、根据状态机的输出信号是否与电路的输入有关分为mealy型状态机和moore型状态机。电路的输出信号不仅与电路当前状态有关,还与电路的输入有关,称为 mealy 型状态机,而电路的输出仅仅与各触发器的状态,不受电路输入信号影响或无输入,称为
moore 型状态机。
3、状态机的描述通常有三种方法,称为一段式状态机,二段式状态机和三段式状态机。状态机的描述通常包含以下四部分:
1)利用参数定义语句 parameter 描述状态机各个状态名称,即状态编码。状态编码通常有很多方法包含自然二进制编码,one-hot 编码,格雷编码码等;
2)用时序的 always 块描述状态触发器实现状态存储;
3)使用敏感表和 case 语句(也采用 if-else 等价语句)描述状态转换逻辑;
4)描述状态机的输出逻辑。
4、(1)一段式状态机
module detect_1( input clk_i, input rst_n_i, output out_o ); reg out_r; //状态声明和状态编码 reg [1:0] state; parameter [1:0] s0=2'b00; parameter [1:0] s1=2'b01; parameter [1:0] s2=2'b10; parameter [1:0] s3=2'b11; always@(posedge clk_i) begin if(!rst_n_i)begin state<=0; out_r<=1'b0; end else case(state) s0 : begin out_r<=1'b0; state<= s1; end s1 : begin out_r<=1'b1; state<= s2; end s2 : begin out_r<=1'b0; state<= s3; end s3 : begin out_r<=1'b1; end endcase end assign out_o=out_r; endmodule 一段式状态机是应该避免使用的,该写法仅仅适用于非常简单的状态机设计,不符合组
合逻辑与时序逻辑分开的原则,整个结构代码也不清晰,不利用维护和修改。
(2)两段式状态机
//状态声明和状态编码 reg [1:0] current_state; reg [1:0] next_state; parameter [1:0] s0=2'b00; parameter [1:0] s1=2'b01; parameter [1:0] s2=2'b10; parameter [1:0] s3=2'b11; //时序逻辑:描述状态转换 always@(posedge clk_i) begin if(!rst_n_i) current_state<=0; else current_state<=next_state; end //组合逻辑:描述下一状态和输出 always@(*) begin out_r=1'b0; case(current_state) s0 : begin out_r=1'b0; next_state= s1; end s1 : begin out_r=1'b1; next_state= s2; end s2 : begin out_r=1'b0; next_state= s3; end s3 : begin out_r=1'b1; next_state=next_state; end endcase end assign out_o=out_r; endmodule 两段式状态机采用两个 always 模块实现状态机的功能,其中一个 always 采用同步时序逻辑描述状态转移,另一个 always 采用组合逻辑来判断状态条件转移。两段式状态机是推荐的状态机设计方法。
(3)三段式状态机
module detect_3( input clk_i, input rst_n_i, output out_o ); reg out_r; //状态声明和状态编码 reg [1:0] current_state; reg [1:0] next_state; parameter [1:0] s0=2'b00; parameter [1:0] s1=2'b01; parameter [1:0] s2=2'b10; parameter [1:0] s3=2'b11; //时序逻辑:描述状态转换 always@(posedge clk_i) begin if(!rst_n_i) current_state<=0; else current_state<=next_state; end //组合逻辑:描述下一状态 always@(*) begin case(current_state) s0: next_state = s1; s1: next_state = s2; s2: next_state = s3; s3: begin next_state = next_state; end default : next_state = s0; endcase end //输出逻辑:让输出 out,经过寄存器 out_r 锁存后输出,消除毛刺 always@(posedge clk_i) begin if(!rst_n_i) out_r<=1'b0; else begin case(current_state) s0,s2: out_r<=1'b0; s1,s3: out_r<=1'b1; default : out_r<=out_r; endcase end end assign out_o=out_r; 三段式状态机在第一个 always 模块采用同步时序逻辑方式描述状态转移,第二个always 模块采用组合逻辑方式描述状态转移规律,第三个 always 描述电路的输出。通常让输出信号经过寄存器缓存之后再输出,消除电路毛刺。这种状态机也是比较推崇的,主要是由于维护方便,组合逻辑与时序逻辑完全独立。


日美贸易谈判有何内容?谈判前景如何?
100位妈妈高票选择海信激光电视 护眼属性获得多方认可
智能照明行业的商业模式逐渐走向成熟
小米平板3最新消息:小米平板3于下月发布,9.7寸+因特尔处理器+双系统,亲民价1399
电阻器的型号命名方法
什么是状态机 状态机的描述三种方法
韩国四大交易所只有40%-50%的数字货币用户完成了实名认证
美高森美宣布业界最低功率SmartFusion2 SoC FPGA和 IGLOO2 FPGA获得PCI Express 2.0 SIG认证
AIC 2019第四届中国人工智能领袖峰会下月召开,聚焦人工智能新格局!
红米RedmiNote7Pro评测 各方面出众的千元手机
DCDC电源的布局布线设计
汽车制造商手中的王牌是什么
虹科环境监测事业部提前十个月完成年度销售目标
智能家居安防系统网关解决方案合集
手机白光LED驱动电路优化设计
大数据分析学习的挑战:复杂性、不确定性及涌现性
华为云耀云服务器 L 实例:专家为您解读的中小企业云计算新选择
Microchip诚邀您参加《VectorBlox™ SDK……》在线研讨会
学习做一名创客,搭建多功能机器人
长征五号将于2017年年中执行第二次验证飞行实验