- •Введение
- •Классы и объекты
- •Constant - константа.
- •Variable - переменная;
- •Signal - сигнал;
- •Комментарии
- •Типы данных
- •Подробно о std_logic
- •Операции в языке vhdl
- •О массивах в языке vhdl
- •Операторы vhdl
- •Интерфейс
- •Inout - двунаправленный порт (чтение и запись);
- •Архитектура
- •Часть, содержащую описания (декларации);
- •Часть, содержащую исполняемые операторы.
- •Процессы
- •Атрибуты
- •Подпрограммы vhdl
- •Библиотеки vhdl
- •Тестирование
- •Im_cpu(res, '0', ale, wr, oe, cs, X"0000", addr, X"00", data); -- Вызываем имитатор
- •Im_cpu(res, '0', ale, wr, oe, cs, X"0021", addr, X"3", data); -- Разрешаем индикацию
- •Заключение
- •Приложение а
Атрибуты
... а компьютер считался атрибутом буржуазного общества.
Атрибуты - это различные характеристики объектов VHDL. Они делятся на предопределенные и пользовательские. Мы рассмотрим и те и другие, хотя использование пользовательских атрибутов очень обременительно и мало что дает, но может кому-то и понравится.
Предопределенные атрибуты делятся на три группы - атрибуты сигналов, атрибуты массивов и атрибуты типов. Давайте мы их так и будем рассматривать. В таблице 1 приведены атрибуты сигналов, в таблице 2 - массивов, в таблице 3 - типов данных.
Таблица 1
Атрибут |
Описание |
S'active |
TRUE, если было присвоение, но текущее значение еще прежнее |
S'delayed(t) |
Значение сигнала, существовавшее на время t перед вычислением данного атрибута |
S'event |
TRUE, если происходит изменение сигнала |
S'last_active |
Время от последнего присвоения значения сигналу до момента вычисления атрибута |
S'last_event |
Время от последнего изменения сигнала до момента вычисления атрибута |
S'last_value |
Последнее присвоенное сигналу значение |
S'stable(t) |
TRUE, если не происходило изменение сигнала в течение времени t |
S'transaction |
TRUE, если происходит очередное присвоение значения сигналу |
S'quiet |
FALSE, если было присвоение, но текущее значение еще прежнее |
Таблица 2
Атрибут |
Описание |
A'left(N) |
Левая граница N-го индекса массива А |
A'right(N) |
Правая граница N-го индекса массива А |
A'high(N) |
Верхняя граница N-го индекса массива А |
A'low(N) |
Нижняя граница N-го индекса массива А |
A'range(N) |
Диапазон N-го индекса массива А |
A'reverse_range(N) |
Обратный диапазон N-го индекса массива А |
A'length(N) |
Длина диапазона N-го индекса массива А |
Таблица 3
Атрибут |
Описание |
T'base |
Базовый тип данных |
T'left |
Левая граница значений T |
T'right |
Правая граница значений T |
T'high |
Верхняя граница значений T |
T'low |
Нижняя граница значений T |
T'pos(X) |
Позиция значения Х в наборе значений Т |
T'val(N) |
Значение элемента в позиции N набора значений Т |
T'succ(X) |
Значение в наборе значений T, на одну позицию большее X |
T'pred(X) |
Значение в наборе значений T, на одну позицию меньшее X |
T'succ(X) |
Значение в наборе значений T, на одну позицию вправо от X |
T'pred(X) |
Значение в наборе значений T, на одну позицию влево от X |
Несколько слов о пользовательских атрибутах в языке VHDL. Раньше было модно назначать пины микросхемы прямо в VHDL-коде через пользовательские атрибуты, и компилятор брал эти значения и минуя синтезатор передавал их разводчику. Но сейчас такое почти нигде не практикуется. Во первых Вы можете не знать на этапе написания VHDL-кода, какую микросхему примените, во вторых сам компилятор может не знать, каким разводчиком Вы воспользуетесь, потому что серьезные разработчики практически не пользуются программами "все в одном флаконе", да и нет сейчас таких фирм, чтобы сами все делали, все равно синтезаторы от одной фирмы, компиляторы от другой, разводчики от третьей, а симуляторы от четвертой, все это в одну оболочку собрали и обозвали, к примеру, КВАРТУС II.
Но в качестве примера такие атрибуты подойдут в самый раз:
entity example is
port (res, clk : in std_logic;
data_in : in std_logic_vector(3 downto 1);
data_out : out std_logic_vector(3 downto 1)
);
attribute pinnum : string;-- Определили атрибут pinnum
attribute pinnum of res signal is "5";-- Здесь и далее назначаем пины
attribute pinnum of clk signal is "9";
attribute pinnum of data_in signal is "11, 12, 13";
attribute pinnum of data_out signal is "18, 20, 64";
end example;
Ну вот вроде и все про атрибуты в языке VHDL.
Так вот, чтобы поймать строб сигнала, нам как раз подходит атрибут S'event. Посмотрите в таблице 1. S'event дает TRUE, если происходит изменение сигнала, а это ни что иное как фронт сигнала (строб). Такой атрибут любой синтезатор воспримет правильно и подключит его ко входу синхронизации тригера, что нельзя сказать о других атрибутах, которые в основном используются для моделирования или носят вспомогательные функции.
Итак, мы выбрали атрибут, но этого мало. Еще нужно указать какой фронт ALE мы будем ловить. Для определенности, пусть нам нужно срабатывание по переднему фронту - ----/----. Тогда это будет соответствовать выражению clk'event and clk = '1'. Только не будем торопиться писать код, это мы сделаем в следующем разделе.
