Изучение VHDL



         

Программистская модель вычислителя VHDL


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

Он знает, что VHDL - это язык программирования. Но у него возникает вопрос, программирования чего? При программировании на Си программист должен представлять, что он с помощью этого языка описывает задуманный алгоритм для его реализации на неймановской модели ЭВМ, содержащей, АЛУ, регистровую, оперативную, дисковую память и т.д., что существуют определенные типы данных и механизмы доступа к ним. Другими словами, он программирует некоторую программистскую модель вычислителя для реализации данного языка. Безусловно, для успешного программирования на этом языке необходимо досконально знать программистскую модель соответствующего вычислителя, т.е. его архитектуру.

Составление программы VHDL означает программирование модели вычислителя, выполняющего эту программу. Поэтому далее рассмотрим программистскую модель вычислителя для реализации языка VHDL. Собственно, алгоритм, описанный на VHDL, представляет собой некоторое множество вычислительных процессов, организованных на определенной модели вычислителя. Кроме того, для понимания реализации VHDL в симуляторах используется модель вычислителя с точки зрения разработчика симуляторов. Наконец, при синтезе логических схем рассматривается аппаратная модель реализации VHDL, т.е. модель, реализуемая в СБИС или ПЛИС.

Наиболее полно программистская модель вычислителя VHDL описана в руководстве к стандарту языка (VHDL'93. IEEE Standard VHDL Language Reference Manual или сокращенно - LRM) . В нем параллельно с описанием синтаксиса и семантики всех языковых конструкций приводятся объяснения их реализации в модели вычислителя. Но, изучая это руководство, с первого раза, трудно постичь основы этой модели. LRM предполагает, что читатель будет его листать из начала - в конец, из конца - в середину, из середины - вперед и т.д. несколько итераций, пока не возникнет понимание целостной картины языка. Наверное, за это VHDL и не любят, так как такая методика его освоения вызывает к нему отвращение. С другой стороны, тот, кто постиг основы VHDL, чувствует себя более свободным в обращении с ним.

Ниже описывается упрощенная модель вычислителя VHDL, которая содержит основные особенности этой модели и не противоречит модели, описываемой в LRM.

В отличие от большинства современных языков программирования, язык VHDL основан на параллельной многопроцессорной модели. Нижний уровень модели образует архитектура виртуального процессорного элемента (ВПЭ), а верхний уровень - множество ВПЭ, объединенных некоторой запрограммированной системой межпроцессорных связей.

Структура ВПЭ состоит из арифметико-логического устройства (АЛУ), ОЗУ данных (ОЗУД), ОЗУ программы (ОЗУП) и определенного количества источников (ИС) и приемников (ПС) сигналов.

АЛУ выполняет такой же набор операций, какой требуется для реализации большинства языков программирования, как, например, сложение, умножение, деление с фиксированной и плавающей запятой, логические операции и т.д. Кроме того, АЛУ выполняет многие другие операции, специфические для VHDL, такие как операции над данными с произвольной заданной разрядностью, с многозначным логическим представлением разрядов. При этом постоянно проверяется корректность результата операции, и фиксируются ошибки как-то: выход за заданный диапазон представления числа, несовпадение типов операндов и результатов получение ошибочного результата и т.п.

В ОЗУ данных хранятся переменные, участвующие в вычислениях. Переменные имеют статические адреса, но при необходимости можно реализовать динамический доступ к переменным. Источники и приемники сигналов служат, в основном, для связи ВПЭ с внешним миром. При поступлении сигнала на вход приемника сигнала он фиксирует это событие. В приемнике хранится как текущее, так и предыдущее состояние сигнала. При выполнении операции с идентификатором сигнала, как с операндом, выполняется чтение приемника сигнала. После выполнения оператора присваивания сигналу источник сигнала генерирует соответствующий сигнал.

В ОЗУ программы хранится программа в виде цепочки операторов. Операторы, включая условные операторы, выполняются последовательно друг за другом, как в обычных языках программирования. Но на операторах wait выполнение программы останавливается.

Операндами оператора wait являются набор входных сигналов, так называемый список чувствительности, или заданный промежуток времени задержки, или булевское выражение от некоторых данных.

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

Такая программа записывается в VHDL-программе как один параллельный оператор, называемый процессом, а ВПЭ выполняет его как вычислительный процесс.

Отдельным входом-выходом ВПЭ является шина передачи глобальных (shared) переменных. Глобальная переменная может приниматься (участвовать как операнд) или передаваться из ПЭ (как результат операции присваивания) в произвольные моменты времени. В языке не предусмотрены механизмы синхронизации передачи глобальных переменных. Поэтому их применение ограничено, например, рассылкой общего начального значения, работой с файлами.

К ВПЭ можно подключать дисковую память. При этом операторы открытия, чтения, записи, закрытия файлов используются аналогично, как в других языках.

Верхний уровень программистской модели составляет множество ВПЭ, объе­ди­нен­ных линиями связи, по которым передаются сигналы. Общи­ми для всех ВПЭ являются консоль для связи с оператором-программистом (клавиатура и дисплей), дисковая память и ОЗУ глобальных переменных.

Количество ВПЭ в системе равно числу процессов в программе VHDL после её компиляции. Линий межпроцессорной связи в структуре системы столько, сколько необходимо для исполнения VHDL-программы.

Как и в других языках параллельного программирования, в VHDL сигнал используется одним вычислительным процессом для сообщения другим вычислительным процессом факта исполнения

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

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

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

Если в процессе не использованы операторы wait с установленной задержкой, то цикл запуска-остановки этого процесса выполняется почти мгновенно, а точнее - с дельта-задержкой. Здесь дельта-задержка - исчезающе малый промежуток времени, одинаковый для всех таких процессов.

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

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

При программировании необходимо учитывать следующее.

  • Все процессы исполняются параллельно.
  • " Одновременно исполняемые процессы образуют фронт волны запусков про­цес­сов. Этот фронт передвигается с временным шагом, равным дельта-задержке.
  • " Все параллельные операторы языка VHDL преобразуются в функционально эквивалентные операторы процессов, поэтому данная вычислительная модель годится для произвольной VHDL-программы.
  • Структура вычислительной модели остается неизменной после компиляции программы, т.е. после своего формирования. Эта структура не зависит от сигналов и переменных, изменяемых в процессе выполнения программы, т.е. она не может перестраиваться динамически.
  • Область действия всех переменных (кроме глобальных) ограничена рамками операторов процесса. Вне процессов переменные невидимы.
  • Порядок доступа к глобальным переменным непредсказуем. Следует с осторожностью программировать с этими переменными. Желательно отказываться от их использования в программах.
Анатолий Сергиенко
E-mail: aser@comsys.ntu-kpi.kiev.ua


Содержание  Назад  Вперед