- •Введение
- •Классы и объекты
- •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
... Районы, кварталы, жилые массивы ...
В разделах "ТИПЫ ДАННЫХ" и "ПОДРОБНО О STD_LOGIC" мы уже встречались с массивами. Как известно, массив — именованный набор однотипных переменных, доступ к которым осуществляется по индексу. Массивы могут быть одномерными и многомерными, что определяется количеством индексов. При использовании массивов в VHDL, разработчику следует учитывать, что синтезаторы обычно не поддерживают многомерные массивы, за исключением массивов векторов. Массив не может состоять из файлов.
В зависимости от наличия или отсутствия размерности, объявление типа массива может быть двух видов:
type type_name is array (range) of element_type;
type type_name is array (type range <>) of element_type;
Первый вид используется для типов с заданной размерностью и при объявлении объекта размерность уже будет задана типом:
type BYTE is array (7 downto 0) of BIT; -- объявили 8-ми битовый тип
signal BYT1 : BYTE; -- объявили 8-ми битовый массив
Второй вид используется для типов без размерности, тогда размерность должна указываться при объявлении объекта:
type MATRIX is array (POSITIVE range <>) of REAL; -- объявили вектор реальных чисел
signal MATRIX1 : MATRIX(1 to 3); -- объявили вектор из трех реальных чисел
Можно ли обойтись без массивов в VHDL? Можно. Но чем крупнее проект, тем проще Вам будет с массивами, нежели без них. Вот несколько примеров применения массивов - всевозможные шины, регистры, счетчики, сумматоры, ОЗУ, ПЗУ и т. д. и т. п. И чем больше разрядность этих устройств, тем сложнее обойтись без массивов.
Операции в языке vhdl
... операция: действие, воздействие, деятельность, сделка, поход, кампания, дело, дельце...
Мы не будем рассматривать подробно каждую операцию языка VHDL, пологая, что здесь люди образованные. Просто перечислим, какие операции в VHDL можно использовать:
логические операции (and, or, nand, nor, xor, xnor);
операции сравнения (=, /=, <, <=, >, >=);
операции сдвига (sll, srl, sla, sra, rol, ror);
операции сложения (+, -, &);
операции смены знака числа (+, -);
умножение деление (*, /, mod, rem);
прочие (**, abs, not)
Отметим, что операции перечислены в порядке увеличения приоритета выполнения (т. е. от низшего к высшему). Ну и как обычно, при равенстве приоритетов, операции выполняются слева направо и скобки дают высший приоритет. Ну и чтоб не было скучно, можем продемонстрировать на простом примере один подводный камень, с которым сталкиваются практически все начинающие разработчики на VHDL. Пусть у нас будет такой VHDL-код:
signal x, y, z : std_logic;
....
x <= '1' when ( y = '1' and z = '0') else '0';
теперь пусть сигнал х должен управлять чем-либо по if - else, а чтобы сэкономить время на вводе с клавиатуры, копируем выделенное красным и вставляем в следующий VHDL-код:
if (x <= '1') then
...
else
...
end if;
Вам может показаться это смешным, а бывали случаи, что молодые специалисты по нескольку дней разбирались, почему это у них никогда не выполняется ветка else и потом приходили и говорили, что у них глючит САПР. А с точки зрения психологии, это вполне нормально. Вспомните нашу математику, и Вы поймете, что у нас принято две разные операции – сравнения и присваивания обозначать одним словом «равняется» и одним знаком «=». Кто забыл, напомним такие выражения – "если х равен y" и "х равен y". В английском эти операции разделены на equality и set.
