Что такое FPGA? Введение в программируемую логику
Рассмотрим аппаратный подход к выполнению вычислений, маршрутизации цифровых сигналов и управлении встраиваемыми системами с помощью программируемой логики и FPGA (Field-Programmable Gate Array, программируемой пользователем вентильной матрицы).
FPGA – это программируемая логическая матрица. По своей сути, FPGA представляет собой массив взаимосвязанных цифровых подсхем, которые реализуют общие функции, а также предлагают очень высокий уровень гибкости. Но полная картина того, что такое FPGA, требует большего разбирательства. В данной статье представлены концепции FPGA и кратко обсуждается, что такое логические элементы, как программировать FPGA, и что отличает FPGA от микропроцессоров в плане разработки.
FPGA против микроконтроллера (Или зачем использовать FPGA, когда будет работать и микроконтроллер?)
Я думаю, мы все можем согласиться с тем, что микроконтроллеры стали доминирующим компонентом в современных электронных проектах. Они недорогие и универсальные, и в наши дни они часто служат первым в мире знакомством с миром электроники. Естественно, что мы продолжаем использовать компоненты, с которыми знакомы, и поскольку микроконтроллеры становятся всё более мощными, всё меньше и меньше нужно рассматривать альтернативные решения для наших задач проектирования. Тем не менее, микроконтроллер построен вокруг процессора, а процессоры имеют фундаментальные ограничения, которые необходимо признать и в некоторых случаях преодолеть.
Итак, когда инженер предпочтет FPGA микроконтроллеру? Ответ сводится к программному обеспечению и аппаратным средствам.
Процессор выполняет свои задачи, выполняя инструкции последовательно. Это означает, что операции процессора, по сути, ограничены: требуемая функциональность должна быть адаптирована к доступным инструкциям, и в большинстве случаев невозможно одновременно выполнять несколько задач обработки.
Набор инструкций рассчитан на высокую универсальность, и в настоящее время инструкции могут выполняться на чрезвычайно высоких частотах; однако эти характеристики не устраняют недостатки программного подхода к цифровому проектированию.
Альтернативой является аппаратный подход. Было бы чрезвычайно удобно, если бы каждый новый проект мог быть построен вокруг цифровой микросхемы, которая в точности реализует функциональность, требуемую системой: нет необходимости писать программное обеспечение, никаких ограничений набора команд, никаких задержек обработки, только одна микросхема, которая имеет входные выводы, выходные выводы и цифровую схему, в точности соответствующую необходимым операциям. Эта методология нецелесообразна вне описания, поскольку она предполагает разработку ASIC (application-specific integrated circuit, специализированной интегральной микросхемы) для каждой платы. Однако мы можем аппроксимировать эту методологию, используя FPGA.
Что такое программируемая пользователем вентильная матрица?
Хорошее название может быть довольно информативным, и я бы подумал, что «программируемая пользователем вентильная матрица» («field-programmable gate array») будет достаточно хорошим названием. FPGA – это матрица логических вентилей (ну вроде – смотрите ниже) и эта матрица может быть запрограммирована (на самом деле, «сконфигурирована», вероятно, более подходящее слово) в поле, то есть пользователем устройства, как противоположность людям, которые его разработали. Давайте посмотрим на основные характеристики.
Логические вентили (элементы) (И, ИЛИ, исключающее ИЛИ и т.д.) являются основными строительными блоками цифровой схемы. Поэтому неудивительно, что цифровое устройство, которое должно быть чрезвычайно конфигурируемым (то есть "field-programmable" / программируемым в поле / программируемым пользователем), будет состоять из множества вентилей, которые могут быть связаны между собой настраиваемым способом.
Однако FPGA не является огромной коллекцией отдельных булевых элементов. Это было бы очень неоптимальным способом обеспечения функциональности конфигурируемой логики, потому что не использовало бы тот факт, что распространенные операции могут быть реализованы гораздо эффективнее как фиксированные модули. Тот же принцип проявляется и в мире дискретных цифровых микросхем. Вы можете купить микросхемы, которые состоят из элементов И, элементов ИЛИ и т.д., но вы не захотите создавать сдвиговый регистр из отдельных элементов. Вместо этого вы купите микросхему сдвигового регистра.
Конфигурируемые логические блоки (CLB) должны взаимодействовать друг с другом и с внешней схемой. Для этих целей FPGA использует матрицу программируемых межсоединенй и блоков ввода/вывода (I/O). «Программа» FPGA хранится в ячейках SRAM, которые влияют на функциональность блоков CLB и управляют коммутаторами, которые устанавливают пути подключения.
Подробное объяснение внутренней структуры и работы блоков CLB потребует целой статьи (если не нескольких статей). Общая идея заключается в том, что CLB включают в себя таблицы поиска, элементы хранения (триггеры и регистры) и мультиплексоры, которые позволяют CLB выполнять логические операции, операции хранения данных и арифметические операции.
Блок ввода/вывода состоит из различных компонентов, которые облегчают связь между CLB и другими компонентами на плате. К ним относятся подтягивающие резисторы, буферы и инверторы.
Программируемая пользователем логика (Или как вы программируете FPGA?)
Как мы собираемся превратить массив настраиваемых логических блоков (CLB, Configurable Logic Block) в цифровую схему, которая делает именно то, что мы хотим? На первый взгляд это кажется довольно сложной задачей. Действительно, реализация FPGA обычно считается сложнее, чем программирование микроконтроллера. Однако разработка для FPGA не требует глубокого знания функциональности CLB или кропотливой компоновки внутренних межсоединений, так же как разработка для микроконтроллеров не требует глубокого знания инструкций на языке ассемблера процессора или внутренних сигналов управления.
На самом деле, несколько неверно представлять FPGA как самостоятельный компонент. FPGA всегда поддерживаются программным обеспечением для разработки, которое выполняет сложный процесс преобразования аппаратного проектирования в программируемые биты, которые определяют поведение межсоединений и CLB.
Это оставляет нам важный вопрос: как мы «объясним» программе, что должно делать аппаратное обеспечение FPGA?
Языки описания аппаратных средств
Оказывается, люди создали языки, которые позволяют нам «описывать» аппаратное обеспечение, они называются (очень соответствующе) языки описания аппаратных средств (HDL, hardware description language), а два наиболее распространенных – VHDL и Verilog. Несмотря на очевидное сходство между HDL кодом и кодом, написанным на языке программирования высокого уровня, они принципиально отличаются друг от друга. Код программы определяет последовательность операций, тогда как HDL код больше похож на схему, которая использует текст для представления компонентов и создания взаимосвязей.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
----------------------------------------------------
entity circuit_2 is
Port ( a : in STD_LOGIC;
b : in STD_LOGIC;
c : in STD_LOGIC;
d : in STD_LOGIC;
out1 : out STD_LOGIC;
out2 : out STD_LOGIC);
end circuit_2;
-----------------------------------------------------
architecture Behavioral of circuit_2 is
signal sig1: std_logic;
begin
sig1 <= ( a and b );
out1 <= ( sig1 or c );
out2 <= (not d);
end Behavioral;
Заключение
Надеюсь, теперь вы понимаете основные характеристики устройств программируемой логики и их потенциальные преимущества в отношении процессорных систем. Современные FPGA – это сложные, высокопроизводительные устройства, которые могут быть несколько пугающими для тех, кто привык использовать микроконтроллеры для сбора данных, управления микросхемами специального назначения и выполнения математических операций. Однако вы можете обнаружить, что в некоторых приложениях улучшенная производительность и универсальность стоят дополнительных усилий в разработке.
А в ближайшее время на RadioProg появится несколько статей, помогающих начать разработку на FPGA.