Требуется ли назначение сигналов по умолчанию VHDL для переменных? - PullRequest
0 голосов
/ 26 сентября 2018

Я понимаю, что назначение сигналов по умолчанию полезно (даже необходимо) в VHDL, чтобы избежать неполного назначения и предполагаемых защелок.Я не могу выяснить, нужно ли это также для переменных.

Рассмотрим этот блок кода:

  test_sequencer : process(fpga_clock)
    variable sequencer_count : unsigned(3 downto 0) := (others => '0');
  begin
    if rising_edge(fpga_clock) then
      start_writing   <= start_writing;
      start_reading   <= start_reading;
      sequencer_count := sequencer_count; -- is this line necessary
      if not_every_fpga_clock = '1' then
        case sequencer_count is
          when x"4" =>
            start_writing <= '1';
          when x"12" =>
            start_reading <= '1';
          when others =>
            null;
        end case;
        if sequencer_count /= 15 then
          sequencer_count := sequencer_count + 1;
        end if;
      end if;
    end if;
  end process;

Строка, помеченная "необходима ли эта строка?"требуется?Я понимаю, что это должно быть там, если sequencer_count является сигналом.Это необходимо, когда sequencer_count является переменной?

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Ни одна из этих строк не обязательна:

  start_writing   <= start_writing;
  start_reading   <= start_reading;
  sequencer_count := sequencer_count; -- is this line necessary

Ни одна из них вообще ничего не делает.При полном назначении и выводе защелки возникает только проблема с комбинационной логикой.Это (синхронная) последовательная логика.Вам никогда не нужно беспокоиться о полном назначении с (синхронной) последовательной логикой.

Почему это?Что ж, в случае комбинационной логики, если у вас нет полного назначения, будет некоторая комбинация входов, которая приведет к пути через процесс, которому следует, в котором выход процесса (сигнал, управляемый им) делаетне получить присвоенное значение.Любой сигнал будет сохранять свое значение, пока не будет назначено новое значение.Следовательно, в случае неполного присвоения необходимо, чтобы результирующая схема запомнила (сохранила) состояние этого выхода.Следовательно, будет синтезирована какая-то схема, которая может хранить информацию.Это не будет триггер, потому что нет часов, вызовов функций rising_edge и т. Д .;вместо этого защелки будут синтезированы, чтобы сделать это, помня.Это вдвойне плохо, потому что (а) защелки в любом случае фундаментально плохи, и (б) вы хотели комбинационную логику, но получили последовательную.Это ошибка.

Однако в (синхронной) последовательной цепи у вас уже есть память.Шлепанцы можно рассматривать как 1-битные воспоминания.Следовательно, вам не нужно беспокоиться о полном назначении в (синхронном) последовательном процессе.Вы ожидаете, что полученная схема сможет хранить вещи.

0 голосов
/ 26 сентября 2018

Во-первых, назначения по умолчанию предотвращают защелки только при отсутствии часов - т.е. комбинационная логика.

В логике регистра / триггера (код, следующий за «ifising_edge (clock)»), назначения по умолчанию предотвращают условия удержания, которые являются нормальной частью логики регистра.Защелка никогда не будет произведена из кода под "ifising_edge (clock)".

OTOH, то, что у вас есть, я называю присвоением идентичности:

  start_writing   <= start_writing;
  start_reading   <= start_reading;
  sequencer_count := sequencer_count; 

Назначения идентичности не являются назначениями по умолчанию иуказать обратную связь явно.Это не мешает защелкам в комбинационной логике.

Назначение по умолчанию присваивает литеральное значение или значение из выходного сигнала комбинационной логики:

  start_writing   <= '0';
  sequencer_count := "0000";
  LedState <= LedNext;

Обратите внимание, что для объявления переменной в процессе инициализация выполняется толькокогда процесс разработан - что происходит в начале времени, а не каждый раз, когда процесс запускается:

variable sequencer_count : unsigned(3 downto 0) := (others => '0');

Это отличается от выполнения подпрограммы, которое создает и инициализирует переменные каждый раз, когда он вызывается.

0 голосов
/ 26 сентября 2018

В синхронном процессе, с rising_edge(fpga_clock), нет необходимости ни в назначении переменной по умолчанию, ни в назначении сигнала по умолчанию, и оба будут хранить значение до восходящих часов, если нет нового назначения при запуске процесса (выполнить) в результате восходящих часов.

То, что вы можете иметь в виду в отношении предполагаемых защелок, может быть связано с комбинаторным процессом, где защелка может быть выведена, если некоторые ветви оператора ifне присваивается управляемому сигналу, например:

process (d, en, q)
begin
    if en = '1' then
        q <= d;
    end if;
end process;

В этом случае q обновляется только в том случае, если en равно '1', поэтому вывод защелки удерживает значение qесли en равно '0'.

В качестве связанного комментария часто плохой стиль кодирования - использовать переменные для хранения состояния в последовательном (синхронизированном) процессе, и лучше объявить сигнал для sequencer_count,Причина в том, что стиль кодирования тогда одинаков для всех триггеров, и его легче отлаживать, поскольку переменные не отображаются в типичных сигналах моделирования.

...