Inferring Latch во вложенном операторе If-Else (VHDL) - PullRequest
0 голосов
/ 22 февраля 2019

У меня проблема с предполагаемой блокировкой моего кода.Я знаю, что защелка обычно возникает из-за того, что не учитываются все ситуации для выхода, но в этой ситуации я не видел ни одного онлайн-примера, который бы охватывал это.У меня есть вложенный оператор if-else в операторе процесса, как показано ниже.Просто, чтобы быстро объяснить, что я делаю, после инициализации сброса, reset_cnt достигнет высокого уровня и запустит процесс подсчета для sck до 24 циклов и повторится, и вывод будет увеличиваться.

clock_counter: process(reset, sck, counter, output, reset_cnt, reset_done)
begin
  if (reset = '1') then
    counter <= 0;
    output <= 1;
    reset_cnt <= 1;
    reset_done <= '1';
  else
    reset_done <= '1';   -- added to fix
    reset_cnt <= 1;      -- added to fix
    output <= output;          -- added to fix (didn't work)
    if (reset_cnt AND counter = 24) then
      counter <= 0;
      output <= output + 1;
    elsif (rising_edge(sck)) then
      counter <= counter + 1;
    end if;
  end if;
end process;

Изначально у меня была проблема с 3 защелками: reset_done, reset_cnt и output.Я добавил несколько строк кода (с комментариями рядом) и смог удалить защелки для reset_done и reset_cnt.Похоже, я все еще получаю вывод защелки, потому что я использую его во вложенном операторе If.Я думал:

output <= output;

может сработать, но я думаю, что нет.Кто-нибудь знает как починить такую ​​защелку?Я должен отметить, что я попытался разделить это на 2 оператора процесса и превратить его в оператор случая, но это тоже не сработало.Любая помощь или совет высоко ценится!

1 Ответ

0 голосов
/ 22 февраля 2019

Этот код абсолютно неверен.Это трудно исправить, потому что он объединяет несколько ошибок в одном процессе.

Я попытаюсь перечислить некоторые из ваших ошибок:

  1. В списке чувствительности не должны использоваться output и reset_done.
  2. output <= output + 1; не может быть синтезировано или создаст бесконечный цикл в симуляции
  3. , вам нужно разделить комбинационную и последовательную логику на два процесса
  4. reset_done иreset_cnt бесполезны, потому что они всегда '1'
  5. reset_cnt - это целое число, это не может быть AND с логическим значением из выражения counter = 24
  6. никогда не писать output <= output;

Предлагаю изучить комбинационные и последовательные процессы, а также шаблоны кодирования для VHDL.

...