📅  最后修改于: 2023-12-03 15:17:43.196000             🧑  作者: Mango
在电子工程中,Moore 和 Mealy 机器是以它们的状态转换方式而出名的状态机模型。它们被用于设计和实现数字电路,尤其是在计算机硬件、电子通信和控制系统等领域。
Moore 机器是一种基于状态转换表现的状态机模型。该模型使用当前状态和输入的组合来确定下一个状态。Moore 机器的输出仅依赖于当前状态。
在这里,Moore 和 Mealy 机器是用于产生“A”、“B”、“C”取决于以“10”或“11”结尾的输入。让我们看看如何使用 Moore 机器来实现它。
// Moore 机器
#include <stdio.h>
typedef enum {
STATE_A,
STATE_B,
STATE_C
} states;
typedef struct {
states state;
} moore_machine;
int main(void) {
int inputs[] = {1, 0, 1, 1}; // inputs: 10 11
moore_machine machine = { .state = STATE_A };
for (size_t i = 0; i < sizeof(inputs)/sizeof(inputs[0]); ++i) {
switch (machine.state) {
case STATE_A:
if (inputs[i] == 1) {
machine.state = STATE_B;
}
break;
case STATE_B:
if (inputs[i] == 0) {
machine.state = STATE_A;
} else if (inputs[i] == 1) {
machine.state = STATE_C;
}
break;
case STATE_C:
// Do nothing, it's the final state.
break;
}
}
// The Moore output is simply the current state.
switch (machine.state) {
case STATE_A:
printf("Output: A\n");
break;
case STATE_B:
printf("Output: B\n");
break;
case STATE_C:
printf("Output: C\n");
break;
}
return 0;
}
Mealy 机器也是一种基于状态转换表现的状态机模型。该模型使用当前状态和输入的组合来确定下一个状态,同时也将输出作为函数来决定。
在这里,我们同样可以使用 Mealy 机器来实现产生“A”、“B”、“C”取决于以“10”或“11”结尾的输入。
// Mealy 机器
#include <stdio.h>
typedef enum {
STATE_A,
STATE_B,
STATE_C
} states;
typedef enum {
OUTPUT_A,
OUTPUT_B,
OUTPUT_C,
OUTPUT_NONE
} outputs;
typedef struct {
states state;
} mealy_machine;
outputs get_output(states state, int input) {
outputs output = OUTPUT_NONE;
switch (state) {
case STATE_A:
if (input == 1) {
output = OUTPUT_NONE;
}
break;
case STATE_B:
if (input == 0) {
output = OUTPUT_A;
} else if (input == 1) {
output = OUTPUT_C;
}
break;
case STATE_C:
output = OUTPUT_B;
break;
}
return output;
}
int main(void) {
int inputs[] = {1, 0, 1, 1}; // inputs: 10 11
mealy_machine machine = { .state = STATE_A };
for (size_t i = 0; i < sizeof(inputs)/sizeof(inputs[0]); ++i) {
outputs output = get_output(machine.state, inputs[i]);
switch (machine.state) {
case STATE_A:
if (inputs[i] == 1) {
machine.state = STATE_B;
}
break;
case STATE_B:
if (inputs[i] == 0) {
machine.state = STATE_A;
} else if (inputs[i] == 1) {
machine.state = STATE_C;
}
break;
case STATE_C:
// Do nothing, it's the final state.
break;
}
if (output != OUTPUT_NONE) {
switch (output) {
case OUTPUT_A:
printf("Output: A\n");
break;
case OUTPUT_B:
printf("Output: B\n");
break;
case OUTPUT_C:
printf("Output: C\n");
break;
}
}
}
return 0;
}
以上是 Moore 和 Mealy 机器的介绍及示例代码,希望对你有所帮助!