18. Языки описания дискретных устройств. Основные элементы языка VHDL. HDL-программа - модель проектируемого устройства.
Языки описания дискретных устройств
Возрастающая степень интеграции ПЛИС, новые концепции проектирования (система на кристалле) накладывают свой отпечаток на способы описания проекта на ПЛИС. Языки описания аппаратуры (Hardware Description Language), являются формальной записью, которая может быть использована на всех этапах разработки цифровых электронных систем. Это возможно вследствие того, что язык легко воспринимается как машиной, так и человеком. Он может использоваться на этапах проектирования, верификации, синтеза и тестирования аппаратуры так же, как и для передачи данных о проекте, модификации и сопровождения. Одним из наиболее универсальных языков описания аппаратуры является VHDL, первый стандарт которого был разработан в 1983–1987 годах при спонсорстве минобороны США. На этом языке возможно как поведенческое, так структурное и потоковое описание цифровых схем. Языки описания аппаратуры (Hardware Description Language), служат для формального описания дискретных устройств вычислительной техники и могут быть использованы на всех этапах разработки цифровых электронных систем. VHDL может использоваться на этапах проектирования, верификации, синтеза и тестирования аппаратуры так же, как и для передачи данных о проекте, модификации и сопровождения.
VHDL поддерживает три различных стиля для описания аппаратных архитектур. Первый из них - структурное описание (structural description), в котором архитектура представляется в виде иерархии связанных компонентов.
Второй - потоковое описание (data-flow description), в котором архитектура представляется в виде множества параллельных операций языка, каждая из которых может управляться логическими сигналами. Потоковое описание соответствует стилю описания, используемому в языках регистровых передач.
И, наконец, поведенческое описание (behavioral description), в котором логические преобразования описываются последовательными программными предложениями, которые похожи на имеющиеся в любом современном языке программирования высокого уровня. Все три стиля могут совместно использоваться в одной VHDL программе.
Структурное и потоковое описание используется для проектирования цифровых схем, поведенческое - в основном для моделирования. Если посмотреть на язык VHDL глазами программиста, то можно сказать, что он состоит как бы из двух компонент - общеалгоритмической и проблемно-ориентированной. Проблемно-ориентированная компонента языка VHDL позволяет описывать цифровые системы в привычных разработчику понятиях и терминах. Сюда можно отнести: 1. понятие модельного времени (NOW) и параллелизма; 2. данные типа TIME, позволяющие указывать время задержки в физических диницах; 3. данные вида сигнал (signal),значение которых изменяется не мгновенно, как у обычных переменных, а с указанной задержкой, а также специальные операции и функции над ними; 4. средства обьявления объектов (entity), их архитектур (architecture) и конфигураций (configuration).
Объекты языка VHDL
Объекты это область хранения данных определенного типа. Создаются объекты посредством декларации объекта, например:
variable COUNT: INTEGER; В результате порождается объект с именем COUNT, который хранит целочисленную величину. Кроме того, COUNT декларируется как класс variable.
Объекты – данные могут быть трех классов: - сonstant (константа) - может хранить отдельное значение определенного типа. Это значение присваивается объекту в начале моделирования и не может изменяться в процессе моделирования. - variable (переменная) - объект этого класса может хранить отдельное значение определенного типа, однако, в процессе моделирования ему могут присваиваться различные значения. Для этого используются выражения присваивания (variable assignment statement). - signal (сигнал) – объект данного класса имеет предыдущее значение, имеет текущее значение и набор последующих значений.
Объекты класса signal моделируют проводные соединения в схемах, в то время как переменные (variable) и константы (constant) используются для моделирования поведения схемы, они аналогичны объектам, используемым в языках программирования C и Pascal. Декларация констант Декларации объектов (object declaration) имеют целью дать имя объекту, объявить его тип, класс и даже присвоить значение. Примеры деклараций констант описаны ниже:
constant RISE_TIME: TIME := 10ns; constant BUS_WIDTH: INTEGER := 8:
В первом случае объявляется объект RISE_TIME, который хранит значение типа TIME, объекту в начале моделирования присваивается величина 10 наносекунд. Во втором случае объявляется, что BUS_WIDTH (ширина шины) типа INTEGER (целое) и ей присвоено значение 8. Декларация переменных Примеры деклараций объектов класса variable приведены ниже:
variable CTRL_STATUS: BIT_VECTOR(10 downto 0); variable SUM: INTEGER range 0 to 100 := 10; variable FOUND, DONE: BOOLEAN;
В первом случае декларируется переменная CTRL_STATUS как массив из 11 элементов, причем, каждый элемент типа BIT. Во втором случае переменная SUM декларируется как целое, лежащее в диапазоне от 0 до 100, в начале моделирования переменной присваивается значение 10. Если переменной в начале моделирования не задано значение, то используется значение по умолчанию. Им служит самое “левое” значение в наборе значений данного типа. Например, переменная типа BOOLEAN имеет набор значений (FALSE, TRUE) и в третьем примере начальное значение переменных FOUND и DONE будет взято по умолчанию, т.е. FALSE. Декларация сигналов Декларации объектов класса signal схожи с декларациями переменных:
signal CLOCK: BIT; signal DATA_BUS: BIT_VECTOR(0 to 7); signal GATE_DELAY: TIME := 10 ns;
В первом примере декларируется объект CLOCK типа BIT, начальное значение при моделировании будет взято по умолчанию, т.е. 0 (набор значений типа BIT: 0,1 и крайнее левое значение 0). Не все объекты в языке VHDL создаются путем декларирования, например, входные/выходные порты всегда считаются объектами класса signal.
Операции языка VHDL
В языке VHDL имеются операции следующих категорий:
1. Логические операции 2. Операции отношений 3. Операции сложения/вычитания 4. Операции умножения/деления 5. Прочие
Приоритет операций возрастает от категории 1 к категории 5. Операции одной категории имеют одинаковый приоритет и выполняются в последовательности: слева направо. Скобки используются для изменения последовательности исполнения.
Операции логические Существует шесть логических операций: and, or, nand, nor, xor, not. Операции применимы к типам BIT, BOOLEAN, к одноразмерным массивам BIT и BOOLEAN. При выполнении битовые значения ‘0’ и ‘1’ интерпретируются как булевские FALSE и TRUE. Результат имеет тот же тип, что и операнды. Операция not – унарная операция, она имеет приоритет категории 5.
Операции отношений В языке VHDL имеются следующие операции отношений: =, /=, <, <=, >, >= Результатом выполнения любой операции отношений является булевское выражение BOOLEAN. Операции равенства ( = ) и неравенства ( /= ) допустимы со всеми типами, за исключением типа “файл”. Остальные четыре операции допустимы над скалярными типами (целочисленными, перечислимыми) или над массивами дискретного типа. Когда операндами являются массивы, то сравнение выполняется слева направо по одному элементу, например при следующем сравнении:
BIT_VECTOR'('0', '1', '1') < BIT_VECTOR'('1', '0', '1') получен результат TRUE, т.к. первый элемент вектора слева меньше первого элемента вектора справа. Другой пример, если декларирован тип:
type MVL is ('U', '0', '1', 'Z' ); то результат сравнения: MVL'( 'U' ) < MVL'( 'Z' ) будет TRUE, т.к. ‘U’ находится левее ‘Z’.
Операции суммирования, вычитания, конкатенации Операции имеют обозначения: +, -, &. Операнды, участвующие в операциях сложения ( + ) и вычитания ( - ) должны быть одного числового типа, результат оказывается того же типа. Операндами в конкатенации ( & ) могут быть или отдельные элементы или одномерные массивы. Результат выдается в виде массива, например при выполнении конкатенации: ‘0’ & ‘1’ образуется массив символов “01”, или еще пример: ‘C’ & ‘A’ & ‘T’ дает “CAT”.
Операции умножения, деления К этой группе оператций относятся: *, /, mod, rem. Операнды умножения ( * ) и деления ( / ) должны быть одновременно либо целочисленного типа (integer) либо типа с плавающей запятой (floating point). Результат всегда того типа, что и операнды. Операция умножения может иметь один операнд физического типа, а другой – либо целочисленного, либо натурального типа. Результат выдается в виде физического типа. В операции деления допустимо делить объект физического типа на целочисленный или натуральный. Результат - всегда физического типа. Деление физического типа на физический дает целочисленный результат. Операции остатка ( rem ) и “деления по модулю” ( mod ) в качестве операндов могут иметь целочисленные типы и результат - целочисленного типа. Результат rem имеет знак первого операнда и определяется следующим образом:
A rem B = A - ( A / B ) * B Результат mod имеет знак второго операнда и определяется следующим образом: A mod B = A – B * N, где N – некоторое целое.
Прочие операции К их числу следует отнести: Abs, ** и другие. Операция выделения абсолютного значения ( abs ) совместима с любым числовым типом операнда. Операция возведения в степень ( ** ) операндом слева имеет целое или тип с плавающей точкой, а в качестве правого операнда (степень) - только целое.
HDL программа:
Пример описания двоичного трехразрядного счетчика приведен в листинге 15. Здесь выходной сигнал Q определен как "buffer". Это позволило отказаться от использования внутреннего сигнала.
Заслуживают внимание следующие особенности этой программы: Поскольку выходной сигнал Q нельзя «прочитать» внутри структуры объекта, то введен внутренний сигнал IQ, который могут читать и писать операторы процесса. Сигнал IQ в конце концов становится выходным сигналом Q. Можно было бы и не вводить внутренний сигнал IQ, определив выходной сигнал Q как "buffer" (см. Листинг 1.15). Вход R является асинхронным; поскольку этот сигнал входит в список чувствительности процесса, он проверяется всякий раз, когда претерпевает изменение. Для сдвига применен оператор конкатенации (сцепления) "&".
Листинг 1. VHDL-программа для двоичного счетчика
entity counter is port ( clk, r: in BIT; Q: buffer INTEGER range 0 to 7 ); end counter;
architecture counter_arch of counter is begin process (r,clk) begin if r='1' then Q <= 0; elsif CLK'event and CLK='1' then Q <= Q + 1; end if; end process; end counter_arch;
ЛИТЕРАТУРА
1. Бибило П.Н. Синтез логических схем с использованием языка VHDL. М.: Солон-Р, 2002. 2. Суворова Е. А., Шейнин Ю. Е. Проектирование цифровых систем на VHDL. - СПб.: БХВ-Петербург. 2003.