Изучение VHDL. Стиль программирования для синтеза
Одним из важнейших назначений VHDL является описание проектов дискретных устройств для автоматизированного проектирования микросхем. В основе технологии разработки микросхем (заказных СБИС или ПЛИС) лежит автоматическая трансляция VHDL-описания дискретного устройства в схему на логическом уровне, которая выполняется с помощью компилятора-синтезатора. Здесь под синтезом понимается получение аппаратной модели, которая исполняет исходную VHDL-программу и преобразование её в логическую схему. Причем подбор структуры модели, её логическая оптимизация по критериям минимума аппаратуры и максимума быстродействия с учетом элементного базиса целевой микросхемы выполняются автоматически.
Программирование на VHDL означает организацию вычислительного процесса на программистской модели параллельной вычислительной системы, состоящей из виртуальных процессорных элементов (ВПЭ). Например, каждый из таких параллельных операторов, как процесс, параллельное присваивание сигналу, выполняется на таком ВПЭ. А последовательные операторы процесса образуют программу этого ВПЭ .
Работа компилятора-синтезатора основана на взаимно-однозначном инъективном отображении программистской модели, отвечающей исходной VHDL-программе, в аппаратную модель. Это означает, что каждому из виртуальному ВПЭ с его программой ставится в соответствие некоторый специализированный процессорный элемент (СПЭ), а граф линий связи между ВПЭ и граф соединений между СПЭ - изоморфны.
Различают два типа СПЭ: СПЭ с памятью и без неё. СПЭ без памяти представляют собой комбинационную схему, состояние выходов которой (источников сигнала) представляет собой некоторую логическую функцию от состояния её входов (приемников сигнала).
СПЭ с памятью имеют в своей структуре комбинационную схему и регистры для хранения результатов и промежуточных операндов. Состояние выходов СПЭ является логической функцией не только от состояния входов, но и от состояния регистров. Регистры могут запоминать операнды как по уровню синхросигнала (защелка), так и по его фронту (триггер).
В отличие от ВПЭ задержка от входов СПЭ до его выходов представляет собой величину, определяемую по характеристикам элементного базиса, а не дельта-задержку или задержку, заданную оператором wait.
При отображении вместо оператора каждого типа подставляется соответствующая ему логическая схема. Так, операции and ставится в соответствие логическое "И", а операции "*" - комбинационный умножитель.
Если, по ceмантике оператора процесса предполагается, что не вce его переменные и сигналы выполняют присваивания при некотором запуске процесса, то это означает, что такие переменные и сигналы должны хранить свое предыдущее состояние при этом запуске. Поэтому эти процессы отображаются в СПЭ с памятью.
На аппаратную модель реализации VHDL налагается ряд ограничений, свя-зан-ных с особенностями элементной базы СБИС или ПЛИС. Эти ограниче-ния имеют прообраз в программистской модели. В основном, они образуют множество объектов и операторов языка, которые не могут быть отображены в аппаратуру, так как не имеют в ней соответствующего эквивалента.
На ceгодняшний день не могут быть отображены в аппаратуру сигналы и переменные типа с плавающей запятой, динамического типа, файлового типа, операция деления, операторы wait с параметром задержки, операторы вывода на консоль assert и report. Также глобальные переменные не находят своего отображения.
Некоторые значения перечисляемого типа, такие как "U" - не инициализированное, "Х" - неизвестное, "-" - безразличное, также не могут быть отображены в аппаратуру, а другие, как например, "Н" - слабая единица или "L" - слабый ноль, отображаются, соответственно в 1 и 0.
Не могут быть синтезированы такие языковые конструкции, для которых невозможно определить конкретную комбинационную схему на период компи-ля-ции. Например, оператор цикла отображается в многоуровневую комбинаци-он-ную схему, в которой число уровней равно количеству итераций. И если ко-ли-чест-во итераций неизвестно на период компиляции, т.е. это количество не выражено статическим выражением (например, если пара-метр итераций вычисляется в процесce), то такую схему построить невозможно.
Говорят, что VHDL-программа, в которой отсутствуют несинтезируемые объек-ты, операторы и конструкции, написана стилем для синтеза. При составлении программы стилем для синтеза желательно принять во внимание следующее.
»Существует несколько широко распространенных компиляторов-синтезаторов от различных фирм-поставщиков. Эти компиляторы различаются, в частности, списком несинтезируемых элементов языка VHDL. Причем с появлением новых версий компиляторов этот список обычно сокращается.
»Компиляторы-синтезаторы также существенно различаются по возможностям оптимизации отображения, набором атрибутов, управляющих синтезом, библиотеками процедур и функций, возможностями распознавания идиом языка, которые эффективно отображаются в СПЭ, адаптированные к целевой элементной базе. Поэтому для умелого написания программ для синтеза желательно накопить опыт работы с тем или иным компилятором.
Программисты, которые уже ощутили смысл и тонкости синтезируемого стиля, программируют свою собственную программистскую модель. Такая модель является тем самым вычислительным устройством, которое проектируется. При этом естественным образом представляется, как за каждым параллельным оператором стоит аппаратный узел, который исполняет этот оператор.
Например,
Сprocess(clk) beginif rising_edge(clk) then if ena='1'; then Сend if; end if; end process; -- отображается в регистр с разрешением записи, а process(clk) begin if rising_edge(clk) then if ena='1' then Сend if ; end if; end process; -- отображается в тот же сумматор с тем же регистром на выходе.