-->

差在初始化模拟器和合成器之间的状态机(Difference in initializing a st

2019-09-30 01:02发布

我的问题是关于在合成的状态机使用的第一状态。

我用莱迪思FPGA iCE40的EDA游乐场进行仿真和莱迪思的钻石程序员工作的合成。

在下面的例子我生成的一系列信号(该示例仅示出了参考状态机器的线)。 这在模拟正常工作; 即访问的第一种情况是sm_init_lattice和所需的信号被产生)。 然而,合成版本直接转到sm_end并在那里停留。 作为结果的输出信号保持为低。

-- state machine
type t_SM_peaks is (sm_init_lattice,
                    sm_high_start_up, sm_low_start_up, sm_peaks, sm_end);

signal r_SM_peaks : t_SM_peaks;

p_ARRAY_INTS_STDLOG_2D : process (i_Clk) is
begin
  if rising_edge(i_Clk) then
    case r_SM_peaks is
      when sm_init_lattice =>
        ...
        r_SM_peaks <= sm_high_start_up;
      when sm_high_start_up =>
        ...
        r_SM_peaks <= sm_low_start_up;  
      when sm_low_start_up =>
        ...
        r_SM_peaks <= sm_peaks;
      when sm_peaks =>
        ...
        r_SM_peaks <= sm_end;                        -- peaks completed
      when sm_end =>
        ...
        r_SM_peaks <= sm_end;
      when others =>
        r_SM_peaks <= sm_high_start_up;
    end case;
  end if;

end process p_ARRAY_INTS_STDLOG_2D;

但是,如果我做一个变化如下(以“CHANGE”表示),那么我得到一套我需要的信号。

type t_SM_peaks is (sm_init_lattice,
                    sm_high_start_up, sm_low_start_up, sm_end, sm_peaks);

signal r_SM_peaks : t_SM_peaks;

p_ARRAY_INTS_STDLOG_2D : process (i_Clk) is
begin
  if rising_edge(i_Clk) then 
    case r_SM_peaks is
      when sm_init_lattice =>
        ...
        r_SM_peaks <= sm_high_start_up;
      when sm_high_start_up =>
        ...
        r_SM_peaks <= sm_low_start_up;
      when sm_low_start_up =>
        ...
        r_SM_peaks <= sm_peaks;
      when sm_peaks =>
        ...
        r_SM_peaks <= sm_end;                        -- peaks completed
      when sm_end =>
        ...
        -- CHANGE - swapped 'sm_end' for 'sm_init_lattice'
        --r_SM_peaks <= sm_end;
        r_SM_peaks <= sm_init_lattice;             
      when others =>
        r_SM_peaks <= sm_high_start_up;             
    end case;
  end if;

end process p_ARRAY_INTS_STDLOG_2D;

任何人能解释发生了什么吗? 难道我做错了什么? 我会的任何建议表示感谢。

Answer 1:

在模拟中,在VHDL违约率一切其左手价值。 在你的代码,这将是sm_init_lattice ,这就解释了为什么你的模拟传递。

不过,我看不出有任何的复位信号。 所以,在你的硬件,存储你的FSM的状态触发器将被重置为一些国家,但是这可能不是表示组合sm_init_lattice状态。

没有你的变化,在硬件上,FSM也许是初始化一些国家近sm_end和,当它进入此状态下,它会呆在那里。 通过使你的变化,你让FSM采取多跑几圈轮轨,所以它会在所有国家无论其最初所处的状态进行。

解决的办法是实现一个正确复位(异步或同步 - FPGA人们似乎更喜欢同步)。

使用枚举类型的编写状态机是不错的,因为代码很容易阅读和维护,你没有犯任何国家编码和你能看到你是什么状态的波形显示。 但是,使用枚举类型编写状态机不会让您模型中的unitialised状态,这可能是你的问题的原因。 系统的Verilog优于在这方面VHDL,因为它可以声明枚举类型也可以是未知的。



文章来源: Difference in initializing a state machine between a simulator and synthesizer