Введение в стандарт IEEE. Справочное руководство по языку VHDL (Пересмотр стандарта IEEE. 1076-1987), страница 6

Этот раздел описывает создание синхронного триггера в VHDL. Примеры показывают схемное решение и VHDL эквиваленты.

     Большинство программируемых топологических элементов прибора это регистры или элементы памяти, которые могут быть описаны с помощью D-триггеров. Пример ниже иллюстрируют разнообразные стили описания регистров.


Общий стиль для D-триггера имеет вид:

library ieee;

use ieee.std_logic_1164.all;

use ieee.numeric_std.all;

entity dtype is

  port (d, ck : std_logic;

q     : out std_logic);

end;

architecture behavior of dtype is

begin

 process (d, ck)

 begin

if ck = '1' and ck'event then

q <= d;

end if;

 end process;

end behavior;

Альтернативой, может быть более компактный подход:

library ieee;

use ieee.std_logic_1164.all;

use ieee.numeric_std.all;

entity dtype is

port (d, ck : std_logic;

q     : out std_logic);

end;

architecture behavior of dtype is

begin

process

begin

wait until ck'event and ck='1';

q <= d;

end process;

end behavior;

     Примеры выше выводят повышающиеся фронты синхроимпульса. Чтобы определить падение на границе синхроимпульсов, скорректируйте выражение VHDL, которое описывает состояние синхроимпульса:

if ck = '0' and ck'event then ...

Использование в портах данных типа std_logic. Тип данных std_logic - привилегированный тип данных, для связи между VHDL и схематическими модулями проекта. Девять состояний, изображаемые типами данных учитывают изображение наиболее общих цифровых состояний системы и позволяют варьировать решение, когда множественные выводы управляются общим узлом, как в шине передачи данных. Модель dtype включает три std_logic порта типа: d, ck, и q.

     Включение входных сигналов в список чувствительности процессов VHDL. Вообще, все сигналы и порты, используемые в правой стороне выражений, в пределах процесса VHDL должны быть включены в список чувствительности того процесса. В первом примере образец архитектуры dtype включает один процесс со списком чувствительности: d и ck.

Триггеры и регистры могут также быть сгенерированы при помощи инструкций потока данных (в противоположность процессу) с использованием блока GUARDED.

b2 : block (ck'event and ck='1')

begin

output_foo <= GUARDED input_foo ;

end block ;

     Прибавляя инструкцию GUARDED, мы всталяем триггер между input_foo и output_foo, так как output_foo выражение блока определяющее фронт синхроимпульса.

Регистровые банки.

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

signal DATA,Q_OUT, CLK: std_logic;

...

process (CLK)

variable A,B: std_logic ;

begin

if (CLK'event and CLK='1') then

Q_OUT <= B ;

B := A ;

A := DATA ;

end if ;

end process ;

     В этом случае, переменные A и B используются прежде, чем они определены. Поэтому, они передают значения от последнего запущенного процесса, в котором определено значение, задержанное на один тактовый цикл. Если переменные определены прежде, чем они используются, вы получите другую программу:

signal DATA,Q_OUT,CLK: std_logic;

...

process (CLK)

variable A,B: std_logic;

begin

if (CLK'event and CLK='1') then

A := DATA ;

B := A ;

Q_OUT <= B ;

end if ;

end process ;

     Использование переменных может привести к неожиданным результатам. Здесь, A и B определены прежде, чем используется, и поэтому не генерируют триггер. Вместо этого, они генерируют провод. Только один триггер остается между DATA и Q_OUT из-за назначения сигнала в синхронизированном процессе.

     Триггер и регистры могут также быть сгенерированы при помощи инструкций потока данных (в противоположность процессу) при использовании блока GUARDED.