Разница в инициализации конечного автомата между симулятором и синтезатором - PullRequest
0 голосов
/ 21 мая 2018

Мой вопрос касается первого состояния, используемого в синтезированном автомате.

Я работаю с ПЛИС решетки 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;

Однако, если я сделаю одно изменение следующим образом (обозначено как «ИЗМЕНЕНИЕ»), я получу набор сигналов, которые мне требуются.

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;

Может кто-нибудь объяснить, что происходит, пожалуйста?Я делаю что-то неправильно?Буду благодарен за любые предложения.

1 Ответ

0 голосов
/ 21 мая 2018

В симуляции, все в VHDL по умолчанию равно левому значению.В вашем коде это будет sm_init_lattice, что объясняет, почему ваша симуляция проходит.

Однако я не вижу сигнала сброса.Таким образом, в вашем оборудовании триггеры, которые хранят состояние вашего FSM, будут сброшены до некоторых состояний, но это, вероятно, не та комбинация, которая представляет состояние sm_init_lattice.

Без вашего изменения в аппаратном обеспечении, FSM, возможно, инициализируется до некоторого состояния около sm_end, и, когда он перейдет в это состояние, он останется там.Внося изменения, вы позволяете FSM совершать больше кругов по дорожке, поэтому он будет проходить через все состояния, независимо от того, в каком состоянии он изначально находится.

Решение состоит в том, чтобы осуществить надлежащий сброс (либо асинхронный, либо асинхронный).или синхронные - люди, работающие на ПЛИС, похоже, предпочитают синхронные).

Использование перечисляемых типов для машин конечного кода полезно, потому что код легко читать и поддерживать, вам не нужно фиксировать какие-либо кодировки состояний.и вы увидите, в каком состоянии находитесь на дисплее формы сигнала.Однако использование перечисляемых типов для кодирования конечных автоматов не позволяет моделировать унифицированное состояние, что, вероятно, является причиной вашей проблемы.System-Verilog превосходит VHDL в этом отношении, потому что можно объявить перечислимый тип, который также может быть неизвестен.

...