Vhdl что это такое

от admin

VHDL для начинающих. Brainfuck

Как известно, VHDL – высокоуровневый язык описания аппаратуры (если это вызывает сомнения, можно посмотреть здесь и здесь). Из всего разнообразия задач мне приглянулся именно brainfuck благодаря лёгкости в реализации с одной стороны и волшебству создания программируемого (пусть и весьма ограниченно) вычислителя с другой.
В рамках данной статьи я не буду углубляться в дебри синтаксиса и настройки среды, сконцентрировавшись на реализации конкретной задачи.
Испытательным стендом будет Altera Cyclone II Starter Kit (EP2C20F484C7)


Любителей мигающих лампочек прошу под кат.

Техническое задание
  1. Память команд — 64 команды, ячейки памяти — 32 ячейки по 8 бит каждая;
  2. Устройство должно поддерживать два режима: занесения программы и выполнения; смена режима должна осуществляться при помощи переключателя SW9;
  3. В режиме занесения программы переключатели SW8 – SW3 определяют адрес в памяти программ, SW2 – SW0 — код команды; запись в память осуществлятся при нажатии кнопки KEY3; содержимое текущей ячейки памяти отображается на свтодиодах LEDR2 – LEDR0;
  4. В режиме выполнения программы значения ячеек памяти должны отображаться на семисегментных индикаторах HEX1 – HEX0; адрес отображаемой ячейки должен задаваться при помощи переключателей SW4 – SW0;
  5. В любом режиме работы по нажатию кнопки KEY3 значения всех ячеек памяти должны обнуляться.
Разметка фронта работ

Проект в Quartus II создан, самое время определиться с набором entity. Я решил не выделяться и, пусть это и не очень красиво, реализовать всё в одной сущности. Для вывода на семисегментные индикаторы понадобится специальный дешифратор, который выделим в отдельный entity.

Реализация

Дешифратор можно реализовать сразу, «в лоб». Он выполняет простейшее преобразование, задаваемое таблично, поэтому портов всего два:

Модель поведения задаётся просто:

Перейдём непосредственно к интерпретатору.

Порты

Задействованные внешние устройства ввода и вывода показаны на рисунке:

Как видно, нужен доступ к тумблерам SW, кнопкам KEY, светодиодам LED и семисегментникам HEX. Сигнал синхронизации будет вырабатывать внутренний генератор 50Mhz.

RUN — тот самый переключатель режима работы SW9, RESET — кнопка KEY3.

Архитектура

Нам понадобится несколько внутренних элементов: массивы памяти команд и данных, а также указатели на конкретные ячейки в них.
Так как на индикаторах требуется показывать не только вывод программы, но и содержимое каждой конкретной ячейки памяти, использовано два вектора: out_result содержит вывод программы, а final_out_result подключён к дешифраторам семисегментных индикаторов.

Process (clk, RESET)

Наконец подобрались к самому главному — модели поведения интерпретатора. Для начала объявим переменную-счётчик открытых скобок. Для нормальной работы с циклами это должна быть именно переменная, а не сигнал. Главное отличие первого от второго в том, что значение в сигнал записывается по окончании выполнения процесса, а в переменную — непосредственно в момент присваивания.

По сигналу сброса (кнопки в Cyclone II инверсные, поэтому и условие инверсное) обнуляем значения ячеек памяти и выходной вектор, а если при этом ещё и идёт запись программы, заполняем соответствующую ячейку памяти команд.

В любом случае при выходе из режима выполнения необходимо «забывать» о предыдущих результатах, чтобы каждый следующий запуск происходил «с нуля».

Выбр вывода: на дешифраторы подаётся либо выход программы, либо значение из текущей ячейки. Выбор осуществляется с помощью тумблера SW5.

Программа на Brainfuck представляется как автомат: есть набор фиксированных состояний, перемещение между которыми осуществляется (за исключением циклов) линейно. Такая модель на VHDL (да и не только) реализуется switch-case конструкцией.
Как уже говорилось, u — счётчик открытых скобок. Команды выполняются только при (u = 0), в остальных случаях происходит поиск парной скобки. В нормальном режиме и при поиске закрывающей скобки указатель команд движется вперёд, иначе — назад. Здесь ясно видно, что если бы u была сигналом, при первой реакции на закрывающую скобку счётчик команд увеличился бы, только на следующем такте указатель пошёл бы назад, наткнулся на закрывающую скобку второй раз (u = -2), а такого количества парных открывающих скобок нет — программа никогда бы не выполнилась.
Условие (u /= 0) сделано для реализации вложенных циклов.

Testbench

Код готов и компилируется,

но перед прошивкой устройства надо протестировать алгоритм на адекватность. Текст тестбенча приводить не буду, он есть в прикреплённых файлах. Отмечу лишь, что тупой последовательный прогон всех значений здесь не подойдёт, поэтому проверяется корректность выполнения конкретной программы. Я использовал сложение двух чисел:
+++>++<[->+<]>.x
В качестве среды моделирования использовалась ModelSim-Altera.

Разводка платы

Последний этап перед прошивкой — задание соответствий сигналов модели реальным портам платы. Координаты выводов есть в приложении «Документация Cyclone II», ну а кому лень — вот готовая распиновка:

Введение в язык описания аппаратуры: начало работы с VHDL для проектирования цифровых схем

В данной статье рассматривается VHDL, язык описания аппаратного обеспечения, и то, как он структурируется при описании цифровых схем. Мы также рассмотрим некоторые вводные примеры описаний схем и коснемся различий между типами данных " std_logic " и " bit ".

VHDL является одним из широко используемых языков описания аппаратуры (HDL, Hardware Description Language). VHDL означает язык описания аппаратуры VHSIC. В свою очередь, VHSIC означает высокоскоростная интегральная микросхема (Very-High-Speed Integrated Circuit).

Создание VHDL было инициировано Министерством обороны США в 1981 году. Сотрудничество таких компаний, как IBM и Texas Instruments, привело к выпуску первой версии VHDL в 1985 году. Xilinx, которая выпустила первую микросхему FPGA в 1984 году, вскоре поддержала VHDL в своих продуктах. С тех пор VHDL превратился в развитый язык в области проектирования, моделирования и синтеза цифровых схем.

В данной статье мы вкратце обсудим общую структуру кода VHDL при описании заданной схемы. С помощью некоторых вводных примеров мы также познакомимся с некоторыми широко используемыми типами данных, операторами и так далее.

Общая структура кода VHDL

Рассмотрим простую цифровую схему, показанную на рисунке 1.

Рисунок 1 – Простая цифровая схема Рисунок 1 – Простая цифровая схема

На этом рисунке показано, что есть два входных порта (a и b) и один выходной порт (out1). На рисунке показано, что входные и выходные порты имеют ширину один бит. Функциональность схемы – это выполнение логической операции И двух входов и вывод результата на выходной порт.

VHDL использует похожее описание; однако он имеет свой собственный синтаксис. Например, для описания входных и выходных портов этой схемы используются следующие строки кода:

Давайте по очереди разберемся, что это значит.

Строка 1. Первая строка указывает произвольное название для описываемой схемы. Слово « circuit_1 », которое находится между ключевыми словами « entity » и « is », определяет имя этого модуля.

Строки с 2 по 4. Эти строки определяют входные и выходные порты схемы. Сравнивая эти строки со схемой, изображенной на рисунке 1, мы видим, что порты схемы вместе со своими функциями перечислены после ключевого слова « port ». Например, в строке 3 говорится, что у нас есть порт под названием « b ». Этот порт является входом, как указано ключевым словом « in » после двоеточия.

Что указывает ключевое слово « std_logic »? Как мы обсудим далее в этой статье, std_logic является в VHDL широко используемым типом данных. Его можно использовать для описания однобитового цифрового сигнала. Поскольку все порты входов/выходов на рисунке 1 передают единицу или ноль, мы можем использовать для этих портов тип данных std_logic .

Строка 5. Эта строка определяет конец оператора « entity ».

Следовательно, фрагмент кода entity определяет 1) название описываемой схемы и 2) порты схемы вместе со своими характеристиками, а именно: вход/выход и тип данных, которые должны передаваться этими портами. Фактически фрагмент кода entity описывает интерфейс модуля с окружающей его средой. Функции схемы, указанные в обсуждаемом операторе « entity », показаны на рисунке 1 зеленым цветом.

В дополнение к интерфейсу схемы с окружающей средой нам необходимо описать работу схемы. На рисунке 1 функциональность схемы – это выполнение логической операции И двух входов и вывод результата на выходной порт. Чтобы описать работу схемы, VHDL добавляет секцию « architecture » и связывает её с circuit_1 , определенной оператором entity . Код VHDL, описывающий архитектуру этой схемы, будет следующим.

Строка 6. Эта строка дает название, « Behavioral », для архитектуры, которая будет описана в следующих строках. Это имя встречается между ключевыми словами « architecture » и « of ». Данная строка также связывает эту архитектуру с « circuit_1 ». Другими словами, эта архитектура будет описывать работу « circuit_1 ».

Строка 8. Указывает начало описания архитектуры.

Строка 9. Строка 9 использует синтаксис VHDL для описания работы схемы. Логическая операция И (AND) двух входов находится в круглых скобках, а результат присваивается выходному порту с помощью оператора присваивания « <= ».

Строка 10. Указывает конец описания архитектуры. Как упоминалось выше, эти строки кода описывают внутреннюю работу схемы, которая здесь представляет простой логический элемент И (на рисунке 1 показан синим цветом).

Объединив то, что мы обсудили ранее, мы закончим описание « Circuit_1 » в VHDL. Мы получим следующий код:

Однако нам еще нужно добавить еще несколько строк кода. Эти строки добавят библиотеку, содержащую некоторые важные определения, включая определения типов данных и операторов. Библиотека может состоять из нескольких пакетов (смотрите рисунок 2 ниже). Нам нужно сделать необходимый пакет(ы) данной библиотеки видимыми для проекта.

Поскольку в приведенном выше примере используется тип данных « std_logic », нам нужно добавить в код пакет « std_logic_1164 » из библиотеки « ieee ». Обратите внимание, что логические операторы для типа данных std_logic также определены в пакете « std_logic_1164 », иначе нам пришлось бы сделать соответствующий пакет видимым для кода. Окончательный код будет следующим:

Здесь мы добавляем две новые строки перед тем, что уже написали. Первая строка добавляет библиотеку « ieee », а вторая строка указывает, что требуется пакет « std_logic_1164 » из данной библиотеки. Поскольку « std_logic » является широко используемым типом данных, нам почти всегда нужно добавлять в VHDL код библиотеку « ieee » и пакет « std_logic_1164 ».

Библиотека может состоять из нескольких пакетов Рисунок 2 – Библиотека может состоять из нескольких пакетов

Для проверки приведенного выше VHDL кода мы можем использовать симулятор Xilinx ISE.

Теперь, когда мы познакомились с основными блоками кода VHDL, давайте рассмотрим один из самых важных типов данных VHDL, т.е. тип данных « std_logic ».

Тип данных « std_logic » (против « bit »)

Как упоминалось выше, тип данных « std_logic » может использоваться для представления однобитового сигнала. Интересно, что существует еще один тип данных VHDL, « bit », который может принимать логическую единицу или логический ноль.

Итак, зачем нам нужен тип данных std_logic , если тип данных « bit » уже охватывает высокое и низкое логические состояния цифрового сигнала? Ну, цифровой сигнал на самом деле не ограничивается высоким логическим уровнем и низким логическим уровнем. Рассмотрим инвертор с тремя состояниями, показанный на рисунке 3.

Рисунок 3 – Схема инвертора с тремя состояниями Рисунок 3 – Схема инвертора с тремя состояниями

Когда на «включен» высокий логический уровень, «выход_данных» подключается либо к Vdd, либо к земле; однако, когда на «включен» низкий логический уровень, «выход данных» висит в воздухе, то есть он не имеет низкоимпедансного соединения с Vdd или землей, а вместо этого представляет для внешней схемы «высокий импеданс». Тип данных « std_logic » позволяет нам описывать цифровой сигнал в режиме с высоким импедансом, присвоив ему значение ' Z '.

Существует еще одно состояние, то есть к дополнение в высокому логическому уровню, низкому логическому уровню и высокому импедансу, которое может быть использовано при проектировании цифровых схем. Иногда нам неважно значение на конкретном входе. В этом случае представление значения сигнала с «неважным значением» может привести к более эффективному проектированию. Тип данных « std_logic » поддерживает состояние «неважное значение». Это позволяет улучшить аппаратную оптимизацию для таблиц поиска.

Тип данных « std_logic » также позволяет нам представить неинициализированный сигнал, присвоив ему значение ' U '. Это может быть полезно при моделировании фрагмента VHDL кода. Оказывается, что тип данных « std_logic » фактически может принимать девять значений:

  • ' U ': не инициализировано;
  • ' 1 ': обычный индикатор высокого логического уровня, также известный как «принудительный высокий логический уровень»;
  • ' 0 ': обычный индикатор низкого логического уровня, также известный как «принудительный низкий логический уровень»;
  • ' Z ': высокий импеданс;
  • ' — ': неважное значение;
  • ' W ': слабое неизвестное;
  • ' X ': неизвестное;
  • ' H ': слабая ' 1 ' (имеется в виду слабый ток);
  • ' L ': слабый ' 0 ' (имеется в виду слабый ток).

Среди этих значений мы обычно используем ‘ 0 ’, ‘ 1 ’, ‘ Z ’ и ‘ — ’.

Давайте посмотрим пример.

Пример 1

Напишем VHDL код для схемы на рисунке 4.

Рисунок 4 – Схема для примера 1 Рисунок 4 – Схема для примера 1

Основная процедура почти такая же, как в предыдущем примере. Код будет выглядеть следующим образом:

Строки 1 и 2. Эти строки добавляют в код необходимые библиотеку и пакет. Поскольку используется тип данных « std_logic », мы должны добавить пакет « std_logic_1164 ».

Строки 3-10. Эти строки определяют имя модуля вместе с его входными/выходными портами. Этот фрагмент кода соответствует частям зеленого цвета на рисунке 4.

Строки 11-17. Эта часть кода описывает работу схемы (т.е. части синего цвета на рисунке 4). Как вы могли заметить, на рисунке 4 есть один внутренний узел; он обозначен как « sig1 ». Мы используем оператор « port » из « entity » для определения входных/выходных портов, но как мы можем определить внутренние узлы схемы? Для этого мы используем ключевое слово « signal ».

В строке 12 вышеприведенного кода ключевое слово « signal » сообщает программному обеспечению, что в схеме есть узел, помеченный как « sig1 ». Подобно определению портов, мы используем ключевое слово « std_logic » после двоеточия, чтобы указать требуемый тип данных. Теперь мы можем присвоить значение этому узлу (строка 14) или использовать его значение (строка 15).

Пример 2

Напишем VHDL код для схемы на рисунке 5.

Рисунок 5 – Схема для примера 2 Рисунок 5 – Схема для примера 2

Данная схема представляет собой мультиплексор два-к-одному. Когда на « sel » высокий логический уровень, выход нижнего логического элемента И будет в низком логическом состоянии независимо от значения на « b ». Мы можем сказать, что логический элемент И предотвращает распространение « b » на « sig2 ». С другой стороны, поскольку на « sel » высокий логический уровень, выход верхнего логического элемента И будет соответствовать « a ». Или, что то же самое, « a » достигнет « sig3 ». Поскольку в этом случае « sig2 » равен логическому нулю, то на выходе логического элемента ИЛИ будет такое же состояние, как у « sig3 ». Следовательно, когда на « sel » высокий логический уровень, « out1 » будет таким же, как « a ».

Аналогичное обсуждение покажет, что, когда на « sel » низкий логический уровень, « out1 » будет принимать значение « b ». Следовательно, исходя из значения « sel », мы можем позволить значению на одном или другом входе достичь выхода. Это называется мультиплексированием, а схема называется мультиплексором.

Мы можем описать схему на рисунке 5, используя следующий код:

Резюме

В данной статье мы обсудили, что такое VHDL, как структурируется его код, и представили некоторые примеры того, как он используется для описания цифровых схем. Теперь вы должны лучше понимать следующие моменты:

Что такое VHDL. Простейший пример создания логического элемента в ПЛИС

Вот вокруг говорят ПЛИС, ПЛИС… Понятно что это микросхема такая… А как в нее электрическую схему заталкивать? Для этого существует несколько способов, один из которых это описание схемы устройства на специальном языке описания аппаратуры. Таких языков существует несколько: Verilog, AHDL, VHDL и наверное еще есть, но мне не попадались. Эти три вроде самые распространенные. Вот о VHDL я и попробую рассказать.

Почему VHDL? Он как и Verilog поддерживается большинством производителей ПЛИС, в то время как AHDL разрабатывался сугубо для Альтеры. Ну и в свое время по VHDL мне удалось достать литературу на русском языке. ПЛИС достаточно сложные устройства и читать кроме даташита еще и описание языка на буржуйском — рвет мозг на мелкие кусочки.

Чем VHDL отличается от обычных языков программирования типа Си, Паскаля и т.д.? Самое главное отличие в том, что VHDL описывает параллельные процессы. Если код на Си или Паскале у нас выполняется по очереди команда за командой и надо изощряться с таймерами и прерываниями чтоб обработать разные куски кода «одновременно», то на VHDL разные блоки программы выполняются параллельно друг другу, но в тоже время в VHDL есть часть комманд, которые выполняются последоватеьно. Поэтому структура программы в корне отличается от привычной микроконтроллерной.

Структура программы
Процесс программирования на VHDL чем то напоминает создание принципиальной схемы устройства.
Шаг 1: Включение в код используемых библиотек.
Шаг 2: Описание точек входа и точек выхода устройства (аналогично входам и выходам принципиальной схемы всего устройства).
Шаг 3: Описание точек входа и выхода элементов входящих в устройство (аналогично назначению функций ногам контроллера и другой логике в схеме)
Шаг 4: Описание архитектуры элементов входящих в устройство (вроде подбора логики типа ИЛИ-НЕ, И-НЕ, вобщем описание того как выход элемента завязан с его входом)
Шаг 5: Описание архитектуры всего устройства (типа соединения проводниками всех элементов схемы)

Чтобы это все было не голословно, попробуем создать с помощью VHDL простой элемент, например 16-ти разрядный счетчик, который считает по переднему фронту импульса.

Что еще нам надо знать, чтобы переходить к созданию первой программы на VHDL?
Основные структуры данных, с которыми мы можем работать. В литературе они называются классами объектов. Их три:
— константы
— переменные
— сигналы
Константы имеют тот же смысл, что и в других языках и определяются ключевам словом "constant":

Символы "—" означают комментарий

ВАЖНО: в VHDL нет разницы между строчными и прописными буквами в идентификаторах. То есть константы MyConst и mYcONST это на самом деле одна и таже константа.
Есть еще одно важное правило: идентификатор не должен оканчиваться подчеркиванием.

Переменные имеют практически тот же смысл, что и в других языках. Определяются ключевым словом "variable":

Переменная i типа integer принимающая значения в диапазоне от 0 до 31. Описание диапазона позволяет точно определить разрядность переменной, что существенно экономит ресурсы кристалла. Присваивание переменной выполняется с помощью знака ":=".

Сигналы это очень важный класс в VHDL. Они похожи на переменные, НО физически имеют смысл проводников на печатной плате. Это значит, что сигнал всегда имеет некоторое значение.
Описываются сигналы с помощью ключевого слова "signal":

Первая строчка описывает два сигнала типа bit, вторая строчка описывает сигнал представленный в виде 16ти-разрядной шины. Причем нумерация бит (15 downto 0) или (0 to 15) имеет значение при операциях с сигналами. Назначение сигналов выполняется с помощью знака "<=".

Читать:
Как отпаять транзистор от платы

ВАЖНО. Все операции с сигналами выполняются параллельно. Тоесть код вида

совершенно не означает, что d у вас всегда будет равно b, как это было бы в Си или Паскале. Данные команды будут выполняться параллельно и существует достаточная вероятность что d будет некоторое время неравно b. «Некоторое время» зависит от задержек прохождения сигнала через различные элементы структуры ПЛИС и от прочих факторов.
Итак приступим:

Для примера создадим в нашей ПЛИС один элемент — 16ти-разрядный счетчик, который будет считать импульсы по переднему фронту, а так же иметь два управляющих сигнала: сброс и разрешение работы.
Чтобы правильно описать наш элемент, надо хорошо представлять его структуру. Для этого нарисуем следующую картинку:

Внешний квадрат (one_element) — это наша ПЛИС.
К ней слева подходят 3 входных сигнала:
Main_clk — тактовый сигнал, по которому собственно и работает наш счетчик,
Res — сигнал сброса счетчика в 0,
Enab — Разрешающий сигнал, наличие которого разрешает работу счетчика.
Справа выходной сигнал размерностью 16 бит (integer range 0 to 65535 дает нам 16 разрядов)
Это те сигналы, которые физически будут приходить непосредственно на ноги нашей ПЛИС.

Внутренний квадрат (counter) это тело нашего счетчика. К нему подходят идентичные сигналы, но названия у них свои. Почему? Потому что в одной ПЛИС мы можем создать множество одинаковых счетчиков, и чтобы система знала куда какой внешний сигнал заводить внутренний элемент имеет собственные названия сигналов.

Теперь, когда с общей структурой элемента ясно запишем все это с помощью VHDL. По шагам, которые были описаны в начале статьи.

Шаг 1 Включение в код используемых библиотек:
Как и во всех языках программирования, в VHDL есть стандартные библиотеки. Крайне рекомендуется вставлять следующий код:

Данная библиотека дает возможность присваивать сигналам типа bit не только значения 0 и 1 но и еще 7 дополнительных значений включая Z-состояние. Более детально в следующих статьях или в литературе, чтобы не перегружать материал.

Шаг 2 Описание точек входа и точек выхода устройства:
В литературе это называется описанием интерфейса.
Интерфейс любого элемента описывается с помощью ключевого слова entity и представляет собой следующую конструкцию:

Так как, в соответствии со структурой программы, в данном шаге мы описываем интерфейс всего устройства, значит входными и выходными сигналами у нас будут все линии подходящие к блоку «one_element» изображенные на схеме. Запишем их на VHDL:

Шаг 3 Описание точек входа и выхода элементов входящих в устройство:
Интерфейс элементов входящих в состав схемы описывается аналогично интерфейсу всего устройства.
ВАЖНО: Если в схему входит несколько однотипных элементов (например 2 одинаковых счетчика и 3 одинаковых регистра), то в данной части программы мы описываем по одному элементу каждого типа (в продолжение примера — один счетчик и один регистр).
У нас в схеме счетчик только один, поэтому мы его и опишем:

Шаг 4 Описание архитектуры элементов входящих в устройство:
Архитектура элементов описывается с помощью ключевого слова «architecture» и представляет собой конструкцию типа:

Ключевое слово «process» означает описание параллельного процесса (обработки наших входных сигналов для получения выходных), который активируется «списком запуска».
ВАЖНО. Все логические блоки описанные как процесс выполняются параллельно друг другу. "
Список сигналов" это перечень сигналов, изменение которых активирует выполнение процесса.
Звучит очень сухо и заумно, но надеюсь что при разборе примера будет понятней.
У нас счетчик работает по переднему фронту сигнала c_in. Значит нам надо контролировать изменение этого сигнала и при обнаружении переднего фронта активировать счетчик.
Запишем это на VHDL:

Запись if (c_in’event and c_in=’1′) then выполняет функцию детектора переднего фронта сигнала. Ключевое слово ‘event это стандартный атрибут сигнала c_in, который определяет изменение сигнала. Каждый сигнал в проекте имеет стандартный набор атрибутов. Дословно нашу запись можно прочитать так: Если c_in изменился и при этом равен 1. Остальной код процесса работает как и в других языках программирования. Разве что стоит обратить внимание на запись c_out<=cnt; которая назначает выходному сигналу c_out значение переменной cnt
Все предыдущие шаги — это была подготовительная работа. Остался последний шаг:

Шаг 5 Описание архитектуры всего устройства:
Описание архитектуры всего устройства существенно отличается по структуре от описания архитектуры элемента, хотя производится так же с помощью ключевого слова «architecture»
В нашем примере эта часть выглядит так:

Как вы могли заметить у нас появилась новая конструкция component. Данная конструкция говорит о том, что элемент counter является компонентом, входящим в состав one_element, и содержит описание входных и выходных портов этого компонента.

Далее в операторных скобках begin — end идет самое важное: назначение входных и выходных сигналов устройства экземплярам компонентов входящих в данное устройство.
Эта часть записи равносильна соединению логическихэлементов проводниками. Т.к. у нас в проекте только один счетчик — то именно ему мы и назначаем все наши входные и выходные сигналы.
mc — это имя экземпляра счетчика.
port map — это команда назначения входных и выходных сигналов данному счетчику

На этом собственно все. Итоговый код который у нас получился выглядит так:

P.S. Исправил код, внес уточнения замеченные в комментариях. Теперь сигнал сброса асинхронный.

P.P.S. Добавил видео работы элемента в железе:

Некоторые пояснения к видео:
Большая макетка с кучей проводов — это плата типа PINBOARD от Ди Хальта для микроконтроллеров AVR и ARM. На ней собран другой проект, не имеющий отношения к ПЛИС. Потому на ней куча проводов.
Я с этой платы использую питание 5 В, и секцию с ДИП-переключателями, чтобы притянуть входы макетной платы ПЛИС к +5 вольтам через резисторы 10k.
Так что не обращайте внимание на нее.

    , , ,
  • +8
  • 09 марта 2011, 23:30

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

Сейчас буду пинать ногами))
Вы говорили что сами изучали язык и ждете критику, я тоже сам изучал язык, буду критиковать, или пояснять.

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

Сигналы нужны для связи между процессами одной архитектуры, т. к. переменные (variable) видны только внутри процесса.

По чему вы учились? у меня это была книга «Основы языка VHDL» Бибило П.Н.

What is VHDL?

Copperpod IP

VHSIC Hardware Description Language (VHDL) is a programming language used to describe the hardware of a computer. Very High-Speed Integrated Circuit (VHSIC) is an abbreviation. It can be used to explain the structure and behaviour of electronic systems in general, but it’s especially well suited to describing the structure and behaviour of digital electronic hardware designs like ASICs and FPGAs, as well as traditional digital circuits.

  • It’s a hardware description language, which means it may be used to generate or design digital circuit/system hardware and can describe the behaviour of a digital circuit.
  • It can be used for both synthesis and simulation of digital circuits.
  • It is used to construct digital systems/circuits using Programmable Logic Devices such as CPLD (Complex Programmable Logic Device) or FPGA (Field Programmable Gate Array) (Field Programmable Gate Array)
  • VHDL code (program) is used to implement digital circuits in CPLDs and FPGAs, as well as to fabricate ASICs (Application Specific Integrated Circuit)

Advantages of VHDL

  • When used for systems design, VHDL has the benefit of allowing the behaviour of the needed system to be specified (modeled) and tested (simulated) before the design is translated into physical hardware via synthesis tools (gates and wires).
  • Another advantage is that VHDL may be used to describe a concurrent system. In contrast to procedural computer languages like BASIC, C, and assembly code, where a sequence of statements is performed sequentially one instruction at a time, VHDL is a data-flow language wherein every statement is examined for execution concurrently.
  • A VHDL project can be used for a variety of purposes. A computation block is built once and may be reused in several projects. Many formational and functional block properties, however, may be tweaked (capacity parameters, memory size, element base, block composition and interconnection structure)
  • A VHDL project can be moved around. A computer device project that was designed for one element basis can be transferred to another element base, such as VLSI with multiple methods.

VHDL Design

The first step is to develop VHDL code that meets these requirements. The code must be saved in a text file with the same name as its primary object and the extension “.vhd”. After that, a synthesis tool is used to build the code. During the compilation process, several files are created. The synthesizer breaks down the code into hardware structures that are available inside the chosen device. Each structure inferred by the synthesizer is allocated a specific location within the device during fitting (place and route).

This positioning information is crucial because it has a significant impact on the timing behaviour of the resultant circuit. The program allows the circuit to be completely simulated using the timing information obtained by the fitting procedure.

After the specifications have been completed, the designer may go on to the next phase (implementation), which involves creating a programming file for the device (if using a CPLD or FPGA) or the masks (if using ASICs). The design is completed in the case of CPLDs/FPGAs by downloading the programming file from the computer to the target device.

Basic VHDL Elements — Entity and Architecture

Any circuit’s VHDL code is broken down into two sections: On the one hand, the entity describes the circuit’s input and output ports. The architecture, on the other hand, explains the circuit’s behavior. An entity must be linked to architecture. It is also possible to attach many architectures to the same thing, allowing the programmer to choose from among them.

Entity: A hardware module is described using an entity in VHDL. It’s a perspective of the circuit from the outside. Logic gates and multiplexers are examples of entities. It defines the entity’s name as well as the interface ports. Ports are signals or terminals that allow other devices to communicate with one another. With entities, at least one architecture should be present.

The internal description of the design entity — its behavior, structure, or a combination of both — is given by architecture. Each entity has its own declaration, which describes the following:

  • Port number
  • Port direction
  • Port types
  • Port timing information

Inputs (in), outputs (out), input-outputs (inout), and buffers are all possible ports for an entity. Inside the architecture, the input ports can only be read, and they can’t be changed. On the other hand, the output ports can only be written to, not read from. If an output port or an input port has to be read (for example, to make a choice about its value), they must be created as an inout or a buffer port.

Architecture: In VHDL, the entity-architecture pairs are utilized to fully define the functioning of a circuit. An architecture describes how a circuit works by containing a collection of inner signals, operations, processes, and functions, and it can be structural or behavioural in nature. The entity’s architectural statement outlines the entity’s underlying functionality. Architecture is always associated with an entity and specifies its behaviour. There are two elements to architecture: a declarative (optional) portion and a statements (code) part. The former can include the same elements as an entity’s declarative section, as well as component declarations and configuration requirements. The VHDL statements are inserted in the latter. The name of architecture, like the name of an entity, can be almost any word, even the same name as the entity.

VHDL Architecture supports 4 modeling styles in code structure:

  • Behavioural modeling
  • Structural modeling
  • Data flow modeling
  • Complex/Mixed modeling

Behavioural Modeling: In VHDL’s behavioural modeling technique, the designer uses sequential statements to define an entity’s behaviour. In terms of syntax and semantics, it’s extremely close to high-level programming languages. The use of a process block is the key technique for writing a program in a behavioural style. A process block contains a collection of statements that the VHDL compiler runs in order. Statements within the process block may describe entity’s or a portion of the entity’s operation. The compiler will execute statements in the same sequence that the designer writes them, which is known as sequential execution. This method of execution is quite similar to C, C++, JAVA, and other high-level programming languages.

Structural Modeling: In VHDL, structural modeling is commonly used for big designs. It enables the designer to create code that can be reused. The designer creates a tiny entity in a separate file that may be used as a component in a bigger entity. Signals can also be used to connect components, allowing big systems to be built from tiny subsystems.

Assume you’ve already built an adder, a subtractor, a multiplier, and a divider circuit. You’ve decided to write code for an ALU (Arithmetic & Logic Unit). Then you won’t have to start from the beginning. You can utilize such pre-written entities as ALU code components. To utilize them, you just need to map their inputs and outputs to your design specifications.

The initial step in structural modeling is to use the component declaration to create components. The designer specifies the component’s name, inputs/outputs, and type of inputs/outputs in the component declaration.

A designer’s declared component name may or may not exist in the library. If it isn’t in the library, the designer may either develop a component with that name or use a setting to explicitly link any other existing entity to it. The VHDL compiler will not be able to simulate the model otherwise.

Data Flow Modeling: In VHDL data-flow modeling, the designer describes an entity’s functionality by specifying the flow of data through each gate. In data-flow modeling, the designer usually employs concurrent signal assignment statements and block statements.

Mixed Modeling: Any mixture of behaviour, data flow, and structural modeling in a single architecture body is known as mixed style modeling. A designer might employ component instantiation statements, concurrent signal assignment statements, and sequential signal assignment statements in a mixed approach to modeling. The mixed style technique, which combines structural and behavioural modeling, is the most prevalent way of modeling big systems. If you wish to develop code for any microprocessor, for example. Make the behavioural code for each block (register, ALU, control, etc.) first, then use the structural way to connect them.

VHDL Technology Applications

IBM: IBM is at the top of the list of top Assignees with 1872 patent families in VHDL technology. IBM design engineers employ a set of Computer-Aided Engineering (CAE) design tools based on the VHSIC Hardware Description Language (VHDL) and created for internal usage, as well as other design automation tools, to create computer hardware. In IBM processor and server development, VHDL technology is used for Logical Design and Functional verification. The logic design is accountable for the description and development of new features for our Z and P microprocessors. Single functions or complete architectures can be included. A logic designer, can generate specifications for functions, units, or subsystems based on client needs and use the hardware description language VHDL to implement their behaviour. The functional VHDL description of the hardware is automatically translated into a structural representation consisting of individual logic gates in a process known as logic synthesis.

Synopsys: Synopsys produces Synplify FPGA synthesis software, which is an industry-standard for producing high-performance and cost-effective FPGA designs. The newest VHDL and Verilog language constructs, including SystemVerilog and VHDL-2008, are supported by Synplify software. The program also supports FPGA designs from Achronix, Intel, Lattice, Microsemi, and Xilinx, all from a single RTL and constraint source. Furthermore, the Synplify synthesis tool offers high performance, quicker runtime, area refinements for cost and power savings, incremental and team-design capabilities, and team-design capabilities for faster FPGA design development. It provides features that help to automate the production of highly dependable designs utilized in medical, automotive, industrial automation, communications, military, and aerospace applications.

Intel: The VHDL (Very High Speed Incorporated Circuit) Hardware Description Language (VHDL) is a high-level, modular language that is fully integrated into the Quartus II software. To produce VHDL Design Files, use the Quartus II Text Editor or any text editor (.vhd). VHDL Design Files can then be used to form full hierarchical projects, or they can be mixed with other types of design files in a hierarchical project. VHDL Design Files can include any number of Quartus II software-supported constructs. They can also include Altera-supplied logic functions, such as primitives and mega functions, as well as user-defined logic functions. Create a Block Symbol File (.bsf) in the Text Editor to represent a VHDL Design File, which may subsequently be included in a Block Design File (.bdf).

Conclusion

VHDL is a programming language for specifying, designing, and describing digital electrical hardware. VHDL was not well suited to abstract system-level simulation before the hardware-software divide. At this level, simulation is generally stochastic and focuses on performance, throughput, queueing, and statistical distributions. VHDL has had some success in this field, but it is better suited to functional rather than stochastic simulation. VHDL may be used throughout the digital hardware design process today, from specification to high-level functional simulation, manual design, and logic synthesis, all the way down to gate-level simulation. In this domain, VHDL tools generally provide an integrated design environment. VHDL isn’t well suited to implementation-level design verification tools like analogue simulation, switch level simulation, or worst-case time simulation. VHDL may be utilized to simulate gate level fanout loading effects if coding standards are followed and delay calculation tools are provided. In this area, the VITAL (VHDL Initiative Toward ASIC Libraries) standardization project is ongoing, and it is currently bearing fruit in the form of simulation providers’ built-in VITAL support.

Похожие публикации