Основы VHDL. Пример проще простого.

Основы VHDL. Пример проще простого.


Сначала хотелось бы в вкратце описать процесс проектирования с использованием языка VHDL.
Этот процесс выглядит следующим образом:

1. Описание проекта на уровне алгоритма
* Выполняется поведенческое описание, абсолютно абстрактно, не привязываясь к какому либо железу, что кстати можно делать и на C
2. Моделирование работы поведенческого описания устройства
* Проверяем правильно ли работает придуманный нами алгоритм
3. Перерабатываем нашу поведенческую модель в синтезируемую и синтезируем схему
* Дело в том, что не все конструкции языка можно реализовать в виде железа. Простой пример это тип Real — вещественный тип, поведенческое описания с его использованием можно выполнить и промоделировать, но для реализации в железе придется написать устройство для работы с такими числами.
* При синтезе определенные конструкции языка реализуются в виде соответствующих им элементам цифровой электроники(мультиплексоры, логические элементы, дешифраторы и т.д.)
4. Проводим моделирование синтезированной модели
* На этом этапе можно уже оценить временные задержки в разрабатываемом устройстве, так как простейшие элементы обладают определенными задержками, да и можно оценить сколько логики требуется для реализации.
5. Проводим размещение и трассировку на кристалле нашего проекта
* В простейшем случае от нас потребуется связать конкретные Пины ПЛИС с портами(входами/выходами) нами разрабатываемого устройства.
* На этом этапе синтезируемая модель виртуально размещается в кристалле на базе имеющихся в составе ПЛИС элементов цифровой электроники и происходит организация внутренних связей.
6. Проводится моделирования работы размещенной в ПЛИС схемы, с учетом реальных задержек в элементах ПЛИС и задержек на линиях передачи.
* Здесь получаем достоверные временные характеристики нашего устройства проекта на ПЛИС.
* Получаем файл для программирования ПЛИС.
7. Программируем ПЛИС и радуемся жизни.

Примерно так выглядит в проектирование цифровых устройств с применением ПЛИС. Как видим ничего сложного тут нет.

Теперь предлагаю попробовать написать первый проект на VHDL.
VHDL на мой взгляд язык простой, но есть свои особенности. Язык тот имеет признаки высокоурожайного, но все таки не объектноориентированный, но это компенсируется большим количеством библиотек и пакетов( что то вроде библиотек в С).
Теперь рассмотрим основные понятия языка:

* Интерфейс — описывает наше с вами устройство, как черный ящик с входами и выходами, т.е. главная его задача показать какие входы и выходы есть у нашего устройства для связи с внешним миром.( Если взять человека, то можно его как кусок мяса с портами работающими на ввод — глаза, уши и.т.д, и на вывод — гортань, руки и т.д.)
* Архитектура — описывает поведение нашего устройства или раскрывает его внутреннюю структуру, т.е. в архитектуре описывается алгоритм функционирования нашего устройства. Стоит обратить внимание, что архитектура может быть описана в общем случае двумя вариантами: поведенческим стилем(описывается алгоритм работы устройства) и структурным стилем(описывается структура устройства).
Поведенческий стиль удобно использовать при описании элементов на низком уровне иерархии, а структурным на верхних уровнях иерархии, т.е. написать много маленьких устройств поведенческих стилем, а потом описать состоящие из них устройство структурным стилем, в виде связей между ними.
* Операторы языка — операторы в языке бывают последовательные, а бывают параллельные. Параллельные операторы вводятся для того, чтобы отобразить параллельность протекающих в железе процессов. Но любой параллельный оператор можно заменить оператором процесса с последовательными операторами внутри его, он как раз для этого и предназначен. По-этому я бы посоветовал, тем кто переходит с контроллеров и просто программирования, использовать оператор процесса с последовательными операторами, так как это более привычно для них.

Представим. что перед нами стоит задача описать цифровое устройство заданное следующей таблицей истинности(x — входные состояния, y — выходное состояние):

Применим сначала классический метод проектирования ЦУ, построим карту Карно, получим минимизированную функцию системы и построим схему.

В результате получим два поля 1 порядка и функцию системы Y = x1*x0 + x2'*x0'. Апострофами обозначил отрицание.
Построим схему:

Для человека плохо разбирающегося в цифровой электронике приведенный выше процесс довольно туманный.

Теперь рассмотрим проектирование той же системы, но на языке VHDL.
1. Исходя из таблицы истинности видим, что у нас 3 входных порта и один выходной. На основе этого можем описать интерфейс нашего устройства. Описывается он при помощи ключевого слова entity. Синтаксис объявления интерфейса имеет следующий вид:
entity ID is
[generic ({ID: TYPEID [:= expr];});]
[port ({ID: in | out | inout TYPEID [:= expr];});]
[{declaration}]
[begin
{parallel_statement}]
end [entity] ENTITYID;

Сразу так и не врубится, но посмотрим повнимательней.
[] — необязательная конструкция
{} — конструкция, которая может повторятся сколько угодно раз
| — альтернативные варианты

Пока нам требуется только знать, что все вход\выход порты описываются после ключевого слова port.
В нашем случае получится следующий вариант:
entity Sys is
port(X: in bit_vector(2 downto 0);
y: out bit);
end Sys;
Что получается — у нас один порт работающий на ввод(in) и один порт работающий на вывод(out), при этом тип выходного порта bit — грубо говоря это значит, что наш порт одноразрядный, а входной порт имеет тип bit_vector — это массив типа bit, запись вида bit_vector(2 downto 0) обозначает 3 разрядный порт, где каждый разряд это bit. Тип bit может, является перечислимым типом и принимает два значения ('0','1').

* На этом этапе получили черный ящик, с описанием его портов ввода/вывода.

2. На втором этапе опишем поведение нашего устройства, для этого требуется описать архитектуру. Смотрим на ее синтаксис:
architecture ID of ENTITYID is
[{declaration}]
begin
[{parallel_statement}]
end [architecture] ARCHID;

Как видно архитектура должна принадлежать какому-то интерфейсу и ее тело состоит из параллельных операторов. Мы используем один параллельный оператор процесса и разместим там привычные нам последовательные операторы.

Если подумать, как можно реализовать таблицу истинности, то можно прийти к выводу, что лучше всего использовать оператор который выполнял какие либо действия в зависимости от состояния переменной, в С таким оператором является switch(), а в VHDL case. Это значит, что нам потребуется рассмотреть синтаксис оператора процесса и оператора case.

Оператор процесса:
[LABEL:] [postponed] process [( {SIGID,} )]
[{declaration}]
begin
[{sequential_statement}]
end [postponed] process [LABEL];
Если не вдаваться в подробности, то видно что внутри процесса расположены последовательные операторы, то что нам нужно. В скобках после ключевого слова process указывается список чувствительности, т.е. те сигнала при изменении которых процесс запускается или срабатывает, при синтезе этот список просто игнорируется, но он необходим для правильного выполнения моделирования.
Оператор case
[LABEL:] case expr is
{when choice [{| choice}] =>
{sequential_statement}}
end case [LABEL];

Видно, что проверяется значение сигнала или переменной — выражение expr, и в зависимости от его значения выполняется один из набора последовательных операторов.

Теперь попробуем собрать это все в кучу

architecture A_Sys of Sys is
begin
process(X)
begin
case X is
when «000» => Y <= '1';
when «001» => Y <= '0';
when «010» => Y <= '1';
when «011» => Y <= '1';
when «100» => Y <= '0';
when «101» => Y <= '0';
when «110» => Y <= '0';
when «111» => Y <= '1';
end case;
end process;
end A_Sys;

Вот и получили программу нашего устройства. В списке чувствительности процесса поставили X так как он должен реагировать на изменение этого порта, ну а операторе case просто в зависимости от комбинации на входе выдаем значение на выход, использую оператор присваивания значения сигналу <=.
Смотрим временные диаграммы

Вроде все верно, радуемся жизни :).
Как видно из примера, при проектировании на VHDL не нужны мегазнания в области цифровой электроники. Пример конечно утрированный, но показательный.

P.S: прошу сильно не пинать оформление, не умею пользоваться HTML:(.

  • +4
  • 10 марта 2011, 13:11
  • opolo84

Комментарии (8)

RSS свернуть / развернуть
Вставьте тэг
<cut>
после первого-второго абзаца, весь текст на главную выводить — нет смысла.
0
  • avatar
  • m3hc
  • 10 марта 2011, 13:15
не очень понял, куда надо ставить
0
Этот процесс выглядит следующим образом:

1. Описание проекта на уровне алгоритма
0
вот между этими строчками в вставьте тэг
0
Бла бла бла - В ведение
<cut>
бла бла бла продолжение - 90% текста

Всё что ниже —
<cut>
, не будет видно на главной, и это есть гуд.
0
  • avatar
  • m3hc
  • 10 марта 2011, 13:31
Большое спасибо, сделал.
0
Теперь у читателя есть альтернативный вариант и каждый выберет тот который ему более понятен. Отлично.
0
Я бы выделил еще 3-тье поле на карте карно, чтобы избежать так называемых glitches. я хз как они по русски)) это поле Х1 и не Х2.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.