Учебный курс. Немного о ПЛИС (FPGA) и Verilog.

В старые добрые времена, когда степень интеграции микросхем была невысока, цифровые блоки и устройства собирали из отдельных интегральных схем логики. Были микросхемы элементов И-НЕ, ИЛИ-НЕ, мультиплексоров, сдвиговых регистров, счетчиков и т. д.

old_digital_scheme

Сегодня степень интеграции и быстродействие цифровых интегральных схем достигла очень высокого уровня, а рынок электронных компонентов наполнен всевозможными микроконтроллерами, памятью, микросхемами интерфейсов на любой вкус и для любых потребностей. Некоторые даже покупают дешевые одноплатные компьютеры размером со спичечный коробок, с линуксом на борту, только лишь для того, чтобы мигать светодиодной гирляндой на новогодней елке. Практически для любой задачи можно найти множество вариантов решений, оптимальных и не очень. Однако, если требуется разработать какое-то особенное, узкоспециализированное устройство, то не всегда удается найти простое и готовое решение. Представьте, что нам необходимо сделать устройство для сбора данных с 200 датчиков каждые 5 нс, да еще и обрабатывать информацию с них в реальном времени. Ни один процессор не сможет справиться с этой задачей, а если ставить десятки и сотни процессоров или микроконтроллеров в устройство, то его сложность и стоимость увеличатся в разы. Все дело в том, что ядро в процессоре или микроконтроллере выполняет программу (инструкции) последовательно, шаг за шагом, и данные с датчиков придется считывать по-очереди, один за другим. Даже если на получение данных с одного датчика требуется 1 такт, а ядро работает на частоте 1 ГГц (1 такт = 1 нс), то опрос всех датчиков займет 200 нс, плюс еще требуется время на обработку этих данных в программе.

Решить эту задачу можно при помощи программируемых логических интегральных схем (ПЛИС или FPGAField Programmable Gate Array). ПЛИС представляет собой набор (матрицу) из множества однотипных логических блоков, входы и выходы которых коммутируются между собой определенным образом, реализуя требуемую логическую функцию. Другими словами, ПЛИС — это конструктор, в котором есть множество различных деталей (логических элементов), и мы можем собрать любую цифровую схему из этих деталей, соединяя их между собой. Применение ПЛИС позволит нам сделать 200 одинаковых логических блоков для опроса датчиков и обработки сигнала с них, причем работать они будут параллельно.

Важно понимать, что ПЛИС не замена и не альтернатива микроконтроллерам. Не стоит стрелять из пушки по воробьям и использовать ПЛИС там, где можно обойтись микроконтроллером, а то и вовсе простейшей логикой. В первую очередь, ПЛИС выигрывает там, где необходимо большое количество ресурсов, параллельность обработки данных и высокое быстродействие, а также для создания прототипов цифровых заказных интегральных схем (ASIC).

Если разрабатываемое устройство будет выпускаться в больших количествах (сотни тысяч или миллионы штук), то целесообразнее заказать специализированную микросхему (ASIC), это будет дешевле, чем ставить ПЛИС в каждый прибор. Поскольку производство ASIC очень дорогое удовольствие, то необходимо быть уверенным в том, что разработанная цифровая схема работает должным образом в реальной аппаратуре. Для этого реализация схемы «обкатывается» на ПЛИС, и если устройство работает как надо, то заказывается ASIC. При этом, разработчику не нужно повторно делать работу по проектированию для ASIC, поскольку цифровые схемы описываются на языках описания аппаратуры (простите за тавтологию :-)) — HDL (Hardware Description Language). Описав должным образом логику работы цифрового блока на HDL один единственный раз, разработчик может использовать тот же самый файл в маршруте проектирования как для FPGA, так и для ASIC. Языков описания аппаратуры существует немного, наиболее распространенные языки — Verilog и VHDL. Мне больше нравится Verilog, поэтому в своих примерах я буду использовать его. VHDL показался мне менее лаконичным, «птичим языком», где слишком много лишней писанины. Я не буду сейчас описывать синтаксис и структуру языка Verilog, все это можно найти в соответствующем стандарте (актуальным на сегодня является стандарт 2005 года, так называемый Verilog-2005). Думаю лучше знакомиться с Verilog на примерах, по мере дальнейшего знакомства с цифровой схемотехникой я буду приводить примеры описаний логики на Verilog в своих статьях.

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

Следует отметить, что многие конструкции Verilog являются несинтезируемыми, их нельзя реализовать в виде какой-либо схемы из логических элементов, а можно использовать лишь в тестбенчах. Существует несколько уровней абстракции, которые применяются при разработке устройств. Любой функциональный блок можно рассматривать как «черный ящик», имеющий входы, выходы и ряд характеристик, которыми можно описать его поведение. Сам блок можно реализовать на транзисторах (самый низкий уровень при разработке схем), описать на языке Verilog для последующего синтеза (если схема цифровая) или сделать поведенческую модель чисто для моделирования в составе более крупного блока или системы. Как уже было сказано ранее, не любая конструкция Verilog может быть реализована в виде схемы (синтезирована). Verilog дает много возможностей для описания поведенческой модели блока или устройства, однако для того, чтобы синтезатор смог воплотить Verilog-код  в схему, необходимо придерживаться определенным правилам и использовать только синтезируемые конструкции языка. Синтезируемый Verilog-код представляет собой уровень абстракции, который называется RTL — Register Transfer Level, уровень регистровых передач. Помните картинку, которая поясняла концепцию синхронного дизайна? Так вот, это и есть RTL-уровень. Суть его в том, что данные перемещаются по цифровой схеме от входов к выходам между регистрами по фронту тактового сигнала. По активному фронту данные защелкиваются на выходе регистра и поступают дальше через комбинационную логику на вход следующего регистра. Если время прохождения сигнала через комбинационную логику слишком велико (больше периода тактового сигнала и если нарушаются требования триггеров по setup time и hold time), то блок комбинационной логики дробится на более мелкие части, и вставляются дополнительные регистры между ними.

ch3_pic3_logo

На этом завершу краткое введение в ПЛИС и языки описания аппаратуры. В ближайших статьях постараюсь показать процесс разработки и реализации какой-нибудь простой цифровой схемы на примере.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *