状态机的介绍
1、有限状态机
(1)常说的状态机是有限状态机FSM。
- 有限状态机即状态数量是有限的,一般用状态变量的不同值表示不同状态。
- 状态机同时能够从外部接收信号,机器在接收到外部输入的信号后会综合考虑当前自己的状态,然后机器做出动作:跳转到另一个状态。
(2)考虑状态机的关键点:当前状态、外部输入、下一个状态
2、两种状态机:Moore型和Mealy型
状态机主要分为 有限状态机(FSM) 和 无限状态机(ISM),但 无限状态机 在实际工程中几乎不用(因为无法建模和验证),所以我们通常说的“状态机”默认是 有限状态机(FSM)。有限状态机(FSM)的 2 种主流形式:Moore型和Mealy型
(1)Moore型
- 输出只取决于当前状态。
- 相对简单,考虑状态机的下一个状态时只需要考虑它的当前状态就行了。
(2)Mealy型
- 输出取决于当前状态 + 输入
- 状态机接收到一个输入信号需要跳转到下一个状态时,状态机综合考虑2个条件(当前状态、输入值)后才决定跳转到哪个状态。
3、状态机的主要用途:电路设计、FPGA程序设计、软件设计
(1)电路设计中广泛使用了状态机思想。
(2)FPGA程序设计。
(3)软件设计
4、C语言实现简单的状态机
(1)题目:开锁状态机。用户连续输入正确的密码则会开锁,如果密码输入过程错误则锁会退回到初始状态重新计入密码,即:用户只需要连续输入出正确的密码即可开锁(输入错误不用撤销、也不用删除)
(2)程序
#include <stdio.h>
#include <ctype.h>// 定义状态枚举
typedef enum
{STATE_START, // 初始状态STATE_1, // 已输入1位正确密码STATE_2, // 已输入2位正确密码STATE_3, // 已输入3位正确密码STATE_UNLOCKED // 开锁成功状态
} State;int main()
{// 预设密码(可修改)const char *password = "1234";const int password_length = 4;State current_state = STATE_START; // 初始状态int input_char;printf("请输入%d位数字密码(输入错误会重置,连续正确即可开锁):\n", password_length);while (1){input_char = getchar(); // 读取用户输入// 跳过换行符(允许用户按回车提交)if (input_char == '\n')continue;// 非数字字符处理:重置状态机if (!isdigit(input_char)){current_state = STATE_START;continue;}// 状态转移逻辑switch (current_state){case STATE_START:current_state = (input_char == password[0]) ? STATE_1 : STATE_START;break;case STATE_1:current_state = (input_char == password[1]) ? STATE_2 : STATE_START;break;case STATE_2:current_state = (input_char == password[2]) ? STATE_3 : STATE_START;break;case STATE_3:current_state = (input_char == password[3]) ? STATE_UNLOCKED : STATE_START;break;case STATE_UNLOCKED:// 保持开锁状态不变break;}// 检测开锁成功if (current_state == STATE_UNLOCKED){printf("开锁成功!\n");return 0; // 程序退出}}return 0;
}