Научная статья на тему 'Построение систем на кристалле с подчиненным процессорным ядром Microblaze на ПЛИС фирмы Xilinx'

Построение систем на кристалле с подчиненным процессорным ядром Microblaze на ПЛИС фирмы Xilinx Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
292
64
i Надоели баннеры? Вы всегда можете отключить рекламу.

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Гурин Евгений

В настоящее время большое внимание уделяется разработке систем на кристалле с процессорными ядрами, в том числе на ПЛИС фирмы Xilinx. В системах на ПЛИС с процессорным ядром возможны два варианта построения. В первом варианте работа с проектом выполняется в среде EDK, при этом процессорное ядро является главным, к нему добавляются пользовательские модули, реализованные на ресурсах ПЛИС. Во втором варианте построения проект создается в среде ISE, система строится на основе модуля, который обычно разрабатывается на языках VHDL или Verilog и является главным, а процессорное ядро является подчиненным блоком и входит в проект наравне с другими устройствами. В настоящей работе рассматривается процесс разработки систем на ПЛИС фирмы Xilinx с подчиненным процессорным ядром Microblaze. Предлагаемая статья рассчитана на читателя, знакомого с основами проектирования в системах ISE и EDK.

i Надоели баннеры? Вы всегда можете отключить рекламу.
iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Построение систем на кристалле с подчиненным процессорным ядром Microblaze на ПЛИС фирмы Xilinx»

Построение систем на кристалле

с подчиненным процессорным ядром Microblaze на ПЛИС фирмы Xilinx

Евгений ГУРИН, профессор

gurin2@yandex.ru

В настоящее время большое внимание уделяется разработке систем на кристалле с процессорными ядрами, в том числе на ПЛИС фирмы Xilinx [1—3]. В системах на ПЛИС с процессорным ядром возможны два варианта построения. В первом варианте работа с проектом выполняется в среде EDK, при этом процессорное ядро является главным, к нему добавляются пользовательские модули, реализованные на ресурсах ПЛИС. Во втором варианте построения проект создается в среде ISE, система строится на основе модуля, который обычно разрабатывается на языках VHDL или Verilog и является главным, а процессорное ядро является подчиненным блоком и входит в проект наравне с другими устройствами. В настоящей работе рассматривается процесс разработки систем на ПЛИС фирмы Xilinx с подчиненным процессорным ядром Microblaze. Предлагаемая статья рассчитана на читателя, знакомого с основами проектирования в системах ISE [4] и EDK[1].

Структура системы с подчиненным процессорным блоком показана на рис. 1. Внешние сигналы системы поступают в главный модуль, они могут передаваться в процессор непосредственно или после обработки — это зависит от выполняемой задачи. Внешние сигналы процессорного блока являются внутренними сигналами главного модуля.

Рассмотрим один из возможных вариантов построения системы. Сначала создается проект в системе проектирования КБ [4], в том числе создается и подключается к проекту главный файл, созданый на языке УИБЬ. Затем создается новый модуль — процессорный блок, для чего используется система ЕБК [1]. В ней выполняются все необходимые действия по формированию аппаратной платформы и программного обеспечения. После того как построение процессорного блока

в EDK завершено, в системе ISE выполняются все необходимые действия: задание ограничений пользователя, в том числе размещение внешних сигналов на контактах ПЛИС, реализация проекта и его загрузка в ПЛИС.

Рассмотрим процесс проектирования простейшей системы на основе стартового набора Spartan 3E Starter Kit, описание которого можно найти на сайтах www.xilinx.com и www.plis.ru. Пример выбран максимально упрощенный, с тем, чтобы сконцентрироваться в основном на изучении особенностей построения системы. Описание интерфейса схемы в предлагаемом примере имеет следующий вид:

entity socla is port( clk, reset: in std_logic; swl: in std_logic_vector(0 to 3); ledsl: out std_logic_vector(0 to 7)

);

end socla;

В схеме используются синхросигнал clk частотой 50 МГц с выхода тактового генератора, сигнал сброса reset, четырехразрядный сигнал swl с выходов переключателей. Результаты работы системы выдаются на восемь светодиодов ledsl. Все перечисленное оборудование имеется в Spartan 3E Starter Kit.

После задания основных параметров главного модуля создается процессорный блок на основе процессорного ядра MicroBlaze.

Для этого в системе ISE с помощью основного меню выполняется такая последовательность: Project ==> New Source. В открывшемся окне выбирается пункт Embedded Processor, в поле File Name задается имя, например, sys-teml, после чего нажимается клавиша Next. В результате запускается XPS (Xilinx Platform Studio), а далее для создания процессорного блока надо следовать указаниям мастера Base System Builder [l], при этом надо указать тип отладочной платы — Spartan 3E Starter Kit и задать опцию No debug, для того чтобы в дальнейшем облегчить процесс подключения логического анализатора ChiScope Pro. В качестве устройств ввода задаются тумблеры (swithes), в качестве устройств вывода — светодиоды (leds). Другие периферийные устройства не включаются. Следует отметить, что хотя сигналы ввода/вывода процессорного блока определены как swithes и leds, в данном случае они используются не для подключения переключателей и светодиодов, а в качестве параллельных портов общего назначения.

Обязательным элементом процессорного блока является программное обеспечение. Исходный модуль программы задается следующим образом:

#include «xparameters.h»

#include «xgpio.h»

#include «xutil.h»

Рис. 1. Структура системы

]ïestftpp_Menory.С ▼ (main zl |mixed ▼

- 0x1 а 0 <main+56> addik r6f rO, 1 // 0x1 <_start+1> _±J

- 0х1а*1 <main+60> addk r7. r0, Г0

- 0x1 а 8 <nain+64> brlid r15 384 // 0x328 <XGpio_SetDataDirection>

- 0х1ас <main+68> or rO, rO, r0

12 XGpio_SetDataDirection(8,swf1.Oxffffffff);

- 0х1Ь0 <main+72> addik r3, M9, *4*4

- 0x1 ЬЦ <main+76> addk »*5, r3f r0

- 0x1 Ь8 <main+80> addik r6, r0, 1 // 0x1 <_start+1>

- 0x1 Ьс <main+8Ji> addik r7, r0, -1

- 0x1 с 0 <main+88> brlid r15 360 // 0x328 <XGpio_SetDataDirection>

0x1с*» 13 14 <nain*92> or while(1){ 10, 10, r 0

15 x = XGpio DiscreteRead (ftsw, 1);

- 0х1с8 <main+96> addik r3, r19f *4*4

- 0x1 сс <main+100>: addk r5, r3f rO

- 0x1 d0 <nain+104>: addik r6, r0, 1 // 0x1 <_start*1>

- 0x1dJ« <main*108>: brlid r15 492 // ОхЗсО <XGpio_DiscreteRead>

- 0x1 d8 <main+112>: or r0. rO, rO

- Oxide <main+116>: swi r3, r19, 6*4

16 u=x+1

- 0x1e0 <main*120>: lwi r3, r19, 6i*

- 0x1eU <main+124>: addik r3, r3, 1

- 0x1 e8 <main*128>: swi r3, r19, 60

17 XGpio_ DiscreteUri te( P.leds , 1, u);

■ 0x1ec <main+132>: addik rS, r19, 28

- 0x1 f 0 <main*136>: addik r6, rO, 1 // 0x1 <_start+1>

- 0x1fi| <nain+1ii0>: lwi r7. r19f 60

- 0x1f 8 <main+1J*J*>: brlid r15f 636 // 0x47*« <XGpio DiscreteWrite>

- 0x1fc <main+1J*8>: or r0f r0f rO

0x200 <main*152>: bri -56 // 0x1c8 <main+96>

Рис. 2. Фрагмент листинга исходного файла с машинными командами

int main (void) { XGpio leds, sw; int v, x;

XGpio_Initialize(&leds, XPAR_LEDS_8BIT_DEVICE_ID); XGpio_Initialize(&sw, XPAR_DIP_SWITCHES_4BIT_DEVICE_ID); XGpio_SetDataDirection(&leds,1,0x0); XGpio_SetDataDirection(&sw,1,0xffffffff);

while(1){

x = XGpio_DiscreteRead (&sw, 1); v=x+1;

XGpio_DiscreteWrite(&leds, 1, v);

}

return(0);

}

Данная программа содержит две части: первая часть выполняет инициализацию устройств ввода/вывода, вторая часть содержит бесконечный цикл, задаваемый оператором while. В этом цикле программа принимает число х, увеличивает его на единицу, а затем полученное значение 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 видно, что вторая часть программы начинается с адреса k8h

Рис. 3. Окно Sources после создания процессорного блока

и кончается адресом 200h. Операции ввода/ вывода выполняются в подпрограммах: Xgpio_DiscreteRead — начиная с адреса 3c0h, Xgpio_DiscreteWrite — 474h.

После разработки программного обеспечения из системы EDK надо выйти и продолжить работу в системе ISE. Окно Sources в системе ISE в этот момент примет следующий вид (рис. 3).

Для включения процессорного блока в проект надо в окне Sources выбрать строку про-

цессорного блока systeml, а в окне Processes активизировать пункт View HDL Instantiation Template. В результате сформируется окно, в котором будет присутствовать шаблон (заготовка) для использования процессорного блока в качестве компонента. Фрагменты этого шаблона переносятся в главный модуль системы. В главном модуле помимо процессорного блока имеются также схемы, которые выполняют свои функции, в частности есть четырехразрядный регистр r4. В этот регистр записывается код, равный входному коду swl плюс l. В схеме имеется также восьмиразрядный сигнал r8 для выдачи результата. В окончательном варианте тело архитектуры в главном модуле имеет следующий вид:

architecture arhl of socla is

COMPONENT systeml PORT(

fpga_0_DIP_Switches_4Bit_GPIO_in_pin : IN std_logic_vector(0 to 3);

sys_clk_pin : IN std_logic;

sys_rst_pin : IN std_logic;

fpga_0_LEDs_8Bit_GPI0_d_out_pin : OUT std_logic_vector(0 to 7)

);

END COMPONENT;

signal r4: std_logic_vector(0 to 3):=x»0»;

signal r8: std_logic_vector(0 to 7):=x»00»;

begin

Inst_systeml: systeml PORT MAP( -- конкретизация компонента fpga_0_LEDs_8Bit_GPIO_d_out_pin => r8, fpga_0_DIP_Switches_4Bit_GPIO_in_pin => r4, sys_clk_pin => clk, sys_rst_pin => reset

process (clk) begin if clk='1' and clk'event then r4 <= sw1 + 1; end if; end process; ledsl <= r8;

END arhl;

В этом описании сначала идет декларация компонента systeml, текст декларации скопирован из шаблона, о котором говорилось выше. Далее декларируются внутренние сигналы r4 и r8. Затем идет конкретизация компонента systeml с меткой Inst_systeml, эта запись составлена по шаблону, в который добавлены сигналы r8, r4, clk и reset. Процесс, задающий работу синхронных схем, содержит назначение сигнала r4, который, как отмечалось выше, получается из входного сигнала путем прибавления единицы. После сохранения внесенных изменений окно Sources примет вид, показанный на рис. 4.

Рис. 4. Окно Sources после включения процессорного блока в главный модуль

Рис. 5. Начальный этап цикла работы системы

В этот момент основные составляющие системы определены, далее выполняется реализация проекта (Implement Design) [4]. Процесс реализации проекта занимает определенное время (более трех минут), так как на этом этапе в состав системы включено процессорное ядро Microblaze. После реализации проекта надо в окне Processes активизировать пункт Update Bitstream with Processor Data. В результате создаются два загрузочных файла: name.bit и name_download.bit (name — имя головного модуля проекта, в рассматриваемом случае — socla). В ПЛИС должен загружаться файл name_download.bit, так как он содержит программу, созданную в EDK. После загрузки файла можно наблюдать работу системы. Если используется упоминавшаяся выше отладочная плата Spartan 3E Starter Kit, то после задания числа a на переключателях результат вычислений, число a+2, отражается на светодиодах. Увеличение на единицу происходит в аппаратной части, когда в r4 записывается swl+1, еще одна единица добавляется в программе, которая управляет работой процессорного блока.

Подключим к системе логический анализатор ChipScope Pro, он добавляется обычным образом [5, 6]. Для исследования работы системы зададим 4 порта с разрядностями 12, 4, 4 и 8. К порту P0 подключаются l2 младших разрядов программного счетчика Trace_PC процессорного ядра Microblaze, к порту P1 — входной сигнал системы, к порту P2 — внутренний сигнал r4, к порту P3 — результат. Временные диаграммы работы системы приведены на рис. 5.

При получении данной диаграммы на входных переключателях swl был установлен код 1. В соответствии со схемой, заданной в головном VHDL-модуле, это значение увеличивается на 1 и заносится на r4. В программе происходит увеличение еще на единицу, в результате получается 3, это значение присутствует на выходной шине leds1. На верхней диаграмме показана последовательность работы программного счетчика Trace_PC в бесконечном цикле, на рис. 5 видно окончание очередного цикла и начало следующего. Адрес 200, отмеченный маркером X, соответствует последней команде цикла (см. листинг программы на рис. 2), конвейер процессора выбирает также команду, расположенную по адресу 204, но до ее исполнения дело не доходит, так как происходит безуслов-

ный переход на начало цикла по адресу 1С8. Далее, как видно из рис. 5, исполняются команды, расположенные по адресам 1С8.. .Ш0.

По адресу Ш4 размещена команда безусловного перехода по адресу 3С0 для выполнения операций ввода/вывода, реализующих функцию XGpio_DiscreteRead. Выполнение команды безусловного перехода в данном случае совмещается с выполнением команды ог, расположенной по адресу Ш8. После этого начинается выполнение функции XGpio_DiscreteRead, которая расположена начиная с адреса 3С0 (этот момент на рис. 5 отмечен маркером О). После выполнения функции XGpio_DiscreteRead происходит возврат к основной программе (этот момент на рис. 5 не показан). Если изменить масштаб, то можно увидеть весь период работы в бесконечном цикле (рис. 6). На этом рисунке маркерами X и О отмечены моменты, когда процессорный блок находится в начале цикла, то есть программный счетчик РС показывает на команду с адресом 1С8.

В рассмотренном примере значительное время отводится выполнению функций ввода/вывода XGpio_DiscreteRead и XGpio_DiscreteWrite. Именно эти функции предлагается использовать в последних версиях системы EDK. Рассмотрим другой вариант программы, ко-

торая реализует эти же действия, но с другими операторами ввода/вывода, которые применялись в более ранних версиях системы EDK. Содержимое оператора while примет следующий вид:

while(1){

x = XGpio_mGetDataReg (XPAR_DIP_SWITCHES_4BIT_BASEAD-DR, 1);

v=x+1;

XGpio_mSetDataReg(XPAR_LEDS_8BIT_BASEADDR, 1, v);

}

Для внесения изменений в программу надо запустить систему EDK двойным щелчком мыши по строке процессорного блока system! в окне 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

Bus/Signal X О 65 75 85 95 105 115 125 135 145 155 165 175 I , , , ® I I I .... I I I I .... I .... I .. .в 185

о- Trace PC 1С8 1С8 ’ : ■ .

о~ swl 1 1 1

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

о- г4 2 03 2

2

ledsl 03 03

Рис. 6. Полный цикл работы системы

Test Арр_Мепогу. с nain

-

[mixed

14

15

0х1с8 <main+96>: 0x1cc <main+100>: 0x1d0 <roain*104>:

16

0x1d4 <main+108> 0x1d8 <main+112> Oxide <main+116> 17

0x1e0 <main+120> 0x1el» <nain»124> 0x1e8 <nain+128> 0x1ec <main+132>

while(1){

X = XGpio_nGetDataReg (XPAR_DIP_SWITCHES_4BIT_BASEAD

inn

lui

swi

u=x+1 ; lwi addik swi

16386

ґЗ, 1-0, 0 // 0x40020000 ґЗ, r19, 64

гЗ, r19, 64 ґЗ, ГЗ, 1 ґЗ, ґ19, 60

XGpio_mSetDataReg(XPAR_LEDS_8BIT_BASEADDR, 1, w); lwi ~ 1-3, r19, 60

inn 16384

sui r3, r0, 0 // 0x40000000

bri -36 // 0x1c8 <main+96>

Рис. 7. Л истинг программы с альтернативными операциями ввода/вывода

Bus/Signal

Trace_PC

awl

r4

lerisl

X О

1С8 1Е С

1 1

2 2

03 03

, ,? 120 125 130 135 140 145 ) I .... I .... I .... I .... I .... I К р,

1F0 X X ЮС X1D0X1D4X X1DCX1ЕОХ X 1Е8 X

1

2

03

Рис. 8. Цикл работы системы с альтернативными операциями ввода/вывода

Bus/Signal

о- ТгасеРС о- swl о г4 О- lertsl

1Е8 1Е8

3 3

4 4

05 05

-25 і___і___

-20 і___I___

-15 ____I___

-10

-5

3L

ШрПС 1СС ХЮ0ХЮ4Х ХЮСХІЕОХ X 1Е8 X Х1

3

2 X 4

03

TT05

Рис. 9. Реакция системы на изменение входных сигналов

приведен случай, когда входной сигнал изменяется. Сначала происходит изменение входного сигнала 8'1 с 1 на 3, в следующем такте происходит изменение г1 с 2 на 4, а затем через 26 тактов, когда изменение входного сигнала отработает программа, на выходе leds1 выдается обновленное значение результата.

В рассмотренном выше примере сначала создавался главный модуль, затем создавался процессорный блок. Возможен также вариант построения, когда процессорный блок создается заранее, а затем подключается к главному модулю путем выполнения по-

следовательности Project ==> Add Source из основного меню системы ISE. Более подробно этот вариант построения изложен в Help системы EDK.

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

же при использовании относительно медленных софт-процессоров. Таким образом, системы на кристалле с подчиненным процессорным блоком позволяют решать трудные задачи, они фактически не имеют альтернативы, когда необходимо совмещать высокое быстродействие, свойственное аппаратным методам, со сложными вычислениями, которые удобно реализовывать программными методами. ■

Литература

1. Зотов В. Ю. Проектирование встраиваемых микропроцессорных систем на основе ПЛИС фирмы Xilinx. М.: Горячая линия-Телеком, 2006.

2. Зотов В. Ю. Embedded Development Kit — система проектирования встраиваемых микропроцессорных систем на основе ПЛИС серий FPGA фирмы Xilinx // Компоненты и технологии. 2004. № 3.

3. Шагурин И., Шалтырев В. Проектирование систем на кристалле на базе FPGA компании Xilinx // Chip News. 2005. № 10.

4. Зотов В. Ю. Проектирование цифровых устройств на основе ПЛИС фирмы Xilinx в САПР WebPACK ISE. М.: Горячая линия-Телеком, 2003.

5. ChipScope Pro Software and Cores. User Guide // Xilinx, UG029, 2006.

6. Гурин Е. И. Использование логического анализатора ChipScope Pro для отладки цифровых устройств на ПЛИС фирмы Xilinx // Компоненты и технологии. 2007. № 7.

i Надоели баннеры? Вы всегда можете отключить рекламу.