ЛР / Основы разработки систем на кристалле (метода)
.pdfSW2 и SW3. Добавьте выход из цикла по нажатию BTN8 (кнопка заведена через интерфейс MIO).
12. Реализуйте периодическое мигание символа «D» с периодом 1,5 с, если активированы переключатели SW2 и SW7, и периодическое мигание символа «0» с периодом 0,5 с, если активированы переключатели SW1, SW2 и SW5. Добавьте выход из цикла по нажатию BTN9 (кнопка заведена через интерфейс MIO).
60
Лабораторная работа 7
СОЗДАНИЕ ПРОЕКТА ДЛЯ РАБОТЫ КОНТРОЛЛЕРОМ ПРЕРЫВАНИЙ
Цель работы
Конфигурация AXI GPIO для формирования прерываний. Активация контроллера прерываний в процессорной системе. Обработка прерываний в процессоре на отладочной плате ZedBoad.
Основные вопросы, изучаемые перед выполнением работы
1.Архитектура системы на кристалле Xilinx Zynq7000.
2.Структура лабораторного макета ZedBoard.
3.Контроллер прерываний процессорного модуля в Zynq7000.
4.Работа с блоком AXI GPIO для формирования прерываний.
5.Работа со встроенным логическим анализатором.
Содержание работы
1. Создать новую отдельную директорию для лабораторной работы по аналогии с лабораторной работой 1. Например, полный путь к директории для лабораторный работы:
D:/(Год)/(Фамилия) (группа)/soc-lab-7
2. Создание проекта в Vivado 2016.4.
2.1. Создайте проект с именем Zynq axi_interrupt_variant_(номер ва-
рианта) по аналогии с лабораторной работой 1 (рис. 63).
Рис. 63. Окно с примером создания проекта
2.2.Создайте Block Design и добавьте IP процессорной системы Zynq7 по аналогии с п. 3 лабораторной работы 1.
2.3.Настройте процессорную систему согласно п. 4 лабораторной ра-
боты 1.
61
2.4.Также в настройках процессорной системы включите поддержку интерфейсов GPIO MIO и GPIO EMIO. Для GPIO EMIO установите ширину шины размером 16 бит (на примере лабораторной работы 3).
2.5.Далее необходимо включить Master AXI Interface. Для этого от-
кройте PS-PL Configuration → General → AXI Non secure Enablement
иустановить галочку напротив M AXI GP0 Interface.
2.6.В настройках процессорной системы включите прерывания во вкладке Interrupt.
2.7.На данном этапе процессорная система сконфигурирована. Нажмите ОK для выхода из окна настройки блока Zynq7 и сохраните проект.
Примечание. Обратите внимание, что у процессорной системы появился дополнительный вход IRQ_F2P, в который необходимо завести сигналы прерываний.
2.8.Добавьте IP-элемент с названием AXI GPIO.
2.9.Откройте окно конфигурации AXI GPIO двойным щелчком кнопкой мыши, настройте данный блок как показано на рис. 64. Закройте окно настройки и нажмите ОK. Запишите настройки данного блока в протокол.
Рис. 64. Окно настройки элемента AXI GPIO
2.10. Нажмите Run Connection Automation. Это позволит автоматически добавить и соединить необходимую периферию.
Примечание. Обратите внимание, что появился блок AXI Interconnect, запишите назначение данного блока в протокол.
2.11.Если из блока AXI GPIO нет выходной шины сигналов, то нажмите правой кнопкой мыши на выходной порт GPIO блока AXI GPIO и в выпадающем меню выберите пункт Make External.
2.12.Подключите выходной сигнал прерывания блока AXI GPIO ко входу IRQ_F2P процессорной системы.
62
2.13.Выделите линии, идущие к S_AXI, GPIO и ip2intc_inpt, кликните правой кнопкой мыши и в выпадающем меню выберите Debug. Далее нажмите Run Connection Automation. Это позволит добавить встроенный логический анализатор в проект.
2.14.В пустом месте области блочного проекта кликните правой кнопкой мыши и выберите Regenerate Layout, чтобы перестроить расположение блоков в автоматическом режиме. Итоговый вид проекта показан на рис. 65.
2.15.Подключите выходной сигнал прерывания блока AXI GPIO ко входу IRQ_F2P процессорной системы.
Рис. 65. Фрагмент диаграммы блочного проекта
2.16.Откройте вкладку Address Editor и запишите адрес смещения для AXI GPIO в протокол.
2.17.Для проверки правильности конфигурации проекта нажмите
Tools → Validate Design или клавишу F6. Если ошибок не обнаружено, то повторно сохраните проект. Зарисуйте от руки диаграмму в протокол.
2.18.Создайте HDL-wrapper, нажав правой кнопкой мыши на файл
срасширением Bd и выбрав пункт Create HDL-wrapper.
2.19.Запустите синтез. После синтеза выполните назначение пинов для переключателей и светодиодов по аналогии с лабораторной работой 3. Сохраните конфигурацию в файл ограничений и проверьте правильность его заполнения.
2.20.Запустите размещение проекта на кристалле ПЛИС.
2.21.Запустите генерирование Bitstream.
3. Экспорт конфигурационных файлов в Xilinx SDK.
3.1.Экспортируйте результаты генерации для SDK.
3.2.Откройте папку проекта и отыщите в ней директорию с названием
имя проекта.sdk. Убедитесь в наличии архива с форматом HDF внутри данного каталога.
63
3.3.В среде Vivado 2016.4 нажмите File → Launch SDK и в появив-
шемся окне ОK. Дождитесь запуска среды Xilinx SDK.
3.4.Сгенерируйте пакет поддержки платы.
4. Создание приложения.
4.1.Нажмите File → New → Application Project. В открывшемся окне введите имя приложения GPIO interrupt, установите настройки на примере лабораторной работы 3 и нажмите Next.
4.2.В списке предлагаемых шаблонов приложения выберите Empty Application и нажмите Finish.
4.3.Нажмите правой кнопкой мыши на папке SRC проекта в дереве
Project Explorer и выберите пункт меню New → Source File. В появив-
шемся окне введите имя файла main.c и нажмите Finish.
4.4.Найдите в дереве проекта файл main.c.
4.5.Измените содержимое файла согласно листингу:
#include <stdio.h> #include "xil_printf.h" #include "xparameters.h" #include "xgpiops.h" #include "xstatus.h" #include "xil_exception.h" #include "xscugic.h" #include "sleep.h"
XScuGic Intc; XScuGic_Config *IntcConfig;
#define XPAR_FABRIC_GPIO_0_VEC_ID XPAR_FABRIC_AXI_GPIO_IP2INTC_IRPT_INTR
#define XGPIO_DATA_OFFSET |
0x0 |
#define XGPIO_TRI_OFFSET 0x4
#define XGPIO_GIE_OFFSET0x11C #define XGPIO_ISR_OFFSET 0x120 #define XGPIO_IER_OFFSET 0x128
#define PIN_OFFSET 54 #define width_emio 16 #define led_low_adr 8
int Status; XGpioPs Gpio;
XGpioPs_Config *ConfigPtr;
unsigned int *gpio0_address = (unsigned int *)XPAR_AXI_GPIO_0_BASEADDR; unsigned int gpio_data = 0, Intrflag = 0, IntrflagSw = 0;
void mem_set(unsigned int* mem_address, int offset, unsigned int value) { mem_address[offset>>2] = value;
}
64
void mem_get(unsigned int* mem_address, int offset, unsigned int *value) { *value = mem_address[offset>>2];
}
void GpioHandler()
{
Intrflag = 1; XGpioPs_WritePin(&Gpio, 7, 1);
mem_set(gpio0_address, XGPIO_ISR_OFFSET, 0x01);
}
int SetupIntrSystem();
int main()
{
xil_printf("Start Application \r\n");
xil_printf("Write to TRISTATE register \n\r"); mem_set(gpio0_address, XGPIO_TRI_OFFSET, 0x01);
xil_printf("Write to IER register \n\r"); mem_set(gpio0_address, XGPIO_IER_OFFSET, 0x01);
xil_printf("Write to GIE register \n\r"); mem_set(gpio0_address, XGPIO_GIE_OFFSET, 0x80000000);
SetupIntrSystem(); xil_printf("Setup system \r\n");
ConfigPtr = XGpioPs_LookupConfig(XPAR_XGPIOPS_0_DEVICE_ID); Status = XGpioPs_CfgInitialize(&Gpio, ConfigPtr, ConfigPtr->BaseAddr); if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
XGpioPs_SetDirectionPin(&Gpio, 7, 1);
XGpioPs_SetOutputEnablePin(&Gpio, 7, 1);
XGpioPs_SetDirectionPin(&Gpio, PIN_OFFSET+led_low_adr, 1);
XGpioPs_SetOutputEnablePin(&Gpio, PIN_OFFSET+led_low_adr, 1);
while (1){
XGpioPs_WritePin(&Gpio, PIN_OFFSET+led_low_adr, 1); usleep(200000);
XGpioPs_WritePin(&Gpio, PIN_OFFSET+led_low_adr, 0); usleep(200000);
}
return 0;
}
int SetupIntrSystem()
{
int Status = 0;
IntcConfig = XScuGic_LookupConfig(XPAR_SCUGIC_0_DEVICE_ID);
65
if (NULL == IntcConfig) { return XST_FAILURE;
}
Status = XScuGic_CfgInitialize(&Intc, IntcConfig, IntcConfig->CpuBaseAddress); if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
Status = XScuGic_Connect(&Intc, XPAR_FABRIC_GPIO_0_VEC_ID, (Xil_ExceptionHandler)GpioHandler,
NULL);
if (Status != XST_SUCCESS) { return Status;
}
XScuGic_Enable(&Intc, XPAR_FABRIC_GPIO_0_VEC_ID); Xil_ExceptionInit(); Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
(Xil_ExceptionHandler)XScuGic_InterruptHandler, &Intc); Xil_ExceptionEnable();
return 0;
}
Название идентификатора XPAR_FABRIC_AXI_GPIO_IP2INTC _IRPT_INTR
зависит от того, как у вас назван блок AXI GPIO в блок-дизайне. Для того чтобы узнать правильный идентификатор, нажмите Ctrl на клавиатуре
икликните левой кнопкой мыши на заголовочном файле xparameters.h.
4.6.Найдите точное название регистра, опираясь на значение адреса, который вы зафиксировали во вкладке Address Editor (рис. 66).
Рис. 66. Фрагмент заголовочного файла xparameters.h
4.7.Впишите идентификатор в исходный код проекта.
4.8.Для проверки правильности нажмите Ctrl на клавиатуре и кликните левой кнопкой мыши на названии регистра. Если происходит автоматический переход в заголовочном файле xparameters.h на правильный идентификатор, то название регистра указано верно.
4.9.Зафиксируйте в протокол ожидаемый результат работы программы, а также целевое назначение подключаемых библиотек и заголовочных файлов.
5. Проверка приложения на плате.
5.1.Убедитесь, что jtag-отладчик и UART от платы подключены
ккомпьютеру, включите питание платы.
66
5.2.Нажмите правой кнопкой мыши на названии приложения и далее
ввыпадающих списках Run As → Run Configuration.
5.3.В открывшемся окне нажмите Xilinx C/C++ Application (GDB).
5.4.По аналогии с предыдущими работами выберите Reset Entire System вместо Reset Processor. Так как в данном проекте используется работа процессора с запрограммированным чипом ПЛИС, то необходимо загрузить Bitsream в кристалл FPGA. Для конфигурирования ПЛИС необходимо активировать соответствующую опцию Program FPGA.
5.5.Далее необходимо настроить отладчик. Для этого перейдите во вкладку Application и убедитесь, что проект ссылается на нужное приложение.
5.6.Перейдите во вкладку STDIO connection и установите COM-порт UART-интрефейса и скорость для UART на примере лабораторной работы 5.
5.7.Нажмите Save, а затем Run. Дождитесь компиляции проекта и прошивки платы. Проверьте отладочную информацию в консоли (рис. 67).
Рис. 67. Окно консоли с отладочной информацией
5.8. Откройте Hardware Manager в среде Vivado. Подключитесь к отладчику платы (рис. 68).
Рис. 68. Фрагменты экрана для подключения отладчика
5.9. После открытия логического анализатора установите триггер-ло- вушку на возрастание сигнала прерывания, запустите триггер и нажмите любую кнопку BTN. Окно анализатора автоматически обновится, показав актуальные цифровые значения на шинах в момент срабатывания триггера
(рис. 69).
67
Рис. 69. Окно временных диаграмм логического анализатора
5.10.Измерьте количество тактов, которое было затрачено на отработку прерывания, и занесите эти данные в протокол.
5.11.Увеличьте масштаб диаграммы. Зафиксируйте в протокол вид осциллограммы на указанных преподавателем шинах в конкретные моменты: возле срабатывания триггера (красный маркер) и при падении сигнала прерывания (желтый маркер).
5.12.Создайте новое приложение для выполнения индивидуального за-
дания.
5.13.Разработайте программу согласно индивидуальному заданию.
5.14.Запустите проект индивидуального задания на отладочной плате.
Содержание отчета
1.Задача и цели лабораторной работы
2.Блок-схема проекта в Ip-Integrator с обозначением роли каждого элемента.
3.Описание блока AXI GPIO.
4.Описание контроллера прерываний в Zynq7000.
5.Адреса смещения и описания для используемых регистров.
6.Блок-схема алгоритма работы программы индивидуального задания.
7.Листинги исходного кода из индивидуальных заданий с поясняющими комментариями.
8.Временные диаграммы на миллиметровой бумаге с поясняющими отметками.
68
Задания к лабораторной работе
Измените проект таким образом, чтобы он работал согласно варианту:
1.Реализуйте бегущую полоску из двух включенных светодиодах справа налево с длительностью каждого шага 0,5 с. При нажатии кнопки BTN должно быть отработано прерывание: включение светодиодов LD9
иLD7. Организуйте выход из цикла после 3-го прерывания.
2.Реализуйте бегущую полоску из одного включенного светодиода слева направо с длительностью каждого шага 0,7 с. При нажатии кнопки btn должно быть отработано прерывание: мигание светодиода LD9 и печать
вконсоль информации о полученном прерывании. Организуйте выход из цикла после 4-го прерывания.
3.Реализуйте бегущую полоску из трех включенных светодиодов справа налево с длительностью каждого шага 0,5 с. При нажатии кнопки btn должно быть отработано прерывание: включение светодиодов LD9 и LD6. Организуйте выход из цикла при активированных SW0 и SW1.
4.Реализуйте бегущую полоску из двух включенных светодиодов слева направо с длительностью каждого шага 0,9 с. При нажатии кнопки btn должно быть отработано прерывание: мигание светодиода LD9 и печать
вконсоль информации о количестве прерываний. Организуйте выход из цикла после 15-го прерывания.
5.Реализуйте бегущую полоску из трех включенных светодиодах справа налево с длительностью каждого шага 0,8 с. При нажатии кнопки btn должно быть отработано прерывание: включение светодиода LD9 и мигание LD5. Организуйте выход из цикла после 3-го прерывания.
6.Реализуйте бегущую полоску из одного включенного светодиода слева направо с длительностью каждого шага 2 с. При нажатии кнопки btn должно быть отработано прерывание: быстрое мигание светодиода LD7 и печать в консоль информации о полученном прерывании. Организуйте выход из цикла после 5-го прерывания.
7.Реализуйте бегущую полоску из трех включенных светодиодов справа налево с длительностью каждого шага 0,5 с. При нажатии кнопки btn должно быть отработано прерывание: включение светодиодов LD9 и LD2. Организуйте выход из цикла при активированных SW4 и SW6.
8.Реализуйте бегущую полоску из двух включенных светодиодов слева направо с длительностью каждого шага 0,9 с. При нажатии кнопки btn должно быть отработано прерывание: включение светодиодов LD1 и LD6, печать в консоль информации о количестве прерываний. Организуйте выход из цикла после 11-го прерывания.
69
