В. Соловьев, А. Климович Использование свободного программного обеспечения в устройствах на основе ПЛИС, Elphel, Inc.

Использование свободного программного обеспечения в устройствах на основе ПЛИС

В. Соловьев, А. Климович


Оригинал статьи: http://www.xilinx.com/publications/xcellonline/xcell_46/xc_freesw46.htm
        Перевод взят с сайта: http://www3.elphel.com/ru/articles/xc_freesw46_r.html



перевод статьи "How to Use Free Software in FPGA Embedded Designs" , опубликованной в в онлайновом журнале Xilinx Xcell

Стремясь принести достижения движений свободного ПО и ПО с открытым кодом в обиход разработчиков электронной аппаратуры, Андрей Филиппов создал недорогую высокопроизводительную сетевую камеру, используя ПЛИС Spartan-IIE и бесплатное ПО фирмы Xilinx.

Недавно Гордон Мур «продлил» свой закон еще на десять лет, предсказывая, что плотность микросхем будет продолжать удваиваться каждые полтора года. Чем разработчик может ответить на вызов все усложняющейся электроники? Один из возможных ответов - эффективно использовать то, что другие уже создали, концентрируя усилия на действительно новых аспектах.

Возрастающее число успешных применений принципов свободного ПО и ПО с открытым кодом (FS/OSS) подтверждает эффективность использования наработок других при создании программных продуктов. Программируемые микросхемы Xilinx представляют собой границу между «мирами» программного обеспечения и аппаратуры, предоставляя уникальную возможность для применения аналогичного подхода при проектировании электронных устройств.

Я уверен, что потенциал для подхода FS/OSS при разработке аппаратуры даже выше, чем при создании программ - ведь доход можно получать с продаж изделий. В настоящей статье я хочу показать, как такой метод помог мне создать высокоскоростную сетевую камеру высокого разрешения (сетевые камеры не требуют дополнительных компьютеров для передачи цифровых изображений и видео по локальной сети или через Интернет).

Введение

Впервые я познакомился с GNU/Linux менее двух лет назад, когда я осознал, что мне самому придется программировать камеру, которую я создал на основе процессора ETRAX100LX. Этот процессор, созданный фирмой Axis Communications AB, оптимизирован для GNU/Linux. Имея опыт разработки микропроцессорных устройств, которые, в основном, программировались на ассемблере, я был изумлен, что всего через пару недель камера была способна передавать JPEG изображения через локальную сеть по HTTP протоколу - для управления можно использовать любой стандартный браузер.

Та камера (модель 303) совместила ПО из различных источников - самой GNU/Linux, специфического ПО для платформы ETRAX и многих, многих других. Мне пришлось лишь добавить поддержку моей аппаратуры и модифицировать некоторые из программ. Больше всего меня поразила легкость навигации в больших системах, возможность находить места, где небольшие изменения кода приводят к желаемым изменениям функциональности.

Будучи, в основном, разработчиком аппаратуры я стал думать над аналогичным увеличением продуктивности в аппаратной (включая ПЛИС) части камеры.

Цели разработки

Начиная проектирование новой камеры я преследовал следующие цели:

  • Создать высокопроизводительную, но простую сетевую камеру, которая полностью использует возможности мегапиксельных КМОП (CMOS) приемников изображений - 15 к/сек для 1280х1024, пропорционально выше для меньших разрешений.
  • Использовать реконфигурируемую ПЛИС для считывания, обработки и сжатия изображений. Эта цель - следствие следующих требований:
    – Упростить разработку. Руководствуясь предыдущим опытом, я рассчитал, что полностью отладить прошивку однократно программируемой ПЛИС было бы очень сложно и долго, т.к. выбранная микросхема Xilinx Spartan™-IIE XS300E в пять раз больше (по количеству вентилей) чем самая сложная из однократно программируемых, которую мне когда-либо удалось спроектировать. В дальнейшем, возможность перехода от моделирования к тестированию реальной аппаратуры, и обратно, доказала свою высокую эффективность.
    – Создать гибкую систему, где аппаратные алгоритмы можно обновлять аналогично программному обеспечению - это должно существенно увеличить срок жизни продукта.
    – Увеличить число возможных применений продукта, предлагая открытую для доработок платформу разработчика.
  • Использовать только бесплатные, загружаемые средства разработки, чтобы пользователь мог дорабатывать мой продукт без необходимости тратить тысячи долларов на программное обеспечение.
Выбор подходящей ПЛИС

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

Вскоре я нашел подходящую микросхему - ей оказался самый большой (на то время) член семейства Spartan-IIE фирмы Xilinx - XS300E объемом 300 тыс. вентилей

Чтобы определить, можно ли осуществить JPEG-сжатие изображений размером 1,3 мегапикселя со скоростью 15 кадров в секунду, я стал искать коммерческие IP, которые выполняют аналогичные задачи. Такие продукты нашлись, и, из приведенных параметров, было видно, что оставшихся ресурсов мне хватит для контроллера SDRAM (для буфера кадров), коррекции неоднородности чувствительности ячеек, преобразования цветового пространства и интерфейса ЦПУ.

Однако я не мог воспользоваться найденным IP, так как это помешало бы мне держать открытым свой исходный код. Так что я воспользовался найденной информацией, как временной заменой собственного опыта работы с устройствами Xilinx.

Убедившись, что возможности выбранной ПЛИС позволяют осуществить задуманное, я загрузил и установил бесплатное ПО WebPACK 4.2i с веб-сайта Xilinx, чтобы его попробовать - мне нужно было проверить, что средства разработки также отвечают моим целям.

Чтобы приобрести начальные навыки работы как с ПО, так и с устройствами Xilinx, я прочитал их заметку по применению XAPP610 и решил реализовать описанный там двумерный алгоритм ДКП (DCT) размером 8х8 точек, который необходим для JPEG-сжатия. Статья содержала исходный код на языке Verilog, что позволило мне осуществить синтез, размещение и разводку. Проблемы появились, когда я попытался промоделировать работу схемы.

Оказалось, что "облегченная" версия симулятора, производимого сторонней компанией и включенного в бесплатный пакет WebPACK, имеет встроенные ограничения на сложность проекта, такие, как предел размера исходного текста, установленный в 500 строк. Даже один алгоритм ДКП занимал больше, но мне все же удалось его промоделировать, убрав строки комментариев и соединив по несколько строк в одну

Так что хотя "облегченный" симулятор и заработал для одного модуля, но для моего проекта его возможностей явно не хватало, и мне пришлось искать другие средства моделирования. Остальные компоненты WebPACK меня полностью устроили - в окончательном варианте мне удалось использовать более 98% ресурсов кристалла, результат удовлетворял всем наложенным условиям по временам прохождения сигналов.

Архитектура системы

После того, как я убедился, что микросхема Spartan-IIE обладает достаточными возможностями для осуществления проекта, я занялся разработкой схемы и печатных плат. Камера модели 313 состоит из двух печатных плат. Меньшая плата предназначена для приемника изображений и связанных с ним компонентов. Основная четырехслойная плата размером 38 х 89мм содержит следующие основные компоненты:

  • 32-х разрядный процессор с тактовой частотой 100 МГц (ETRAX100LX, Axis Communications), на котором работает операционная система GNU/Linux. Наряду с собственно ЦПУ, микросхема содержит множество периферийных устройств, в том числе контроллер локальной сети.
  • 10/100 Мб Ethernet PHY (BCM2521A4KPT, Broadcom).
  • Системная память объемом 16 МБ (4Mx32) на микросхеме SDRAM (MT48LC4M32LFFC-8, Micron).
  • Флэш-память объемом 8MБ (4Mx16) (MT28F640J3FS-12, Micron), используемая для хранения ОС GNU/Linux, приложений, веб-страниц, конфигурационных файлов, а также файлов программирования ПЛИС.
  • Spartan-IIE - перепрограммируемая ПЛИС размером 300 тыс. вентилей (Xilinx XC2S300E-6FT256), используемая для управления считыванием изображений, их обработки, хранением в кадровой памяти (на основе SDRAM), сжатием и передачей в системную память по каналу прямого доступа к памяти. ПЛИС конфигурируется через JTAG интерфейс, соответствующие выводы микросхемы подключены к одному из универсальных параллельных портов процессора.
  • Кадровая память объемом 16 МБ (8Mx16) на микросхеме SDRAM (MT48LC8M16LFFF-8, Micron) подключена непосредственно к ПЛИС так, что доступ к ней не занимает системную магистраль процессора. Эта память выделена для временного хранения несжатых изображений и таблиц по-пиксельной калибровки сенсора для дальнейшей компенсации неоднородности ячеек. Такая обработка осуществляется в ПЛИС «на лету», без замедления процесса регистрации изображений, путем по-пиксельного вычитания темнового изображения и умножения результата на число, обратно пропорциональноу чувствительности ячеек.
  • Программируемый тактовый генератор с тремя ФАПЧ (CY22393FC, Cypress) обеспечивает необходимые сигналы при запуске системы (20 МГц для ЦПУ и 25МГц для микросхемы физического уровня сети). Этот генератор также выдает два программируемых сигнала для тактирования ПЛИС. Произвольно задаваемые тактовые частоты ПЛИС позволяют точнее сравнивать результаты моделирования с фактическим функционированием устройства.
  • Выполненный по стандарту IEEE 802.3af источник питания использует изолированный преобразователь из 48В в 3,3В постоянного тока для питания элементов камеры. Дополнительный преобразователь с выходным напряжением 1,8В питает ядро ПЛИС.

Код ПЛИС

Основная часть функциональности камеры реализована внутри ПЛИС Spartan-IIE фирмы Xilinx. Код написан на языке Verilog и опубликован на веб-сайте Elphel на условиях лицензии GNU/GPL. Он разработан вокруг 4-х канального контроллера SDRAM, который использует встроенные в ПЛИС блоки памяти в качестве буферов для обеспечения квази-одновременного доступа четырех следующих источников и потребителей данных:

  • Данные изображений, поступающие от сенсора, либо в исходном виде, либо предварительно обработанные, поступают в память в формате один (два) байта/пиксель и записываются в память как отрезки строк длиной 256 (128) пикселей.
  • Данные по-пиксельной калибровки сенсора, заранее приготовленные программным обеспечением, поступают в блок предварительной обработки из памяти (организованные как 128х16 бит блоки).
  • Данные, поступающие из памяти на вход JPEG-компрессора, организованы, как квадратные блоки размером 16х16 байт.
  • Доступ к памяти от ЦПУ, который используется, например, для считывания необработанных данных сенсора и записи калибровочных параметров пикселей.

Кодировщик JPEG занимает около двух третей ресурсов ПЛИС. Он состоит из цепи модулей, некоторые из которых используют встроенные блоки памяти для буферизации данных и хранения таблиц:

  • Преобразователь данных сенсора с мозаичным фильтром (Bayer pattern) в цветовое пространство YCbCr.
  • 8x8 ДКП (дискретный косинусный преобразователь), выполненный на основе статьи Xilinx XAP610, модифицированный для обеспечения блочно-асинхронного функционирования и увеличения динамического диапазона.
  • Квантизатор и преобразователь последовательности данных зигзагом (для увеличения вероятности длинных пустых последовательностей в выходном коде)
  • Кодировщик RLL.
  • Кодировщик по Хаффману (Huffman encoder).
  • Упаковщик битов (Bit stuffer).

Выходные данные передаются в системную память по каналу ПДП, реализованном в микросхеме ЦПУ.

Результаты

После того, как реконфигурируемая сетевая камера высокого разрешения Elphel модель 313 была впервые описана в онлайн журнале LinuxDevices 3 декабря 2002 г. (и позднее, 4 декабря в Slashdot), значительная часть запросов, которые я получал, была непосредственно связана с открытостью платформы, ее удобством для модификации пользователем.

Возможны четыре уровня модификации камеры. Три из них унаследованы от предыдущей камеры (модель 303) и связаны с открытостью программного обеспечения:

  1. Модификация пользовательского интерфейса с помощью стандартных инструментов веб-дизайна.
  2. Добавление новых приложений (или доработка существующих) которые могут быть загружены в камеру.
  3. Модификация ядра ОС (Линукс) за счет добавления новых драйверов.
  4. Однако, только использование реконфигурируемой ПЛИС Xilinx, поддерживаемой бесплатной системой разработки ISE WebPACK, увеличило производительность камеры почти в 100 раз и сделало возможным еще один, наиболее мощный уровень:

  5. Модификация «сердца» камеры – ПЛИС Spartan-IIE XS300E.

В настоящее время в ПЛИС камеры реализован только алгоритм сжатия baseline JPEG, который позволяет получать как отдельные изображения в формате JPEG, так и видео клипы в формате Apple Quicktime, состоящие из последовательности кадров, сжатых по алгоритму JPEG.

Путем добавления программного обеспечения камеры или HDL кода в ПЛИС, вы можете экспериментировать с другими алгоритмами сжатия изображений и видео - как, например, JPEG 2000 для оптимизации соотношения качество-размер файла для неподвижных изображений или MPEG (-1, 2, 4) для видео. Дополнительно можно запрограммировать процессор и ПЛИС для обнаружения движения, распознавания образов, дискриминации частиц или еще чего-нибудь, что вы можете придумать.

Выводы

Так как же все-таки подход FS/OSS помог мне в создании камеры Elphel модель 313? Возможно, он не смог сократить время разработки ПЛИС в такой же пропорции, как он сделал это для разработки программного обеспечения - областью, где он развился. Но, в целом, этот метод оказался вполне работоспособным:

  • Я использовал свободную имплементацию двумерного ДКТ, опубликованную на веб-сайте Xilinx, которая в камере ответственна примерно за 30% ресурсов ПЛИС. В исходном виде она не удовлетворяла требованиям моей разработки, но в этом-то преимущества свободного кода становятся очевидными - я легко смог ее доработать по своему усмотрению, что невозможно при использовании закрытых проприетарных модулей.
  • Продукт, который получился в результате, обладает такими характеристиками, которых мне самому не хватало как пользователю. Когда мне требовались какие-нибудь специальные режимы работы камеры, то, как ни малы были необходимые изменения, они все равно были невозможны в закрытой проприетарной системе.

Не раз меня спрашивали: «А это не страшно открывать вашу разработку? Что если кто-нибудь воспользуется ей и получит все деньги?»

  • Во-первых, лицензия, которая используется для продукции Elphel (GNU/GPL) это не совсем «общественная собственность» (public domain). Любая компания, которая захочет производить камеры, основанные на разработках Elphel, будет вынуждена играть по тем же правилам - юридическая защита лицензии GPL ничуть не слабее проприетарных лицензий.
  • Такого рода открытую разработку невозможно «украсть». Даже если кто-то в какой-нибудь далекой стране, в которой нет законов про копирайт (и, таким образом, GPL не имеет юридической защиты) начнет производить закрытый производный продукт, этому продукту будет не хватать существенных характеристик камер Elphel - их возможности реконфигурации пользователем (в том числе ПЛИС Spartan).
  • Elphel ведет разработку новых камер, и я буду рассматривать более широкую доступность продуктов, основанных на модели 313, как бесплатную рекламу продукции моей компании.