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

Logic 如何在VHDL中设置FSM初始状态?,logic,vhdl,Logic,Vhdl,在VHDL上实现状态机时,我想知道如何设置输出/当前状态初始条件。我读了上面的一个问题 其中一个答案是我们在案例结构之前进行初始化: process(currentstate, a) begin b <= '1'; c <= '1'; case currentstate is when s1 => if (a = '1') then c <= '0'; end if; nextstate <=

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

其中一个答案是我们在案例结构之前进行初始化:

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

      nextstate <= s2;
进程(当前状态,a)
开始

b您正在查看的行没有执行初始化

b <= '1';
c <= '1';
另一个选项是使用初始值定义状态信号:

signal State : state_type := s1;

我将不讨论使用初始值的利弊,因为存在一些问题来探讨这一点。

在我通过链接提供的代码中,如果程序员没有明确说明初始条件,FPGA如何解释初始条件?根据我的示例,他们在时钟过程中实现了重置。他们已经实现了一个两进程的状态机,这是毫无意义的,你可以把所有东西都放在一个时钟进程中,就像我的例子一样。好吧,当下载到FPGA时,他们必须先重置它来启动系统?严格地说,行为是未定义的。在基于SRAM的FPGA中,默认初始值将为零,这通常对应于枚举状态类型中的第一个状态(
zero
,在链接到的示例中)。如果在合成工具中为状态机指定不同的编码(例如一个hot),我不确定会发生什么。对于计算类型,默认值将始终是第一个值。i、 e.
类型状态\类型为(s1,s2)然后
信号状态:状态类型将默认为
s1
a <= '1';
b <= '1';
c <= '1';
case State is
  when s1 =>
    a <= '0';
  when s2 =>
    b <= '0';
  when s2 =>
    c <= '0';
end 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;