Vhdl 模拟器和合成器初始化状态机的区别
我的问题是关于合成状态机中使用的第一个状态 我正在与Lattice iCE40 FPGA合作,它是模拟的EDA游乐场,也是Lattice合成的菱形程序员 在下面的示例中,我生成了一系列信号(该示例仅显示了引用状态机的行)。这在模拟中效果很好;i、 e.访问的第一个案例是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,
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;