Триггер представляет собой синхронный элемент и описывается процессом на VHDL или процедурным блоком always на Verilog. В списке чувствительности достаточно привести тактовый сигнал, и, если есть, вход синхронного сброса или установки, поскольку изменение других сигналов не оказывает немедленного влияния на выход триггера.

Описание D-триггера приведено ниже.

library IEEE;

use IEEE.STD_LOGIC_1164.ALL;

 

entitydff is

    Port ( clk : in  STD_LOGIC;

d : in  STD_LOGIC;

q : out  STD_LOGIC);

enddff;

 

architecture Behavioral of dff is

 

begin

 

process(clk)

begin

ifrising_edge(clk) then

    q <= d;

end if;

end process;

 

endBehavioral;

 

Комбинируя различные условия внутри процедурного блока, можно получить варианты триггера с различными особенностями поведения. К дополнительным сигналам, управляющим поведением триггера, обычно относятся:

ce (ClockEnable, разрешение счета), также обозначаемый как en (Enable, разрешение) – сигнал, разрешающий изменение состояния триггера. Высокий уровень на этом входе разрешает выполнение оператора q<= d.

reset (сброс) – сигнал сброса, устанавливающий триггер в состояние нуля. Различают синхронный сброс, выполняющийся по фронту тактового сигнала (обычно его и обозначают как reset), и асихронный, выполняющийся немедленно при появлении высокого уровня, который обычно обозначают как clr (clear, очистка).

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

Кроме того, все управляющие сигналы могут иметь как высокий, так и низкий логический уровень, при котором условие их появления считается истинным. Такой уровень для сигналов также называют активным. Иными словами, если при появлении единицы на входе reset происходит сброс триггера, то говорят, что активным уровнем для входа reset является высокий, т.е. сигнал логической единицы. Активный низкий уровень часто используется в схемах, выполненных по технологии РТЛ или ТТЛ, где возможно использование схемы «монтажное ИЛИ». При такой схеме входной сигнал с помощью резистора подключался к положительной цепи питания, что обеспечивало «слабый» уровень логической единицы. При этом любой активный выход, который устанавливал уровень логического нуля, перекрывал единицу, установленную резистором.

Поведение триггера при одновременном действии нескольких сигналов с противоположным смыслом определяется описанием на VHDL/Verilog. Например, если сначала проверить сброс, а потом установку, то сброс будет обладать приоритетом, поскольку при успешной проверке условия его наступления будет выполнено присвоение выходу нуля, и дальнейшие проверки выполняться не будут. Некоторые примеры описания триггеров показаны ниже.

Триггер с синхронным сбросом.

process(clk)

begin

ifrising_edge(clk) then

if reset = ‘1’ then

      q <= ‘0’;

else

      q <= d;

end if;

endif;

endprocess;

 

Триггер с асинхронным сбросом и разрешением счета. 

process(clk, reset)

begin

if reset = ‘1’ then q <= ‘0’;

elsifrising_edge(clk) then

ifce = ‘1’ then

      q <= d;

end if;

end if;

endprocess;

 

Триггер определенного типа может быть добавлен и на структурном уровне, в виде аппаратного примитива. Ниже показана установка в проект триггера с входами разрешения счета и синхронного сброса.

FDRE_inst : FDRE

generic map (

INIT => '0') –- Начальное состояние ('0' or '1') 

portmap (

Q =>Q,      -- Выход

C =>C,      -- Тактовый вход

CE =>CE,    -- Вход разрешения счета

R =>R,      -- Вход синхронного сброса

D =>D       -- Вход данных

   );

 

Различные варианты построения триггера находятся в справочной системе САПР. Общей рекомендацией для элементной базы, выполненной с соблюдением технологических норм 90 нм и менее (Spartan-3, Virtex-4 и более новые семейства FPGAXilinx), является использование только синхронных сигналов сброса и установки. Кроме того, желательно ограничиться только одним входом управления (сброс или установка). Не следует использовать сигнал сброса, если он предназначен только для инициализации триггера в начальный момент работы, сразу после программирования ПЛИС, поскольку начальные значения триггеров логических ячеек не являются случайными, а принудительно устанавливаются в процессе загрузки конфигурации. Таким образом, отказ от лишнего входа сброса облегчает трассировку проекта, не занимая дополнительные программируемые ресурсы. Это же положительно сказывается на максимальной тактовой частоте, поскольку проект, перенасыщенный управляющими сигналами, требует большого количества трассировочных линий, которые в противном случае могли бы быть заняты другими цепями, для которых важно добиться малых задержек распространения.

Категорически не рекомендуется каким-либо образом разрывать сигнал тактовой цепи, например, с помощью логического вентиля И, управляя таким образом работой триггера. Для разрешения или запрещения срабатывания по фронту тактового сигнала следует использовать вход разрешения счета ce, который реализован в триггерах ПЛИС аппаратно. Подача на тактовый вход сигнала, прошедшего через логический генератор, ведет за собой более пологий фронт нарастания тактового сигнала, а также его отставание по времени от основного тактового сигнала, который подается на остальные элементы проекта. Это ведет к весьма негативному эффекту «гонки фронтов», когда триггер уже нельзя считать работающим синхронно с остальными компонентами проекта, и он может захватывать значение на входе данных, относящееся как к состоянию на предыдущем такте, так и уже обновленное состояние (что является неправильным с точки зрения построения синхронных схем). Этот эффект особо опасен тем, что его появление является непредсказуемым, а поведение неустойчиво – некорректное поведение может проявляться при повторной трассировке того же проекта с другими настройками САПР, для отдельных микросхем в большой партии, или как перемежающаяся неисправность в одной и той же микросхеме при изменении температуры и/или напряжения питания. Идентификация подобных эффектов и методы устранения являются в очень большой степени эмпирическими, и, в то же время, использование только глобальных тактовых сигналов кардинально решает данную проблему. При проектировании, таким образом, следует обращать внимание на то, чтобы все события для триггеров и элементов на их базе происходили строго по фронту тактового сигнала, который формируется соответствующим аппаратным блоком (DLL, DCM, PLL, MMCM для разных семейств FPGA) и подается в логические ячейки по глобальным тактовым линиям, имеющимся во всех семействах FPGA. Использование примеров, приведенных выше, соответствует данному требованию.

Регистр представляет собой многоразрядный триггер, и описывается тем же способом. Фактически, основной процедурный блок остается для регистра таким же, как и для триггера, а изменяется объявление портов.

entity reg8 is

    Port ( clk : in  STD_LOGIC;

d : in STD_LOGIC_VECTOR(7 downto 0;

q : out STD_LOGIC_VECTOR(7 downto 0);

enddff;

 

Для регистра сохраняются те же правила проектирования, что и для триггера.

  =  Перейти к содержанию  =