- •Введение
- •Классы и объекты
- •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-кода двойным штрихом и действуют до конца строки:
-------------------------------
-- Пример комментариев --
-------------------------------
--
-- Управление индикаторами сигналов LINK
nLEDL1 <= GND when nLINKA ='0' else TRI; -- канал А
nLEDL2 <= GND when nLINKB ='0' else TRI; -- канал В
--
Вообще старайтесь в комментариях отображать логику работы VHDL кода или назначение тех или иных объектов, а не переводить итак понятный VHDL-код на русский язык.
-------------------------------
-- Пример бесполезных
-- комментариев
-------------------------------
--
x <= '0'; -- Приравниваем сигнал х нулю.
--
Вот в принципе и все, что можно сказать о комментариях.
Типы данных
... гуляют тут разные типы, прохода от них нет.
Про типы обычно долго и нудно ведут пояснения и рассуждения. Мы этого делать не будем, просто покажем их объявления в библиотеке std с нашими комментариями:
type boolean is (false,true); -- логический тип
type bit is ('0', '1'); -- битовый тип
type character is ( -- символьный тип nul, soh, stx, etx, eot, enq, ack, bel, bs, ht, lf, vt, ff, cr, so, si, dle, dc1, dc2, dc3, dc4, nak, syn, etb, can, em, sub, esc, fsp, gsp, rsp, usp, ' ', '!', '"', '#', '$', '%', '&', ''', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~', del, c128, c129, c130, c131, c132, c133, c134, c135, c136, c137, c138, c139, c140, c141, c142, c143, c144, c145, c146, c147, c148, c149, c150, c151, c152, c153, c154, c155, c156, c157, c158, c159, -- the character code for 160 is there (NBSP), -- but prints as no char ' ', 'Ў', 'ў', 'Ј', '¤', 'Ґ', '¦', '§', 'Ё', '©', 'Є', '«', '¬', '', '®', 'Ї', '°', '±', 'І', 'і', 'ґ', 'µ', '¶', '·', 'ё', '№', 'є', '»', 'ј', 'Ѕ', 'ѕ', 'ї', 'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я' );
type severity_level is (note, warning, error, failure); -- перечислимый тип
type integer is range -2147483647 to 2147483647; -- целый тип
type real is range -1.0E308 to 1.0E308; -- вещественный тип
type time is range -2147483648 to 2147483647; -- целый тип
По аналогии пользователь может создавать свои типы данных, например, определим перечислимый тип - день недели:
type day_t is (mon, tue, wen, thu, fri, sat, sun);
signal day : day_t;
day <= mon;
Сразу нужно отметить, что приведенный выше перечислимый тип вполне синтезируемый, но на кристалле он будет уже работать в виде ноликов и единичек. Синтезатор просто переведет данное множество значений в цифровое. Какое будет множество? А все зависит от настроек, например такое: {"000", "001", ...,"110"}, а может такое: {"0000001", "0000010", ...,"1000000"}
Типы могут иметь подтипы (subtype). Так в библиотеке STD определены следующие подтипы:
subtype natural is integer range 0 to integer'high;-- подтип натуральных чисел
subtype pozitive is integer range 1 to integer'high;-- подтип положительных чисел
Здесь integer'high - наибольшее значение типа integer. В данном случае integer'high = 2147483647 и наоборот integer'low = -2147483647. Но это больше касается атрибутов, о которых мы поговорим позже.
Конечно, не обойтись без массивов и векторов:
type string is array (positive range <>) of character;
type bit_vector is array (natural range <>) of bit;
signal adddr : bit_vector (7 downto 0); -- определили 8-ми битовый вектор
constant txt : string := "VHDL"; -- определили строковую константу
Все библиотечные типы std переопределять нет необходимости, они по умолчанию подключаются к проекту. Чтобы уж окончательно разобраться с библиотекой STD, давайте просмотрим ее до конца:
units -- единицы времени fs; ps = 1000 fs; ns = 1000 ps; us = 1000 ns; ms = 1000 us; sec = 1000 ms; min = 60 sec; hr = 60 min; end units;
subtype delay_length is time range 0 fs to time'high;
impure function now return delay_length;
type file_open_kind is ( read_mode, write_mode, append_mode); -- вид доступа к открываемому файлу
type file_open_status is ( open_ok, status_error, name_error, mode_error); -- результат открытия файла
attribute foreign : string; -- атрибуты рассмотрим позже
attribute syn_enum_encoding : string;
attribute syn_enum_encoding of character : type is "sequential";
Ну кажется все. Теперь давайте попробуем все это систематизировать:
