Построение систем на кристалле с подчиненным процессорным ядром Microblaze на ПЛИС фирмы Xilinx
В настоящее время большое внимание уделяется разработке систем на кристалле с процессорными ядрами, в том числе на ПЛИС фирмы Xilinx [1–3]. В системах на ПЛИС с процессорным ядром возможны два варианта построения. В первом варианте работа с проектом выполняется в среде EDK, при этом процессорное ядро является главным, к нему добавляются пользовательские модули, реализованные на ресурсах ПЛИС. Во втором варианте построения проект создается в среде ISE, система строится на основе модуля, который обычно разрабатывается на языках VHDL или Verilog и является главным, а процессорное ядро является подчиненным блоком и входит в проект наравне с другими устройствами. В настоящей работе рассматривается процесс разработки систем на ПЛИС фирмы Xilinx с подчиненным процессорным ядром Microblaze. Предлагаемая статья рассчитана на читателя, знакомого с основами проектирования в системах ISE [4] и EDK[1].
Структура системы с подчиненным процессорным блоком показана на рис. 1. Внешние сигналы системы поступают в главный модуль, они могут передаваться в процессор непосредственно или после обработки — это зависит от выполняемой задачи. Внешние сигналы процессорного блока являются внутренними сигналами главного модуля.
Рассмотрим один из возможных вариантов построения системы. Сначала создается проект в системе проектирования ISE [4], в том числе создается и подключается к проекту главный файл, созданый на языке VHDL. Затем создается новый модуль — процессорный блок, для чего используется система EDK [1]. В ней выполняются все необходимые действия по формированию аппаратной платформы и программного обеспечения. После того как построение процессорного блока в EDK завершено, в системе ISE выполняются все необходимые действия: задание ограничений пользователя, в том числе размещение внешних сигналов на контактах ПЛИС, реализация проекта и его загрузка в ПЛИС.
Рассмотрим процесс проектирования простейшей системы на основе стартового набора Spartan 3E Starter Kit, описание которого можно найти на сайтах www.xilinx.com и www.plis.ru. Пример выбран максимально упрощенный, с тем, чтобы сконцентрироваться в основном на изучении особенностей построения системы. Описание интерфейса схемы в предлагаемом примере имеет следующий вид:
В схеме используются синхросигнал clk частотой 50 МГц с выхода тактового генератора, сигнал сброса reset, четырехразрядный сигнал sw1 с выходов переключателей. Результаты работы системы выдаются на восемь светодиодов leds1. Все перечисленное оборудование имеется в Spartan 3E Starter Kit.
После задания основных параметров главного модуля создается процессорный блок на основе процессорного ядра MicroBlaze. Для этого в системе ISE с помощью основного меню выполняется такая последовательность: Project ==> New Source. В открывшемся окне выбирается пункт Embedded Processor, в поле File Name задается имя, например, system1, после чего нажимается клавиша Next. В результате запускается XPS (Xilinx Platform Studio), а далее для создания процессорного блока надо следовать указаниям мастера Base System Builder [1], при этом надо указать тип отладочной платы — Spartan 3E Starter Kit и задать опцию No debug, для того чтобы в дальнейшем облегчить процесс подключения логического анализатора ChiScope Pro. В качестве устройств ввода задаются тумблеры (swithes), в качестве устройств вывода — светодиоды (leds). Другие периферийные устройства не включаются. Следует отметить, что хотя сигналы ввода/вывода процессорного блока определены как swithes и leds, в данном случае они используются не для подключения переключателей и светодиодов, а в качестве параллельных портов общего назначения.
Обязательным элементом процессорного блока является программное обеспечение. Исходный модуль программы задается следующим образом:
Данная программа содержит две части: первая часть выполняет инициализацию устройств ввода/вывода, вторая часть содержит бесконечный цикл, задаваемый оператором while. В этом цикле программа принимает число x, увеличивает его на единицу, а затем полученное значение v выдается в качестве результата. Идентификаторы XPAR_LEDS_8BIT_DEVICE_ID и XPAR_DIP_SWITCHES_4BIT_DEVICE_ID создаются системой проектирования EDK, при необходимости их правильное наименование можно уточнить в файле xparameters.h. Для трансляции программы выполняется Software ==> Buildt All User Application [1].
На рис. 2 показан фрагмент исходного файла вместе с машинными командами, содержимое этого документа получено в отладчике ISS; приведены операторы, входящие во вторую часть программы (бесконечный цикл), а также завершающие операторы первой части. Приведенный листинг получен при отключенной оптимизации, если оптимизация включена, то программы получаются на 10–15% короче. Из рис. 2 видно, что вторая часть программы начинается с адреса 1с8h и кончается адресом 200h. Операции ввода/вывода выполняются в подпрограммах: Xgpio_DiscreteRead — начиная с адреса 3c0h, Xgpio_DiscreteWrite — 474h.
После разработки программного обеспечения из системы EDK надо выйти и продолжить работу в системе ISE. Окно Sources в системе ISE в этот момент примет следующий вид (рис. 3).
Для включения процессорного блока в проект надо в окне Sources выбрать строку процессорного блока system1, а в окне Processes активизировать пункт View HDL Instantiation Template. В результате сформируется окно, в котором будет присутствовать шаблон (заготовка) для использования процессорного блока в качестве компонента. Фрагменты этого шаблона переносятся в главный модуль системы. В главном модуле помимо процессорного блока имеются также схемы, которые выполняют свои функции, в частности есть четырехразрядный регистр r4. В этот регистр записывается код, равный входному коду sw1 плюс 1. В схеме имеется также восьмиразрядный сигнал r8 для выдачи результата. В окончательном варианте тело архитектуры в главном модуле имеет следующий вид:
В этом описании сначала идет декларация компонента system1, текст декларации скопирован из шаблона, о котором говорилось выше. Далее декларируются внутренние сигналы r4 и r8. Затем идет конкретизация компонента system1 с меткой Inst_system1, эта запись составлена по шаблону, в который добавлены сигналы r8, r4, clk и reset. Процесс, задающий работу синхронных схем, содержит назначение сигнала r4, который, как отмечалось выше, получается из входного сигнала путем прибавления единицы. После сохранения внесенных изменений окно Sources примет вид, показанный на рис. 4.
В этот момент основные составляющие системы определены, далее выполняется реализация проекта (Implement Design) [4]. Процесс реализации проекта занимает определенное время (более трех минут), так как на этом этапе в состав системы включено процессорное ядро Microblaze. После реализации проекта надо в окне Processes активизировать пункт Update Bitstream with Processor Data. В результате создаются два загрузочных файла: name.bit и name_download.bit (name — имя головного модуля проекта, в рассматриваемом случае — soc1a). В ПЛИС должен загружаться файл name_download.bit, так как он содержит программу, созданную в EDK. После загрузки файла можно наблюдать работу системы. Если используется упоминавшаяся выше отладочная плата Spartan 3E Starter Kit, то после задания числа a на переключателях результат вычислений, число a+2, отражается на светодиодах. Увеличение на единицу происходит в аппаратной части, когда в r4 записывается sw1+1, еще одна единица добавляется в программе, которая управляет работой процессорного блока.
Подключим к системе логический анализатор ChipScope Pro, он добавляется обычным образом [5, 6]. Для исследования работы системы зададим 4 порта с разрядностями 12, 4, 4 и 8. К порту P0 подключаются 12 младших разрядов программного счетчика Trace_PC процессорного ядра Microblaze, к порту P1 — входной сигнал системы, к порту P2 — внутренний сигнал r4, к порту P3 — результат. Временные диаграммы работы системы приведены на рис. 5.
При получении данной диаграммы на входных переключателях sw1 был установлен код 1. В соответствии со схемой, заданной в головном VHDL-модуле, это значение увеличивается на 1 и заносится на r4. В программе происходит увеличение еще на единицу, в результате получается 3, это значение присутствует на выходной шине leds1. На верхней диаграмме показана последовательность работы программного счетчика Trace_PC в бесконечном цикле, на рис. 5 видно окончание очередного цикла и начало следующего. Адрес 200, отмеченный маркером X, соответствует последней команде цикла (см. листинг программы на рис. 2), конвейер процессора выбирает также команду, расположенную по адресу 204, но до ее исполнения дело не доходит, так как происходит безусловный переход на начало цикла по адресу 1С8. Далее, как видно из рис. 5, исполняются команды, расположенные по адресам 1С8…1D0.
По адресу 1D4 размещена команда безусловного перехода по адресу 3C0 для выполнения операций ввода/вывода, реализующих функцию XGpio_DiscreteRead. Выполнение команды безусловного перехода в данном случае совмещается с выполнением команды or, расположенной по адресу 1D8. После этого начинается выполнение функции XGpio_DiscreteRead, которая расположена начиная с адреса 3C0 (этот момент на рис. 5 отмечен маркером O). После выполнения функции XGpio_DiscreteRead происходит возврат к основной программе (этот момент на рис. 5 не показан). Если изменить масштаб, то можно увидеть весь период работы в бесконечном цикле (рис. 6). На этом рисунке маркерами X и O отмечены моменты, когда процессорный блок находится в начале цикла, то есть программный счетчик PC показывает на команду с адресом 1С8.
В рассмотренном примере значительное время отводится выполнению функций ввода/вывода XGpio_DiscreteRead и XGpio_DiscreteWrite. Именно эти функции предлагается использовать в последних версиях системы EDK. Рассмотрим другой вариант программы, которая реализует эти же действия, но с другими операторами ввода/вывода, которые применялись в более ранних версиях системы EDK. Содержимое оператора while примет следующий вид:
Для внесения изменений в программу надо запустить систему EDK двойным щелчком мыши по строке процессорного блока system1 в окне Sources, после этого открыть исходный модуль программы, в котором выполняются необходимые изменения. Затем выполняется трансляция программы. Содержимое оператора while вместе с машинными командами показано на рис. 7. После завершения работы с программой необходимо вернуться в систему ISE.
Для внесения исправлений, вызванных изменением программы, в загрузочный файл name_download.bit нет необходимости заново выполнять реализацию проекта, достаточно выполнить Update Bitstream with Processor Data. Если по каким-либо причинам обновления не происходит, то надо щелкнуть правой клавишей мышки на пункте Update Bitstream with Processor Data, а затем в открывшемся контекстном меню выбрать Rerun. Факт обновления файла name_download.bit можно определить по дате и времени его создания. Временная диаграмма одного цикла работы с операторами XGpio_mGetDataReg и XGpio_mSetDataReg приведена на рис. 8. Маркерами X иO на этом рисунке отмечены границы одного цикла.
На рис. 5, 6 и 8 показаны случаи, когда входные сигналы не изменялись. На рис. 9 приведен случай, когда входной сигнал изменяется. Сначала происходит изменение входного сигнала sw1 с 1 на 3, в следующем такте происходит изменение r1 с 2 на 4, а затем через 26 тактов, когда изменение входного сигнала отработает программа, на выходе leds1 выдается обновленное значение результата.
В рассмотренном выше примере сначала создавался главный модуль, затем создавался процессорный блок. Возможен также вариант построения, когда процессорный блок создается заранее, а затем подключается к главному модулю путем выполнения последовательности Project ==> Add Source из основного меню системы ISE. Более подробно этот вариант построения изложен в Help системы EDK.
Несмотря на то, что рассмотренная выше система не имеет практического значения из-за своей простоты, на ее примере показаны основные этапы проектирования системы на кристалле с подчиненным процессорным блоком на ПЛИС фирмы Xilinx. Системы этого типа позволяют размещать на кристалле несколько процессорных ядер, а также добавлять к процессору аппаратные ускорители, что обеспечивает высокое быстродействие даже при использовании относительно медленных софт-процессоров. Таким образом, системы на кристалле с подчиненным процессорным блоком позволяют решать трудные задачи, они фактически не имеют альтернативы, когда необходимо совмещать высокое быстродействие, свойственное аппаратным методам, со сложными вычислениями, которые удобно реализовывать программными методами.
Литература
- Зотов В. Ю. Проектирование встраиваемых микропроцессорных систем на основе ПЛИС фирмы Xilinx. М.: Горячая линия–Телеком, 2006.
- Зотов В. Ю. Embedded Development Kit — система проектирования встраиваемых микропроцессорных систем на основе ПЛИС серий FPGA фирмы Xilinx // Компоненты и технологии. 2004. № 3.
- Шагурин И., Шалтырев В. Проектирование систем на кристалле на базе FPGA компании Xilinx // Chip News. 2005. № 10.
- Зотов В. Ю. Проектирование цифровых устройств на основе ПЛИС фирмы Xilinx в САПР WebPACK ISE. М.: Горячая линия–Телеком, 2003.
- ChipScope Pro Software and Cores. User Guide // Xilinx, UG029, 2006.
- Гурин Е. И. Использование логического анализатора ChipScope Pro для отладки цифровых устройств на ПЛИС фирмы Xilinx // Компоненты и технологии. 2007. № 7.