VHDL:Mealy机器和按钮检测

时间:2015-09-05 13:22:31

标签: vhdl fpga

您好我对使用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机器只使用一个进程是可以的吗?如果是这样,那么我认为工作会更容易。谢谢!

2 个答案:

答案 0 :(得分:0)

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

有几种方法可以编写FSM,人们倾向于因各种原因而偏向于其中一种。选择适合你的那个。

答案 1 :(得分:0)

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

状态机始终具有状态寄存器,必须使用同步过程建模。也就是说,灵敏度列表仅包含时钟的过程(如果它们是异步的,则设置或复位信号)。

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

对于摩尔机器来说,事情有点微妙,但除非在非常特殊的情况下,您还需要至少两个过程。当我写“进程”时,我包括进程短手,如并发信号分配,并发过程调用或组件/实体实例化。

简化:如果您能清楚地看到所需的硬件,那么合成的VHDL建模很简单。

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

同步过程是那些包含寄存器的过程。他们的代码完全

import requests         
url = requests.get(URL)
print url.status_code

将代码放入process(clk) begin if rising_edge(clk) then <your code> end if; end process; 永远将代码放在其他地方。如果您进行了异步设置或重置,则代码必须类似于:

<your code>

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

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

约束每个OUTPUT信号必须每次执行过程中分配一个值。保证这一点的最佳方法是使用所有 OUTPUTS的默认分配启动流程。

这就是全部。绘制并编码您所看到的内容。额外奖励:每个箭头越过一个过程气泡的边界是一个信号,除非它已经是您设计的主要输入或输出,否则您必须声明。

练习:绘制Mealy状态机的框图,并了解为什么不能使用单个进程建模。还要了解为什么它总是可以用两个过程建模,即使它不一定是可取的。最后,尝试确定仅使用一个进程建模Moore状态机的罕见情况。