Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Листинг 5. 1. Entity example IS. Architecture fsm of example IS. IF (reset = '1') THEN. Elsif (clk'event AND Clk = '1') THEN




Листинг 5. 1

LIBRARY ieee;

USE ieee. std_logic_1164. ALL;

USE ieee. std_logic_arith. ALL;

 

ENTITY example IS

   PORT (

        Ack, Addr7, Clk, Rd, Reset, WR                          : IN   std_logic;

          Busy, BusyR, BusyT                                : OUT std_logic;

ClrAddr, En, EnInc, Ld                                            : OUT std_logic;

        Str, StrS                                                                       : OUT std_logic:

           StrS2                                                                        : OUT std_logic           -- вставка 1        

  );

-- Declarations

END example;

-- hds interface_end

LIBRARY ieee;

USE ieee. std_logic_1164. ALL;

USE ieee. std_logic_arith. ALL;

 

ARCHITECTURE fsm OF example IS

  -- Architecture Declarations

   TYPE STATE_TYPE IS (Unit, Idle, Write, Read, Inc);

  -- State vector declaration

   ATTRIBUTE state_vector: string;

   ATTRIBUTE state_vector OF fsm: ARCHITECTURE IS " current_state" ;

  -- Declare current and next state signals

   SIGNAL current_state, next_state: STATE_TYPE;

Declare any pre-registered internal signals

   SIGNAL BusyR_int: std_logic;

 SIGNAL BusyT_cld: std_logic;

   SIGNAL StrS2_int: std_logic;             -- вставка 2

BEGIN

  ------------------------------------------------------------------

  clocked: PROCESS (Clk, Reset)

  ------------------------------------------------------------------

   BEGIN

IF (Reset = '1') THEN

       current_state < = Unit;

Default Reset Values

BusyR < = '0';

       BusyR_cld < = '0';

       StrS2 < = '0';                                    -- вставка 3

ELSIF (Clk'event AND Clk = '1') THEN

       current_state < = next_state;

       -- Registered output assignments

BusyR < = BusyR_int;

       StrR < = StrR_int;

StrS2 < = StrS2_int;                                      -- вставка 4

       -- Default Assignment To Internals

       BusyT_cld < = '0';

       -- Combined Actions for internal signals only

  CASE current_state IS

  WHEN Write =>

       IF (Emp = '1') THEN BusyT_cld < = '1';   END IF;

WHEN OTHERS =>

       NULL;

  END CASE;

END IF;

   END PROCESS clocked;

  ------------------------------------------------------------------

  nextstate: PROCESS (Ack, Addr7, Emp, Rd, WR, current_state)

  ------------------------------------------------------------------

   BEGIN

CASE current_state IS

WHEN Unit =>

       next_state < = Idle;

WHEN Idle =>

       IF (WR = '1') THEN next_state < = Write;

       ELSIF (Rd = '1') THEN next_state < = Read;

       ELSE next_state < = Idle;

       END IF;

WHEN Write =>

       IF (Emp = '1') THEN next_state < = Write;

       ELSIF (Ack = '1') THEN next_state < = Inc;

       ELSE next_state < = Write;

       END IF;

WHEN Read =>

       IF (Emp = '1') THEN next_state < = Read;

       ELSIF (Ack = '1') THEN next_state < = Inc;

       ELSE next_state < = Read;

       END IF;

WHEN Inc =>

       IF (Addr7 /= '1') THEN next_state < = Idle;

       ELSIF (Addr7 = '1') THEN next_state < = Unit;

       ELSE next_state < = Inc;

       END IF;

WHEN OTHERS =>

       next_state < = Unit;

END CASE;

   END PROCESS nextstate;

  ------------------------------------------------------------------

  output: PROCESS (Ack, Emp, Rd, WR, current_state)

  ------------------------------------------------------------------

   BEGIN

-- Default Assignment

        Busy                 < = '0'; BusyR_int      < = '0';

        ClrAddr          < = '0'; En                     < = '0';

        EnInc               < = '0'; Ld                     < = '0';

Str                     < = '0';               StrR_int           < = '0';

-- Default Assignment To Internals

        StrS2_int         < = '0';                                -- вставка 5

-- Combined Actions

CASEcurrent_state IS

WHEN Unit =>

       ClrAddr < = '1';

WHEN Idle =>

       IF ((Rd = '1') AND (WR = '0')) THEN StrS2_int < = '1'; -- вставка 6

       END IF;

WHEN Write =>

       En < = '1';     Ld < = '1';

       IF (Emp = '1') THEN

Busy < = '1';         

       END IF;

WHEN Read =>

       Str < = '1';         StrR_int < = '1';

IF (Emp = '1') THEN

Busy < = '1';     BusyR_int < = '1';

       END IF;

       IF (Ack='0') OR (Ack=’1’ AND Emp=’1’) THEN                StrS2_int < = '1'; -- вставка 7

         END IF;

WHEN Inc =>

       EnInc < = '1';

WHEN OTHERS => NULL;

END CASE;

   END PROCESS output;

  -- Concurrent Statements

  -- Clocked output assignments

  BusyT < = BusyT_cld;

END fsm;

 

Приведем основные выводы при рассмотрении этой программы-образца.

Программа написана в форме трех процессов и одного параллельного оператора назначения значения сигнала. Регистру памяти состояния автомата соответствует процесс по имени clocked, комбинационной схеме, определяющей следующее состояние автомата, – процесс nextstate, комбинационной схеме, определяющей значения выходных сигналов, – output. Для представления состояний автомата, входов и выходов использованы сигналы перечислимых типов. Декларации типов размешаются в разделе деклараций архитектурного тела, но могут объявляться и в пакете.

Регистр состояний представлен сигналом current_state. Так как регистр состояний является датчиком информации о текущем состоянии и одновременно приемником нового значения, во избежание гонок использован регистр с динамическим управлением. Выход комбинационной логики представлен сигналом next_state. Важно иметь в виду необходимость принудительного задания начального состояния автомата (оператор “ IF reset = ’1’ THEN …). Хотя в процессе моделирования по умолчанию при запуске устанавливается крайнее левое значение из списка значений, в синтезированной схеме установка по умолчанию игнорируется. Начальное значение не определено, а это может привести к любым непредсказуемым последствиям. После вычисления нового состояния и выходных сигналов в системах моделирования процесс переходит в состояние ожидания нового запускающего события (обратите внимание на то, что сигналы вычисляются на основе состояний, которые были перед фронтом тактирующего сигнала, а не вычисленных в текущем такте).

Как показывает опыт проектирования удобно описать функцию переходов и функцию выходов, используя оператор выбора CASE, при этом ключом выбора варианта служит сигнал, представляющий состояние. В каждом варианте описывают то, что происходит в автомате при том или ином значении входа. Хотя возможны и другие конструкции для задания закона функционирования, например, условный оператор.

В автомате Мили с асинхронными выходами и автомате Мура выход формируется комбинационной логической схемой. В программе это должно интерпретироваться параллельным оператором присваивания, а если алгоритм формирования выхода слишком сложный, то оператором PROCESS, список чувствительности которого включает все аргументы функции выходов (состояние, а для автомата Мили с асинхронными выходами также и вход).

Из девяти выходных сигналов примером основных видов сигналов служат  три сигнала Busy, BusyT и BusyR. Первый из них соответствует комбинационному типу, второй – тактируемому а третий – регистрируемому. Комбинационный сигнал повторяет на выходе автомата во времени возникновение и исчезновение условия с задержкой соответствующей задержке комбинационной схемы. Тактируемые и регистрируемые сигналы выставляются и снимаются на выходе по условию их формирования в моменты тактирования. Если длительность комбинационных сигналов совпадает с длительностью соответствующих им входным сигналам, то для тактируемых и регистрируемых сигналов длительность оказывается зависящей от условия их формирования и кратной периоду тактирования.

По схемотехническому назначению (целевому) управляющие сигналы систем могут быть отнесены к одному из двух классов – разрешающие (потенциальные) и непосредственно управляющие (импульсные). Для комбинационных сигналов (при значительной ярусности синтезируемой схемы) характерна потенциальная возможность появления ложных выбросов (пиков). По условиям их возникновения их временная привязка в тактируемой системе оказывается смещенной от фронта таковых сигналов. Поэтому появление пиков для разрешающих сигналов оказывается безопасным. В примере к этому классу сигналов можно (в соответствии с их именами) отнести сигналы En, EnInc и Ld.

Сигналы ClrAddr и Str (в соответствии с их именами) по-видимому, являются комбинационными сигналами импульсного типа. И если, например, сигнал ClrAddr планировался для использования в качестве асинхронного сигнала начальной установки счетчика, то паразитные импульсы могут сбрасывать счетчик в моменты времени не предусмотренные разработчиком. Моделирование синтезированного описания в САПР MAX+Plus II фирмы Altera показало, что ложные пики появляется у большинства комбинационных сигналов. Для сигнала Str были проведены дополнительные исследования. В проект был включен регистровый сигнал StrS (фрагмент автомата Мили с синхронными выходами), у которого ложные выбросы отсутствуют, но ценой за это является задержка на один такт автомата относительно сигнала Str. Поэтому изменение выхода происходит в следующем такте после соответствующего изменения состояния. Для соблюдения взаимного расположения сигналов временного кластера с сигналом StrS необходимо и остальные комбинационные сигналы кластера перевести в разряд регистрируемых.

Рассмотренное выше запаздывание на такт можно устранить только добавлением в текст программы, создаваемый САПР HDL Designer Series (и ей подобным), дополнительных конструкций. В них присваивания комбинационным частям выходных триггеров должны размещаться в операторах аналогичным операторам присваивания состояния, как и принято в программе 5. 1. Набор этих конструкций для сигнала StrS2 приведен в листинге 5. 1 с комментарием «вставка №Х».

На рис. 5. 9 приведена временная диаграмма работы автомата (листинг 5. 1),

 

 

 

Рис. 5. 9 Временная диаграмма работы автомата

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...