我们如何在VHDL中设置FSM初始状态?

问题描述 投票:2回答:1

在VHDL上实现状态机时,我想知道如何设置输出/当前状态的初始条件。我读了关于here的一个问题。

其中一个答案说我们在案例结构之前做了初始化:

process(currentstate, a)
begin
  b <= '1';
  c <= '1';
  case currentstate is
    when s1 =>
      if (a = '1') then
        c <= '0';
      end if;

      nextstate <= s2;

然而,当我们进入这个过程时,这不会让我们自动设置b<='1'c<='1'吗?因此,如果我们处于一个状态A并且我们处于移动到B的条件,只要我们进入这个过程,这直接使b<='1'c<='1'不是真的吗?

或者它实际上只是在我们启动程序后运行然后在案例结构中受限制?

还要检查this link

在他们的FSM实现中,他们没有指定初始状态编译器或FPGA如何确定启动状态?

logic vhdl
1个回答
3
投票

您正在查看的行未执行初始化。

b <= '1';
c <= '1';

请记住,VHDL是一种硬件描述语言,而不是编程语言。这两个分配的作用是为这些信号设置默认分配,除非此过程中的其他内容与这些分配相矛盾。您可以在一个进程中多次分配相同的信号,并且最后发生的任何分配都将优先考虑。这节省了必须编写如下代码:

case State is
  when s1 =>
    a <= '0';
    b <= '1';
    c <= '1';
  when s2 =>
    a <= '1';
    b <= '0';
    c <= '1';
  when s2 =>
    a <= '1';
    b <= '1';
    c <= '0';
end case;

它可能最终变得非常重复并且容易在许多状态下具有相同的分配,因此默认分配可以真正整理它:

a <= '1';
b <= '1';
c <= '1';
case State is
  when s1 =>
    a <= '0';
  when s2 =>
    b <= '0';
  when s2 =>
    c <= '0';
end case;

相同的模式适用于if语句,您不希望在每个逻辑分支中覆盖每个输出信号。

如果您想要初始状态,根据场景,有两种方法可能适用。在这里你可以在启动时断言reset来设置初始状态。请注意,case语句位于一个时钟进程内:

process (clk)
begin
  if (rising_edge(clk)) then
    if (reset = '1') then
      State <= s1;
    else
      case State is
        when s1 =>
          State <= s2;
        when s2 =>
          State <= s1;
      end case;
    end if;
  end if;
end process;

另一个选项是使用初始值定义状态信号:

signal State : state_type := s1;

我不会深入探讨使用初始值的优缺点,因为现有的问题可以探讨这一点。

© www.soinside.com 2019 - 2024. All rights reserved.