Листинг 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|