Язык AHDL


Выход из некорректных состояний


Логика, созданная для конечного автомата компилятором MAX+PLUS II, будет вести себя так, как Вы описали в файле TDF. Тем не менее проекты  конечных автоматов, которые точно объявляют биты состояния, и которые не используют позиционного кодирования, часто допускают значения битов состояния, которые не связаны с действительными состояниями. Эти не присвоенные значения называются не корректными состояниями. Проект, который вводит некорректные состояния, например, в результате нарушений времени предустановки и удержания, может приводить к неверным выходам. Хотя Altera рекомендует, чтобы входы конечного автомата удовлетворяли всем временным требованиям, Вы можете заставить конечный автомат принудительно вернуться из некорректного состояния в известное состояние с помощью оператора Case.

Для возвращения из некорректных состояний в проектах не использующих FLEX устройств, или проектов не использующих опцию позиционного кодирования, Вы должны назвать все некорректные состояния автомата. Предложение WHEN OTHERS в операторе Case, которое принуждает выполнить каждый переход из некорректного состояния в известное состояние, применяется только к состояниям, которые объявлены, но не упоминаются в предложении WHEN. Предложение WHEN OTHERS может форсировать принудительные переходы, только если все некорректные состояния объявлены в объявлении конечного автомата.

Для n-битного конечного автомата, существует 2n возможных состояний. Если Вы объявили n бит Вы должны продолжать добавлять имена фиктивных состояний до тех пор, пока количество состояний не достигнет степени 2. Файл recover.tdf, приведенный ниже, содержит автомат, который может возвращаться из некорректных состояний.

SUBDESIGN recover

(

   clk : INPUT;

   go  : INPUT;

   ok  : OUTPUT;

)

VARIABLE

   sequence : MACHINE

            OF BITS (q[2..0])

            WITH STATES (  



               idle,

               one,

               two,

               three,

               four,

               illegal1,   

               illegal2,   

               illegal3);

BEGIN

   sequence.clk = clk;

   CASE sequence IS

      WHEN idle =>

         IF go THEN

            sequence = one;

         END IF;

      WHEN one =>

         sequence = two;

      WHEN two =>

         sequence = three;

      WHEN three =>

         sequence = four;

      WHEN OTHERS =>

         sequence = idle;

   END CASE;

   ok = (sequence == four);

END;

Этот пример содержит 3 бита: q2, q1, и q0. Следовательно существует 8 состояний. Так как объявлено только 5 состояний, были добавлены 3 фиктивных состояния.



Содержание раздела