Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие_VHDL.doc
Скачиваний:
59
Добавлен:
13.11.2019
Размер:
3.18 Mб
Скачать

3.4. Контрольные вопросы

  1. Каков типовой порядок разделов структурного архитектурного тела?

  2. В каких случаях необходима декларация конфигурации, и какой смысл имеют элементы этого высказывания?

  3. Определите составляющие декларации компонента и оператора вхождения?

  4. Поясните условия исполнения оператора вхождения компонента?

Какова разница между позиционным сопоставлением и сопоставлением по имени списков соответствия.

4. Описание и синтез последовательностных схем

4.1. Триггеры и регистровые схемы

Понятие последовательностной схемы в общем случае соответствует схеме, содержащей элементы, способные сохранять свое состояние до появления заранее определенных сигналов (обычно называемых управляющими ) независимо от изменения других сигналов, называемых информационными. В структурном отношении последовательностные схемы состоят из двух составляющих: комбинационной логической схемы и памяти, через которую реализуется обратная связь. К этому классу относятся простые триггера, регистры и счетчики различного назначения, модули оперативной памяти (в данном учебном пособии не рассматриваются), цифровые автоматы. В принципе любое последовательностное устройство можно рассматривать как цифровой автомат, но, учитывая ряд особенностей синтеза и широкую распространенность цифровых автоматов общего вида, они, обычно, рассматриваются особо (см. раздел 5). Известно, что практически любая комбинационная схема, имеющая обратные связи, начинает обладать свойством сохранения предшествующего состояния (памятью). Схемы с памятью (триггеры, регистры, счетчики и т. д.) являются важнейшими представителями типовых средств цифровой техники. Подробнее о видах и принципах работы можно прочитать в литературе [6], [7].

Триггер по определению есть устройство с двумя устойчивыми состояниями (не считая переходных состояний). У триггеров чаще всего можно выделить два типа входных сигналов: управляющие и информационные. Изменение информационных сигналов в этом случае не вызывает каких либо изменений состояния триггеров. В практике наиболее часто используются следующие способы управления триггерами:

– асинхронное управление;

– статическое управление, или управление уровнем;

– динамическое управление, или управление фронтом;

– смешанные варианты.

Асинхронное управление характеризуется тем, что события на информационных входах непосредственно вызывают изменение состояния триггера. Асинхронное управление в чистом виде применяется относительно редко, в основном в целях начальной установки последовательностных устройств.

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

При динамическом управлении изменение состояния триггера происходит только непосредственно после фронта или спада сигнала на тактирующем входе. Новое состояние определяется сигналами на информационных входах в момент изменения управляющего сигнала.

Если проектируется БИС на микросхеме типа «море вентилей» (в англоязычной литературе их обычно их называют ASIC), то триггеры с потенциальным управлением занимают значительно меньшую площадь и имеют большее быстродействие по сравнению с триггерами с динамическим управлением. Поэтому их и следует использовать, если, конечно, в проекте предусмотрено отсутствие ситуаций, когда следующее за моментом изменения переключающего сигнала состояние является функцией от предыдущего состояния. Иначе обстоит дело при ориентации на реализацию в ПЛИС. Для большинства ПЛИС именно триггер с динамическим управлением является неотъемлемой частью логической ячейки. Даже интерпретация комбинационной схемы сводится к включению цепи «в обход» обязательно присутствующего триггера. Реализация в этой схемотехнике потенциального управления неэффективна и нецелесообразна. Эти соображения следует учитывать при выборе способа описания последовательностного устройства.

Свойство допустимости изменения состояния при изменении лишь некоторых сигналов можно описывать в VHDL различными способами (с помощью различных операторов).

Широко рекламируемым способом описания является описание с помощью параллельного оператора PROCESS, при этом управляющие сигналы включаются в список чувствительности или в выражения условий вложенного оператора ожидания WAIT, а информационные входы, которые сами по себе не изменяют состояние – не включаются. Состояние триггера после события на управляющем входе определяется его типом (функцией переходов и способом управления), предыдущим состоянием, сигналами на информационных входах, и задается оператором присвоения значения состоянию триггера, вложенным в этот процесс.

«Процессное» описание (листинг 4.1) может использоваться не только для отображения RS-триггеров, а может совмещаться с объявлением других способов управления при моделировании и реализации комбинированных триггерных структур. При этом необходимо учитывать способ и последовательность описания управляющих сигналов в теле процесса, так как этим обеспечивается их совместимость и относительные приоритеты.

Листинг 4.1 Описание триггера

ENTITY ff IS -- entity declaration

PORT ( -- port statement

R, S : IN std_logic;

Clk, Reset : IN std_logic;

Load, D : IN std_logic;

Q : BUFFER std_logic;_

);

END ff;

ARCHITECTURE one OF ff IS

Base_ff: PROCESS (Clk, Reset, R, S, D, Load)

BEGIN

IF Reset = '1' THEN Q <= '0';

ELSIF Clk'event AND Clk = '1' THEN

IF R = '1' THEN Q <= '0';

ELSIF S = '1' THEN Q <= '1';

ELSIF Load = '1' THEN Q <= D;

END IF;

END IF;

END PROCESS Base_ff;

END one;

Поведение триггера можно описать, опираясь не только на последовательные операторы, но и на параллельные. В качестве примера приведем архитектурное тело описания поведения триггера RS-триггера с динамическим управлением, имеющего вход асинхронного сброса (листинг 4.2).

Листинг 4.2 Описание RS-триггера с динамическим управлением

ARCHITECTURE two OF ff IS

SIGNAL Q_int: std_logic;

BEGIN

-- комбинационная часть элемента

Q_int <= '0' WHEN R = '1' ELSE '1' WHEN S = '1' ELSE Q;

-- собственно элемент памяти с динамическим управлением

Q <= '0' WHEN Reset = '1' ELSE Q_int WHEN Clk'event AND

Clk = '1' ELSE Q;

END two;

Несмотря на синтаксическую правильность фрагмента, чаще используется процессное представление тактирующей части регистровых схем (второй оператор в программе). Выбор процессного представления диктуется его адекватной трактовкой практически любой компилирующей или моделирующей САПР, а также соответствием описания структуре логических ячеек ПЛИС. При процессном представлении, внутри оператора PROCESS обычно пользуются операторами условия (IF) и выбора (CASE). В качестве примера рассмотрим архитектурное тело при процессном описании поведения RS-триггера (листинг 4.3).

Листинг 4.3

ARCHITECTURE three OF RS_FF IS

-- architecture " three" of entity ff

SIGNAL Q_int : std_logic;

BEGIN

ff: PROCESS (Clk, Reset, En, Q_int)

BEGIN

IF Reset = '1' THEN Q <= '0';

ELSIF Clk'event AND Clk = '1' THEN

IF En = '1' THEN Q <= Q_int;

END IF;

ELSE Q <= Q;

END IF;

END PROCESS base_ff;

Q_int <= '0' WHEN R = '1' ELSE '1' WHEN S = '1' ELSE

D WHEN Load = ‘1’ ELSE Q;

END three;

Целесообразность подобного описания связана с тем, что в операторе PROCESS у последовательного оператора условия IF окончание оператора ELSE является опционным и может опускаться, а у параллельного оператора в форме условного присваивания окончание оператора ELSE является обязательным. Подобное кажущееся несущественным отличие при синтезе комбинационных фрагментов может (в случаях соответствующих описаний фрагментов) порождать появление у них на выходах «неожиданных» триггеров-защелок (LATH). Хотя современные системы синтеза цифровых устройств обычно выдают соответствующие предупреждения (warning) о введении подобных триггеров, наверное, лучше взять за правило избегать возможностей появления подобных ситуаций.

Регистр – это набор триггеров, объединенных общими цепями управления. Описание многоразрядных схем с памятью (регистров) практически не отличается от описания одиночных триггеров. Соответственно регистры в программах удобно представлять процессами, список чувствительности которых включает управляющие сигналы, а в теле процесса находятся операторы присваивания, определяющие состояние триггеров регистра после изменений управляющих сигналов. Логика анализа условий выполнения операторов в теле этого процесса не отличается от такой же логики для одиночных триггеров. Состояния триггеров отражаются переменными или сигналами. Можно использовать групповое (скалярное) представление всего кода состояния или индивидуальные имена для отдельных триггеров регистра, однако чаще используется групповое представление. Представление в виде битового вектора (bit_vector или std_logic_vector) обеспечивает сочетание простоты описания групповых действий над содержимым регистра с простотой выделения информации о состоянии отдельных разрядов. В ряде случаев удобно использовать для представления содержимого регистра ограниченные целые и перечислимые типы данных. Такое представление может обеспечить большую наглядность и улучшить понимаемость программ. Примеры использования перечислимого типа имеются в следующем разделе.

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

Целесообразным вариантом построения регистровых схем следует считать построение описания в форме двух параллельных операторов. Первый оператор – оператор PROCESS, описывающий собственно многоразрядную память. Память имеет информационные входы, связанные с выходами комбинационной схемы, вход тактирования, , а также при необходимости может содержать цепи асинхронного сброса и предустановки и разрешения изменений состояния. Второй параллельный оператор – параллельный условный оператор назначения сигнала, реализующий требуемое функционирование схемы регистра или счетчика. В качестве примера рассмотрим 4-разрядный регистр сдвига влево, вправо с занесением начального значения, имеющий вход асинхронного сброса (листинг 4.4).

Листинг 4.4

ENTITY Reg_Shift IS -- entity declaration

PORT ( -- port statement

Clk, Reset : IN std_logic;

Load, Left, Right : IN std_logic;

En : IN std_logic;

D_in : IN std_logic_vector(3 DOWNTO 0);

Q : BUFFER std_logic_vector(3 DOWNTO 0)

);

END Reg_Shift;

ARCHITECTURE a OF Reg_Shift IS

-- architecture "а" of entity Reg_Shift

SIGNAL Q_int : std_logic_vector(3 DOWNTO 0);

BEGIN

base: PROCESS (Clk, Reset, Q_int)

BEGIN

IF Reset = '1' THEN Q <= "0000";

ELSIF Clk'event AND Clk = '1' THEN

IF En = '1' THEN Q <= Q_int;

ELSE Q <= Q;

END IF;

ELSE Q <= Q;

END IF;

END PROCESS base;

Q_int <= D_in WHEN Load = '1' ELSE '1' & Q(3 DOWNTO 1) WHEN

Right = '1' ELSE Q(2 DOWNTO 0) & '1' WHEN Left= '1' ELSE Q;

END;

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