【问题标题】:VHDL: Mealy machine and button press detectionVHDL:Mealy 机器和按钮按下检测
【发布时间】:2015-09-05 13:22:31
【问题描述】:

您好,我对使用 VHDL 实现 Mealy 状态机有点困惑。我现在的工作是这样的:

process(clk, rst)
begin
    if rst = '1' then
        state <= s1;
    elsif (clk'event and clk = '1') then
        state <= next_state;
    end if;
end process;

还有一个这样的过程:

process(state, op)
begin
    case state is
    when s1 =>
    ...some implementation
end process;

现在的问题是:我需要检测用户对按钮的按下,但我不确定将它放在哪里。它应该在第一个过程中还是在第二个过程中?另外,我还看了下面的指南:implement state machine in FPGA,网页上的Mealy机器可以只用一个进程吗?如果是这样,那么我认为工作会更容易。谢谢!

【问题讨论】:

    标签: vhdl fpga


    【解决方案1】:

    你应该把它放在第二个过程中。第一个过程仅用于更改状态,next_state 也在第二个过程中计算。

    有多种编写 FSM 的方法,人们出于各种原因倾向于选择其中一种。选择适合您的。

    【讨论】:

      【解决方案2】:

      你不能设计一个只有一个进程的 Mealy 状态机。即使是摩尔状态机,在大多数情况下,也无法仅使用一个进程进行建模。

      状态机总是有一个状态寄存器,必须用同步过程建模。也就是说,敏感度列表仅包含时钟(如果它们是异步的,则设置或重置信号)的过程。

      同步过程的每个输出都将合成为寄存器的输出,因为它的值仅在时钟边缘发生变化(加上异步设置或复位的状态,如果有的话)。因此,您不能在与状态寄存器相同的同步过程中描述 Mealy 状态机的输出。如果你这样做了,它就不再是 Mealy 机器了,因为它的输出不再依赖于输入。

      对于摩尔机器,事情要稍微微妙一些,但除了非常特殊的情况外,您还需要至少两个进程。当我编写“进程”时,我将进程简写包括在内,例如并发信号分配、并发过程调用或组件/实体实例化。

      为了简单起见:如果您清楚地了解所需的硬件,则用于综合的 VHDL 建模很简单。

      • 绘制硬件框图,清楚地标明寄存器和组合部分。
      • 绘制包围硬件元素的气泡,每个进程一个气泡,遵守如果气泡包含寄存器,则其所有输出必须是寄存器输出的规则。

      同步进程是那些包含寄存器的进程。他们的代码完全正确:

      process(clk)
      begin
        if rising_edge(clk) then
          <your code>
        end if;
      end process;
      

      把你的代码放在&lt;your code&gt;,永远不要把代码放在别处。如果您有异步设置或重置代码必须类似于:

      process(clk, reset)
      begin
        if reset = '1' then
          <initialize outputs>
        elsif rising_edge(clk) then
          <your code>
        end if;
      end process;
      

      其他过程是组合过程。列出它们的所有输入信号 (INPUTS) 和输出信号 (OUTPUTS)。代码必须为:

      process(INPUTS)
      begin
        <your code>
      end process;
      

      每个 OUTPUT 信号必须在每次执行过程中分配一个值。保证这一点的最佳方法是使用 all OUTPUTS 的默认分配开始该过程。

      就是这样。绘制并编码您所看到的。奖励:每个穿过您的流程气泡边界的箭头都是您必须声明的信号,除非它已经是您设计的主要输入或输出。

      练习:画出 Mealy 状态机的框图,并理解为什么不能用单个进程对其进行建模。还要理解为什么它总是可以用两个过程建模,即使它不一定是可取的。最后,尝试确定摩尔状态机只能用一个进程建模的罕见情况。

      【讨论】:

      • 什么东西被称为可能不是很重要,但是你把那些包含状态信号并显示在参考中的常见单进程的东西叫做什么?
      • 本网页显示的代码不是 Mealy 状态机的代码,因为所有的输出都是同步分配的,也就是寄存器的输出。因此,输入和输出之间没有组合路径,这是 Mealy 机器的特征。描述的是一个摩尔机器,它的状态是(op, current_state)组合。
      • 我的观点是,根据您对 Moore FSM 的定义,它们一点也不例外,真实状态与代码中的状态信号不同。这就是为什么许多人喜欢将其视为具有注册输出的 Mealy FSM。同样,更重要的问题是各种构造的优缺点,而不是名称。之前已经在 SO 上讨论过,例如 stackoverflow.com/questions/19463359/…
      • 有趣的讨论,但在我看来,它忽略了最重要的一点,即当您链接 Mealy 机器时,关键路径会不断增加。不是编码风格的问题,而是传播延迟的问题。因此,我更喜欢基于输入和输出之间的组合路径或不明确定义 Mealy / Moore。此外,逻辑合成器完全转换逻辑,VHDL 代码中的注册输出成为状态的一部分。因此,您可以认为注册输出 Mealy 最终是真正的摩尔机器。
      • 恕我直言 = 你错了 ;-) 但我同意你关于没有长组合路径的观点。这就是人们使用一个进程状态机的原因。他们将注册所有输出,并避免两个进程 FSM 的其他问题,如我链接的旧 SO 线程中所讨论的。由于没有通用的 Mealy 和 Moore 定义,因此这些名称不能用于确定是否使用了良好的设计实践。
      猜你喜欢
      • 2015-12-11
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 2019-04-27
      • 1970-01-01
      • 2015-04-12
      相关资源
      最近更新 更多