Vhdl 模拟器和合成器初始化状态机的区别

Vhdl 模拟器和合成器初始化状态机的区别,vhdl,simulation,fpga,synthesis,ice40,Vhdl,Simulation,Fpga,Synthesis,Ice40,我的问题是关于合成状态机中使用的第一个状态 我正在与Lattice iCE40 FPGA合作,它是模拟的EDA游乐场,也是Lattice合成的菱形程序员 在下面的示例中,我生成了一系列信号(该示例仅显示了引用状态机的行)。这在模拟中效果很好;i、 e.访问的第一个案例是sm_init_lattice,并生成所需的信号)。然而,合成的版本直接进入sm_端,并停留在那里。因此,输出信号保持低 -- state machine type t_SM_peaks is (sm_init_lattice,

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

我正在与Lattice iCE40 FPGA合作,它是模拟的EDA游乐场,也是Lattice合成的菱形程序员

在下面的示例中,我生成了一系列信号(该示例仅显示了引用状态机的行)。这在模拟中效果很好;i、 e.访问的第一个案例是
sm_init_lattice
,并生成所需的信号)。然而,合成的版本直接进入
sm_端
,并停留在那里。因此,输出信号保持低

-- 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;
——状态机
类型t_SM_峰为(SM_初始晶格,
sm_高_启动、sm_低_启动、sm_峰值、sm_结束);
信号r_smu_峰值:t_smu峰值;
p_数组\u INTS\u标准日志\u 2D:进程(i_Clk)为
开始
如果上升沿(i_Clk),则
案例r_SM_peaks为
当sm_init_lattice=>
...
r_SM_峰
...
r_SM_峰
...
r_SM_峰
...
r_SM_峰
...
r_SM_峰
r_SM_峰
...
r_SM_峰
...
r_SM_峰
...
r_SM_峰
...
r_SM_峰
...
--更改-将“sm_end”替换为“sm_init_lattice”

--r_SM_峰值在模拟中,VHDL中的所有内容都默认为其左侧值。在您的代码中,这将是
sm_init_lattice
,这解释了模拟通过的原因

但是,我没有看到复位信号。因此,在硬件中,存储FSM状态的触发器将重置为某些状态,但这可能不是表示
sm_init_lattice
状态的组合

如果没有您的更改,在硬件中,FSM可能正在初始化到
sm_end
附近的某个状态,当它进入该状态时,它将保持在那里。通过进行更改,您允许FSM在赛道上多跑一圈,因此它将在所有状态下前进,不管它最初发现自己处于什么状态

解决方案是实现适当的重置(异步或同步-FPGA人们似乎更喜欢同步)


使用枚举类型对状态机进行编码是很好的,因为代码易于阅读和维护,您不必提交任何状态编码,并且可以在波形显示上看到您所处的状态。但是,使用枚举类型对状态机进行编码并不能使您对单元化状态进行建模,这可能是问题的原因。System Verilog在这方面优于VHDL,因为它可以声明枚举类型,而枚举类型也可能是未知的。

我来这里只是因为你的新问题。看起来您已编辑了原始问题以添加新问题。这意味着在编辑之前产生的任何答案对未来的谷歌来说都没有意义。请您将编辑内容回滚,如果您有新问题,请提问。谢谢您的评论,Matthew。我将按照建议创建一个新问题。对于Xilinx和Intel Altera,通过
信号r_SM_peaks:t_SM_peaks:=SM_init_lattice
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;