Мой вопрос касается первого состояния, используемого в синтезированном конечном автомате.
Я работаю с Lattice iCE40 FPGA, EDA Playground для моделирования и Lattice's Diamond Programmer для синтеза.
В следующем примере я генерирую серию сигналов (в примере показаны только строки, относящиеся к конечному автомату). Это прекрасно работает в симуляции; т. е. первый кейс, к которому обращаются, это 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;
Кто-нибудь может объяснить, что происходит, пожалуйста? Я делаю что-то неправильно? Буду признателен за любые предложения.
signal r_SM_peaks : t_SM_peaks := sm_init_lattice;
- person JHBonarius   schedule 23.05.2018