子状态机

2023-11-29

我有一个有 5 个州的 FSM。其中3个是通过子FSM(UML模式)设计的。 对于 VHDL 中的实现,恕我直言,有两种方法可以做到这一点:

  1. 将它们总结为一个,这样我就有了一份包含子 FSM 的文档和一个包含一个大 FSM 的产品。

  2. 与所有州建立一个 FSM。对于每个具有子 FSM 的状态,使用来自大状态机的使能信号构建一个独立的 FSM。

这不存在什么更好的问题,我认为两种方式都有其优点和缺点。但对于 VHDL 实现来说,哪种方式更“干净”呢?

type my_big_one is (ONE,TWO_one, TWO_two, THREE_one, THREE_two, FOUR,FIVE);

vs.

type my_one is (ONE, TWO, THREE, FOUR, FIVE);
type two_fsm is (TWO_one, TWO_two);
type three_fsm is (THREE_one, THREE_two);

分层 FSM 也是一种可行的解决方案;例如

type main_state is (ONE, TWO, THREE, FOUR, FIVE);
type inner_state is (inner_one, inner_two);
signal main  : main_state;
signal inner : inner_state;

...
case main is
when ONE => something_simple;
            main <= TWO;
            inner <= inner_one; -- reset inner SM
when TWO => case inner is
            when inner_one => ...
            when inner_two => ...
            end case;
when THREE => case inner is ...

如果走向极端,这将变得难以控制。但是,如果内部状态机相对简单,则这可能比三个单独的状态机及其握手更清晰、更简洁,而握手除了同步之外没有任何作用。

我有时会使用这种模式,例如 SM 必须向 UART 发送一系列消息,而“内部”状态则处理驱动 UART 的细节(可能使用消息中字符的计数器)。

我不会教条地认为总体上哪个是更好的解决方案,这取决于上下文......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

子状态机 的相关文章

  • vhdl中的4位加法器

    我对 vhdl 语言还很陌生 所以请耐心等待 我刚刚为 1 位加法器编写了 vhdl 代码 但在为 4 位加法器编写时遇到了麻烦 这就是我到目前为止所得到的 如果有人能指出我要查找的内容的正确方向 那就太棒了 VHDL代码 LIBRARY
  • 整数到字符串在综合中出错(宽度不匹配)

    我正在尝试将整数转换为字符串 使用integer image val 并将其填充或限制为特定长度 我已经制作了这个函数 当我使用时它可以很好地完成工作report陈述并模拟 function integer2string pad val i
  • VHDL:IEEE std_logic 库中的真值表

    我研究了 IEEE 如何定义其库 当我打开的时候标准逻辑库 我看到了一些被定义为常数的真值表 我不知道真值表是如何运作的 请解释如何使用真值表返回结果 这是我找到的 AND 门 TYPE stdlogic table IS ARRAY st
  • 请帮助我解决VHDL编译错误[重复]

    这个问题在这里已经有答案了 library IEEE use IEEE std logic 1164 all entity doorlock is port reset in std logic enable in std logic pa
  • VHDL:进程块内的多个上升沿检测

    我对 VHDL 以及一般的数字电路 还很陌生 我正在尝试使用 BCD 样式块实现两位数的计数器 该电路的外部有一些按钮 按下这些按钮时 会将感兴趣的数字加一 很像闹钟 这是一个异步操作 会在某种形式的编辑模式下发生 外部强制 我编写的代码在
  • “警告 C0007:架构具有未绑定的实例”问题!

    我从 数字设计基础 一书随附的 CD 中获取了以下源代码 当我尝试运行该程序时 出现以下错误 Compiling Fig17 13 vhd C Users SPIDER Desktop EE460 The Final Project Fig
  • 错误(10028):无法解析网络的多个常量驱动程序... VHDL 错误

    我正在尝试编写一个代码来检测 din 信号的上升沿 并在发生后将 doout 提高 5 个时钟周期 我在编译时不断收到不同的错误 但我不确定它们的含义 我认为我对 VHDL 中的一些概念缺乏基本的了解 但遗憾的是在网上查找并没有给我带来太大
  • 模拟器和合成器之间初始化状态机的差异

    我的问题是关于合成状态机中使用的第一个状态 我正在使用莱迪思 iCE40 FPGA 用于仿真的 EDA Playground 和用于综合的莱迪思 Diamond Programmer 在下面的示例中 我生成一系列信号 该示例仅显示引用状态机
  • 使用 1 位 ALU 制作 16 位 ALU

    你好 我正在尝试从几个 1 位 ALU 创建一个 16 位 ALU 我创建了一个名为 basic alu1 的包 其中包含 1 位 ALU 的组件 其代码是 library ieee use ieee std logic 1164 all
  • ACTIV HDL - VHDL -“信号无法合成,同步描述错误”

    我在 Xilinx 中综合此代码时遇到错误 这个错误是 信号 Z 1 无法合成 同步描述错误 entity uk3 is port rst in BIT C in INTEGER clk in BIT S out INTEGER end u
  • VHDL 中数组的硬件表示

    使用 VHDL 我想要一些寄存器 每个寄存器存储 16 位 所以我发现VHDL有一个内置数组 我想用它来存储iy中每个元素的16位 所以我想知道VHDL是否将此数组映射到实际寄存器 简短的回答是否定的 数组类型不映射到寄存器 长答案 VHD
  • VHDL 中的 NULL 语句

    其实际目的是什么nullVHDL 中的声明 考虑以下代码 1 CASE s IS BEGIN WHEN 0 gt y lt 0 WHEN 1 gt NULL END CASE 2 CASE s IS BEGIN WHEN 0 gt y lt
  • VHDL - 为什么直接在函数上使用长度属性会产生警告?

    我有一个 VHDL 函数 它返回记录的 std logic vector 表示形式 并且我想要该 std logic vector 的长度 我可以直接在函数上使用长度属性 为什么这会在 ModelSim 中产生警告 我是否会引发一些微妙的问
  • 学习 VHDL 的最佳方法? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • vhdl代码(for循环)

    描述 我想编写 vhdl 代码来查找数组 A 中的最大整数 该数组是一个由 20 个整数组成的数组 问题 我的算法应该是什么样子 以输入顺序语句的位置 我的VHDL代码 highnum for i in 0 to 19 loop i 0 i
  • 仅使用 std_logic_vector 包将 std_logic_vector 与常量进行比较

    我仅在 VHDL 文件中使用以下包 library IEEE use IEEE STD LOGIC 1164 ALL 在代码中 我将 std logic vector 信号 A 与常量值进行比较 例如 if A lt 00001011 th
  • 在单周期数据路径中加载半字和加载字节

    有人询问如何在单周期数据路径中实现加载字节而无需更改数据存储器 解决方案如下 替代文本 http img214 imageshack us img214 7107 99897101 jpg http img214 imageshack us
  • VHDL FSM多驱动网Q连接到常量驱动程序,其他驱动程序被忽略,我的代码有什么问题?

    这段代码是一个 FSM 它是一个摩尔机 艾莉莎 P 哈克 Alyssa P Hacker 有一只蜗牛 沿着纸带爬下去 上面有 1 和 0 蜗牛 每当最后两个时都会微笑 它爬过的数字是 01 设计摩尔和米利 蜗牛大脑的 FSM 代码如下所示
  • 32x8 寄存器文件 VHDL 测试台

    我已经用 vhdl 编写了该电路的汇编代码 我想用测试台来模拟它 RegWrite 1 位输入 时钟 写寄存器个数 3位输入 写地址 写入数据 32 位输入 数据输入 读取 寄存器编号 A 3 位输入 读取地址 读取寄存器编号 B 3 位输
  • 如何将参数传递给 `transitions` 库中的 on_enter 回调?

    我想用过渡 https pypi org project transitions 并且需要一个我在文档中找不到的相当琐碎的功能 并且想知道它是否已实现 我想定义一个on enter在某些状态上回调 但将参数传递给该回调 至少知道我是从哪个状

随机推荐