子状态机

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
  • 是否需要初始化?

    在VHDL中 创建信号或向量时是否需要初始化 如果忘记初始化信号或整数值会发生什么 In 模拟 如果你这样做not设置一个初始值 向量的每个元素都会得到default值 这是由 VHDL 语言规范定义的 对于枚举类型 这是枚举类型中定义的第
  • 使用 VHDL 实例化 FPGA 中的 RAM

    我试图按照中的指导实现双端口 RAM这篇优秀的博文 http danstrother com 2010 09 11 inferring rams in fpgas 然而 ModelSim 在编译时给出以下警告 Warning fifo ra
  • 在VHDL中初始化记录数组

    我有一条记录定义如下 type ifx t is record data std logic vector 127 downto 0 address std logic vector 19 downto 0 WrReq std logic
  • 如何在 Sphinx 运行时预处理源文件?

    我已经为我的项目设置了 Sphinx 文档 并希望提取源文件的文档字符串并将它们嵌入到最终文档中 不幸的是 Sphinx 不支持源文件的语言 VHDL VHDL 似乎没有 Sphinx 域 所以我的想法如下 挂钩 Sphinx 运行并在 S
  • “警告 C0007:架构具有未绑定的实例”问题!

    我从 数字设计基础 一书随附的 CD 中获取了以下源代码 当我尝试运行该程序时 出现以下错误 Compiling Fig17 13 vhd C Users SPIDER Desktop EE460 The Final Project Fig
  • VHDL门控时钟如何避免

    我收到了避免使用门控时钟的建议 因为它可能会导致松弛和时序限制问题 但我想问一下我可以认为什么是门控时钟 例如 此代码对时钟进行门控 因为 StopCount 对它进行门控 process ModuleCLK begin if rising
  • 错误(10028):无法解析网络的多个常量驱动程序... VHDL 错误

    我正在尝试编写一个代码来检测 din 信号的上升沿 并在发生后将 doout 提高 5 个时钟周期 我在编译时不断收到不同的错误 但我不确定它们的含义 我认为我对 VHDL 中的一些概念缺乏基本的了解 但遗憾的是在网上查找并没有给我带来太大
  • 使用双寄存器方法解决亚稳态问题

    为了解决Verilog中不同时钟域引起的亚稳态 采用双寄存器方法 但据我所知 亚稳态的最终输出尚未确定 输出独立于输入 那么 我的问题是如何保证使用双寄存器方法输出的正确性 Thanks 您不能完全确定您避免了亚稳态 正如您所提到的 亚稳态
  • Quartus初始化RAM

    我制作了一个实体 其中 quartus 成功识别 RAM 并为其实例化 RAM 宏功能 如果我可以从文件初始化 RAM 那就太好了 我找到了制作此类文件 mif 文件 的教程 现在我已经创建了该文件 我不知道如何让 quartus 初始化该
  • 是否可以使用循环创建同一组件的多个实例?

    我有一个组件 Component CAU is port CLK in std logic RESET in std logic START in std logic V DIRECTION in vector 3d P ORIGIN in
  • 如何将数组类型作为泛型类型参数传递给 VHDL 包?

    我正在 VHDL 2008 中开发通用包 列表 该包具有元素类型的泛型类型 如果我在包中声明此元素类型的数组类型 那么它就是一个新类型 所以对于例如整数 我的新整数数组将与 ieee 库中的整数向量不兼容 所以我还需要传入数组类型 例如in
  • 如何在 VHDL 中将整数作为十六进制写入标准输出?

    我可以打印一个integer作为十进制到标准输出 library std use std textio all entity min is end min architecture behav of min is begin process
  • 将有限状态机转换为正则表达式

    有没有工具 或算法 来转换有限状态机 into a 正则表达式 不是相反 那很容易 有几种算法可以执行此任务 Brzozowski 和 Mc Cluskey 的 状态消除法 线性方程组的求解 McNaughton 和 Yamada 的方法等
  • 在VHDL中将8位二进制数转换为BCD

    该算法众所周知 您进行 8 次左移 并在每次移位后检查个位 数十位或数百位 每个 4 位 如果它们超过 4 个 则将 3 个添加到该组中 依此类推 这是一个基于流程的解决方案 但不起作用 它会编译 但输出不是我想要的 有什么想法可能是什么问
  • 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 中使用 SB_RGBA_DRV 原语

    我在使用为 Lattice ICE40UP fpga 提供的 SB RGBA DRV 原语时遇到问题 技术库提供了一个 verilog 示例 我可以使用它 但是当我尝试在 VHDL 中使用它时 P R 失败 输出以下消息 错误 非法连接 S
  • VHDL (Xilinx) 中的错误:无法链接设计

    为什么我在 VHDL 中遇到错误 另外 有时 无法执行流程 因为之前的流程失败了 非常感谢 永久解决方案1 在win 10上 找出 installation directory Xilinx 14 x ISE DS ISE gnu MinG
  • VHDL:如何声明可变宽度通用[重复]

    这个问题在这里已经有答案了 我想创建一个 VHDL 实体 其中一个泛型可以更改另一个泛型的宽度 entity lfsr n is generic WIDTH integer 32 counter width POLYNOMIAL std l
  • VHDL 中的 if 语句

    我有一个关于 VHDL 中 if 语句的问题 请参见下面的示例 signal SEQ bit vector 5 downto 0 signal output bit if SEQ 000001 and CNT RESULT 111111 t

随机推荐