≪
≫

Введение

При разработке данного пособия использовался курс «Designing with VHDL» фирмы Xilinx.

Существующие семейства FPGA значительно отличаются как по количеству основных элементов, таких как LUTbi (просмотровые таблицы) и слайсы (slice), так и по наличию и количеству специализированных полупроводниковых ресурсов - тактовых ресурсов, математических ускорителей DSP48/E, высокоскоростных портов. Язык описания аппаратуры VHDL в большинстве случаев ограждает проектировщика от изучения этих архитектурных тонкостей и позволяет сосредоточиться на функциональности разрабатываемого устройства.

Язык описания аппаратуры высокоскоростных интегральных схем VHDL (VHSIC Hardware Description Language) был выпущен в 1985 г. Институт инженеров электротехники и электроники (IEEE) формализовал язык в стандарты, которые обновлялись несколько раз (в 93 и 2000 гг.). VHDL является в первую очередь инструментом для аппаратного моделирования и документирования. Поэтому если для моделирования стандарты IEEE являются исчерпывающими, то при синтезе они определяют лишь общие параметры, без указания конкретной реализации логического уровня. Синтез представляет собой процесс преобразования VHDL кода в набор конкретных примитивов и связей на FPGA. Он, в отличие от моделирования, физически осуществим и, следовательно, существуют пределы того, что можно сделать. Моделирование же выполняется на компьютере и поэтому существует много дополнительных абстракций и возможностей, отсутствующих в синтезе. Например, оператор “wait for 10.083 ns;” является правильным и корректно выполнится при моделировании, но для аппаратной реализации этого выражения потребуется тактовый генератор с частотой более 1 ТГц, что недостижимо в современных коммерческих технологиях.

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

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

VHDL поддерживает однопроходный компилятор, т.е. всё должно быть определено прежде, чем будет использовано. После компилирования инструменты Xilinx автоматически упорядочивают файлы для анализа в соответствии с иерархией.

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

Рассмотрим эти стили на примере сумматора. Поведенческий код "Sum<=A+B after 3 ns" описывает ЧТО происходит, а не КАК и таким образом, поведение сложных систем может быть относительно легко описано без знания деталей уровня логических вентилей и их внутренней работы. Структурное программирование полностью зависит от библиотек поставщиков FPGA, в которых содержатся списки из примитивов - "черных ящиков", которые могут быть использованы пользователем, например "component XLX_ADD2 port(A: in bit; В: in bit; SUM: out bit); end component XLX_ADD2". RTL-код "SUM <= A+B" преобразуется инструментами синтеза в список соединений и передается инструментам реализации, чтобы в итоге стать битовым потоком, который загружается в FPGA.

FPGA (Программируемая пользователем вентильная матрица) представляет собой логическое полупроводниковое устройство, которое может быть запрограммировано проектировщиком на выполнение конкретной задачи. FPGA являются одним из видов Программируемых логических интегральных схем. Они являются устройствами со статической памятью с произвольным доступом (SRAM), что означает потерю конфигурации при отключении питания. FPGA, как правило, программируются с внешнего источника: конфигурации программируемого ПЗУ (PROM) или микропроцессора.

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

Конфигурируемые логические блоки (CLB) содержат как логику принятия решений, так и простую память и состоят из двух и более слайсов. Каждый слайс содержит просмотровые таблицы комбинаторной логики (LUTbi), триггеры, смежные ресурсы (например, мультиплексоры). LUTbi могут вести себя как комбинаторные элементы (п-входовые с одним выходом), синхронные регистры сдвига, память (однопортовая, двухпортовая, RAM, ROM).

Блоки ввода/вывода (IOB) обеспечивают необходимое воздействие с внешним миром и могут включать в себя дополнительные триггеры и логику для специализированных интерфейсов, таких как DDR и последовательный порт.

Глобальный тактовый буфер (BUFG) - часть системы генерации, распределения и контроля тактового сигнала.

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

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

Синтез. Синтез представляет собой процесс трансформации исходного описания проекта (HDL-кода или логической схемы) в список соединений, выполненный на низком аппаратном уровне и соответствующий ресурсам выбранной платы.

Реализация (Implementation) включает в себя несколько этапов, связанных с подготовкой переноса проекта на плату. Трансляция (Translation) преобразует множество списков соединений (в том числе и из библиотек) в один большой список соединений и проверяет, чтобы ресурсов, необходимых для этого проекта, хватило для прошивки в выбранную FPGA. Отображение (Мар) выбирает конкретные виды ресурсов (например, DSP48/E) для размещения описанных соединений. Размещение и трассировка (Place and Route) определяют физическое размещение ресурсов и связи между ними.

Заключительным этапов является Генерация прошивки (Bitstream generation), которая преобразует результаты реализации в один или несколько форматов, загружаемых на FPGA, включая PROM образ.

Далее в данном курсе вы подробнее познакомитесь с этими этапами. Каждый проект состоит из модулей. Типичный VHDL модуль является членом иерархии проекта и выполняет одну небольшую задачу, часто используя экземпляры модулей нижнего уровня. Для каждого модуля должны быть определены его интерфейс (раскрыт в entity, области описания объектов), поведение (описано в архитектуре) и его целевые показатели, связанные с конкретной выбранной платой (описаны в файле ограничений синтеза и свойствах синтеза). Для каждого проекта должны быть определены его свойства производительности (описаны в файле ограничений синтеза и UCF) и его связь с внешним миром (описана в UCF). Файл ограничения Xilinx (XCF) имеет аналогичный пользовательскому файлу ограничений (UCF) формат. Файлы ограничений синтеза используются в основном для указания инструментам синтеза способа реализации конкретного аспекта проекта.

Файл ограничений Xilinx (XCF) передает эксплуатационные требования инструменту синтеза XST. XST использует модель нагрузки (fanout - коэффициент разветвления) для прогнозирования производительности. Инструменты синтеза могут только приблизить фактические результаты, которые могут значительно отличаться. XST использует файл ограничений синтеза для принятия решений относительно производительности:

  • • Определенного ресурса. Пользователь может непосредственно указать, как создать ресурс: INST U2 ram_style = block. Когда появляется экземпляр с именем U2, он должен быть реализован в виде блочной, а не распределенной памяти.
  • • Общей производительности системы, на основе того, как выводятся отдельные компоненты: TIMESPEC "TS_main_clock"= PERIOD "TNM_main_clock" 20 ns INPUT_JITTER 10 ps. Показывает, что все сигналы, идущие от одного триггера, подключенного к сигналу main_clock, до любого другого триггера, подключенного к сигналу main_clock, должны прибыть менее чем за 20 нс. Инструменты автоматически рассчитывают наихудшее воздействие джиттера (Дрожание фазы - отклонения фазы или частоты передаваемого сигнала. При высокоскоростной передаче это явление может приводить к возникновению ошибок или потере синхронизации) на вычисление установки, удержания и вывода времени для триггеров.

Данные проблемы возникают на последних стадиях проектирования. Разберем для начала основы проектирования и моделирования проекта.

 
Посмотреть оригинал