Правильный способ изменить состояние конечного автомата в VHDL - PullRequest
0 голосов
/ 01 марта 2019

Я работаю над проектом FPGA, где мне нужно читать данные с датчика изображения.Этот датчик имеет различные режимы изображения (например, тестовый шаблон, кадр, группирование и т. Д.), И для изменения режима изображения мне нужно искать определенные сигналы перед записью в регистры.

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

Что касается изменения режима изображения, используется конечный автомат.

Следующий фрагмент кода показывает, какрегистры для смены режима в данный момент пишутся.По сути, когда мы хотим изменить режим, нам нужно подождать, пока сигнал MODE_SIG_HIGH станет высоким, прежде чем записывать в регистры.Затем, когда это условие происходит, мы проверяем, какой режим мы хотим установить.Например, чтобы установить заданный тестовый шаблон, мы проверяем, установлен ли бит S2.Затем мы выполняем все операции для фактического изменения режима (строка 10).

01. ...
02. WHEN MODE_SIG_HIGH =>
03.   NEXT_ST <= MODE_SIG_HIGH;
04.   ...
05.   IF S2 = '1' THEN 
06.     -- configure the sensor to            
07.     NEXT_ST <= CONFIGURE_TEST_PATTERN;
08.   END IF; 
09.   ...
10.   WHEN CONFIGURE_TEST_PATTERN =>
11.   ...

У меня спор с моим другом о том, как лучше всего изменить состояние, когда происходит новое событие.Приведенное выше решение не кажется мне правильным.Насколько я понял, когда мы входим в состояние, все инструкции, содержащиеся в этом состоянии, выполняются параллельно.Поэтому, что касается вышеупомянутого фрагмента кода, когда мы входим в состояние MODE_SIG_HIGH, инструкция в строке 03 выполняется параллельно условию IF.Я хочу сказать, что если бит S2 установлен в 1, условие IF является истинным, и мы заканчиваем тем, что присваиваем значение CONFIGURE_TEST_PATTERN для NEXT_ST.Это приводит к тому, что два разных значения присваиваются одной и той же переменной (параллельно) в строке 03 и в строке 07. Прав ли я или я упускаю какое-то базовое поведение?Причина наличия инструкции в строке 3 заключается в том, что после того, как мы введем MODE_SIG_HIGH, могут пройти несколько тактов, прежде чем мы увидим один из установленных битов режима.

1 Ответ

0 голосов
/ 02 марта 2019

Насколько я понял, когда мы входим в состояние, все инструкции, содержащиеся в этом состоянии, выполняются параллельно.

Не совсем.Единственные вещи в VHDL, которые являются параллельными («выполняются параллельно»):

  1. процессы
  2. одновременные назначения сигналов
  3. экземпляры компонентов
  4. параллельные вызовы процедур
  5. одновременные утверждения (вкл. PSL)
  6. создает
  7. блоков

код внутри процессаили подпрограмма (функция / процедура) выполняется последовательно .Здесь вы делаете свое обычное программирование, используя последовательные операторы (т. Е. ничто в списке выше).Это ваши стандартные управляющие конструкции (if, case, loop и т. Д.), Последовательные назначения сигналов и т. Д.Если вы выполняете сигнальные (или переменные) назначения в последовательной области, последняя выигрывает, как и обычный язык программирования.Есть правила планирования, которые делают это возможным, но вам не нужно знать о них (пока!)

...