Moor & Mealy FMS及三段式状态机写法

理论

Moor & Mealy 有限状态机的区别

有限状态机(Finite State Machine,FSM)包含几个要素: 输入、状态、状态转移条件、输出。这里讨论的两种状态机区别在于输出的产生:

  • Moore状态机:时序逻辑的输出只与当前状态有关。
  • Mealy状态机:时序逻辑的输出不仅取决于当前状态,还与输入有关。
    注:这两种状态机可以相互转换

有限状态机的几种写法及区别

  1. 一段式:
    只有一个always block,把所有的逻辑(输入、输出、状态)都在一个always block的时序逻辑中实现。这种写法不利于维护,容易出错,不推荐。

  2. 二段式:
    有两个always block:状态切换用时序逻辑描述、次态判断和输出用组合逻辑描述。
    这种写法条理清晰,但输出由组合逻辑描述因此可能存在竞争和冒险,产生毛刺。若要解决毛刺,一般要对状态机的输出用寄存器打一拍,但很多情况不允许插入寄存器节拍,此时应使用三段式描述。

  3. 三段式:
    有三个always block:状态切换和输出用时序逻辑描述、次态判断用组合逻辑描述。
    输出逻辑也用时序逻辑块描述,可以解决毛刺问题。由于时序逻辑输出实质也是对输出打一拍,为了解决比组合逻辑慢一拍的问题,三段式写法应用次态作为输出判断条件

示例

来自HDLbits的一个问题实现串行求补器对【无符号】【负数】求补
求法:负数的补码等于他的原码自低位向高位,的第一个‘1’及其右边的‘0’保持不变,左边的各位按位取反,符号位不变。

Moor状态机实现

  1. 次态判断和状态切换
	parameter S0=0,S1=1,S2=2,S3=3;
	//位反转前输出0,1状态,反转后输出0,1态
    reg[1:0] state,next;
 always@
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以按照以下步骤安装Moor数据库: 1. 在 `pubspec.yaml` 文件中添加 `moor_flutter: ^3.3.0` 依赖。 2. 运行 `flutter pub get` 命令,以获取并安装依赖项。 3. 在 `lib` 文件夹中创建一个新的文件夹,例如 `database`。 4. 在 `database` 文件夹中创建一个新的 `.dart` 文件,例如 `app_database.dart`。 5. 在 `app_database.dart` 文件中,导入 `moor_flutter` 并创建一个数据库类,例如: ```dart import 'package:moor_flutter/moor_flutter.dart'; part 'app_database.g.dart'; @UseMoor(tables: [TodoItems, Categories], daos: [TodoDao, CategoryDao]) class AppDatabase extends _$AppDatabase { AppDatabase() : super(FlutterQueryExecutor.inDatabaseFolder( path: 'db.sqlite', logStatements: true)); @override int get schemaVersion => 1; } ``` 在此示例中,我们创建了一个 `AppDatabase` 类,并且它使用了 `TodoItems` 和 `Categories` 表和 `TodoDao` 和 `CategoryDao` DAO。 6. 运行 `flutter pub run build_runner watch` 命令,以生成 `.g.dart` 文件。 7. 现在,你可以在应用程序中使用 `AppDatabase` 类来执行数据库操作。 ```dart final database = AppDatabase(); // 插入一个TodoItem await database.todoDao.insertTodoItem(TodoItem( name: 'Buy milk', completed: false, categoryId: 1, )); // 获取所有TodoItems final todoItems = await database.todoDao.getAllTodoItems(); // 更新一个TodoItem final itemToUpdate = todoItems.first; itemToUpdate.completed = true; await database.todoDao.updateTodoItem(itemToUpdate); // 删除所有已完成的TodoItems await database.todoDao.deleteCompletedTodoItems(); ``` 这就是使用Moor数据库的基本步骤。记得在 `pubspec.yaml` 文件中添加 `build_runner` 依赖项,如果你没有安装它的话。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值