4. Выполните программу по шагам, задавая различные значения вводимых чисел.
5. Поставьте контрольную точку по адресу безусловного перехода на ввод очередного числа. Выполните рестарт программы. Убедитесь в ее работоспособности, каждый раз задавая новое число и нажимая кнопку продолжить. Запишите в отчет вводимые числа и наблюдаемые результаты.
6. Удалите контрольную точку и вновь запустите программу. Запишите в отчет наблюдаемое поведение программы.
Часть 2. Ввод информации с переключателей с опросом их готовности
1. Остановите выполнение программы. Наблюдайте состояние регистров данных и захвата фронтов (edge-capture) PIO, соединенного с кнопками на стенде. Для этого используйте вкладку Memory приложения AMP. Установите галочку в окне Query all devices. Сначала нажмите и удерживайте некоторые из кнопок (KEY3-KEY1), затем наблюдайте состояние регистров в окне Memory, затем нажмите кнопку Refresh в окне AMP и снова наблюдайте состояние регистров. Отпустите кнопки, наблюдайте состояние регистров, нажмите Refresh и снова наблюдайте. Уясните принцип их работы и опишите в отчете.
2. Модифицируйте программу из предыдущей части таким образом, чтобы ввод очередного числа осуществлялся только после нажатия кнопки KEY3 на стенде. Используйте соответствующий разряд регистра edge-capture соответствующего PIO как сигнал готовности. Программа опрашивает его непрерывно до тех пор, пока он не установится. После ввода числа не забудьте снять сигнал готовности, записав нулевое значение в регистр edge-capture.
Часть 3. Вывод информации на семисегментные индикаторы
1. Напишите программу, которая отображает содержимое 32-разрядного регистра процессора на семисегментных индикаторах HEX7-HEX0 в виде шестнадцатеричного числа. Оформите ее в виде процедуры HEX_Display, которой передается параметр через регистр.
2. Модифицируйте программу из предыдущей части таким образом, чтобы накопленная сумма дополнительно отображалась на индикаторах HEX7-HEX0.
Часть 4. Ввод информации с переключателей в режиме прерывания
1. Выполните задачу из предыдущей части. Используйте вместо опроса готовности устройства ввода формирование прерывания, которое инициируется нажатием кнопки KEY3 на стенде. Основная программа устанавливает все регистры, необходимые для формирования прерывания и выполняет бесконечный цикл. Программа обслуживания прерывания вводит число, вычисляет сумму и отображает ее на светодиодах и индикаторах.
2. Проверьте экспериментально действия программы, выполняемые после формирования прерывания. Для этого поставьте контрольную точку по адресу обработчика прерываний (0x20). После достижения контрольной точки выполните программу по шагам. Фиксируйте в отчете Ваши наблюдения.
3. Чтобы визуально наблюдать работу основной программы, реализуйте в ней вывод на индикатор LCD Вашей фамилии, имени и отчества в режиме бегущей строки. Заготовку программы возьмите из 1 лабораторной работы.
Часть 5. Реализация приоритетных прерываний
1. Модифицируйте программу из предыдущей части таким образом, чтобы по кнопке KEY3 осуществлялось сложение нового числа с суммой, по кнопке KEY2 - вычитание нового числа из суммы, по кнопке KEY1 - обнуление суммы. Причем реализуйте приоритетность прерываний в соответствии с указанной последовательностью.
2. Экспериментально определите действия программы при выполнении сброса процессорной системы. Для этого поставьте по нулевому адресу в ОП контрольную точку. Затем запустите программу и нажмите кнопку KEY0. Далее выполните программу по шагам. Фиксируйте в отчете Ваши наблюдения.
3. Запрещайте прерывания от отдельных кнопок, изменяя содержимое регистра маски соответствующего PIO. Для этого поставьте контрольную точку в программе после команды записи соответствующего регистра. Затем модифицируйте регистр в регистровом окне. Далее продолжите выполнение программы.
4. Разрешайте или запрещайте прерывания от кнопок, изменяя содержимое регистра ienable процессора. Для этого используйте прием из предыдущего пункта.
5. Разрешайте или запрещайте прерывания от кнопок, изменяя содержимое бита pie регистра status процессора. Для этого используйте прием из 3 пункта.
Часть 6. Программное прерывание trap и невыполнимые команды
1. Вставьте в текст программы команду trap. Экспериментально определите поведение программы при выполнении этой команды. Отразите в отчете. Модифицируйте обработчик прерываний таким образом, чтобы в случае обнаружения команды trap, он передал управление процедуре, которая выведет строку «trap» на экран LCD.
Для выполнения оставшихся пунктов задания требуется модифицировать процессорную систему, а именно отключить опцию аппаратной реализации команды умножения процессором NIOS II. Все необходимые файлы для реализации модифицированной системы в кристалле ПЛИС содержатся в папке lab3 на рабочем столе.
2. Выполните загрузку модифицированной процессорной системы в кристалл ПЛИС на стенде.
3. Вставьте в текст программы команду умножения mul. Экспериментально определите поведение программы при выполнении этой команды. Отразите в отчете. Следует напомнить, что в модифицированной процессорной системе не поддерживается аппаратное умножение.
4. Модифицируйте обработчик таким образом, чтобы он передал управление процедуре, которая эмулирует выполнение команды mul. Для этого понадобится написать соответствующую процедуру.
Отчетные материалы
Отчетные материалы должны содержать:
1. Цель лабораторной работы.
2. Материалы, связанные с подготовкой к работе, включая теоретическую часть и заготовку программы. Обязательно включите в отчет описание регистров, влияющих на прерывания процессора.
3. Информацию по выполнению каждого пункта задания. Причем в отчете должны содержаться выполняемые Вами действия, наблюдаемые результаты и Ваши объяснения.
4. Написанные Вами фрагменты программ.
5. Краткое заключение.
Приложение
В приложении содержится исходный файл тестовой программы interrupt_example.s. В программе используются прерывания от таймера и кнопок. Обработчик прерываний от таймера содержится в файле interval_timer.s. Обработчик прерываний от кнопок содержится в файле pushbutton_ISR.s. Обработчик исключений, задачей которого является определение причины прерывания и вызов соответствующей процедуры, содержится в файле exception_handler.s.
Листинг 4 Текст программы interrupt_example.s
.equ KEY1, 0
.equ KEY2, 1
/******************************************************************************** Эта программа демонстрирует использование прерываний на стенде
* DE2-70 Media Computer. Вначале запускается таймер, который генерирует
* прерывания каждые 33 мс. Затем разрешаются прерывания от таймера и кнопок.
* Процедура обработки прерывания таймера отображает текст на 7-сегментных
* индикаторах и сдвигает его влево или вправо. Направление сдвига определяется
* кнопками. При нажатии кнопки key1 текст сдвигается вправо, при нажатии
* key2 – влево, при нажатии key3 изменяется текст, используя данные с переключателей.****************************************************************************************************************************************/
text
.global _start
_start:
movia sp, 0x03FFFFFC /* Определяем адрес вершины стека */
movia r16, 0x10002000
/* Определяем период срабатывания интервального таймера */
movia r12, 0x190000 /* 1/(50 MHz) x (0x190000) = 33 msec */
sthio r12, 8(r16) /*определяем младшее полуслово как стартовое значение*/
srli r12, r12, 16
sthio r12, 0xC(r16) /* старшее полуслово как стартовое значение */
/* Запускаем таймер и разрешаем прерывания от него */
movi r15, 0b0111 /* START = 1, CONT = 1, ITO = 1 */
sthio r15, 4(r16)
/* Разрешаем прерывания PIO, к которому подсоединены кнопки */
movia r15, 0x10000050 /* Адрес регистра кнопок */
movi r7, 0b01110
stwio r7, 8(r15) /* Устанавливаем 3 бита регистра маски прерывания*/
/* Разрешаем прерывания NIOS 2 процессора */
movi r7, 0b011
wrctl ienable, r7 /*Разрешаем прерывания от кнопок*/
movi r7, 1
wrctl status, r7 /*Разрешаем процессору обрабатывать прерывания */
IDLE:
br IDLE /* Бесконечный цикл */
data
.global PATTERN
PATTERN:
.word 0x0000000F
.global KEY_PRESSED
KEY_PRESSED:
.word KEY2
.end
Листинг 5 Текст программы exception_handler. s
/* СЕКЦИЯ СБРОСА "ax" требуется для того, чтобы определить секцию как исполняемую. AMP автоматически размещает секцию сброса по адресу, определяемому в настройках процессора в SOPC Builder.*/
.section. reset, "ax"
movia r2, _start
jmp r2 /* Переходим в основную программу */
/***************************************************************************
СЕКЦИЯ ИСКЛЮЧЕНИЙ "ax" требуется для того, чтобы определить секцию как исполняемую. AMP автоматически размещает секцию сброса по адресу, определяемому в настройках процессора в SOPC Builder.***************************************/
section. exceptions, "ax"
.global EXCEPTION_HANDLER /*Определяем процедуру как глобальную*/
EXCEPTION_HANDLER: /*Процедура обработки прерываний*/
subi sp, sp, 16 /* Изменяем адрес указателя стека */
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 |
Основные порталы (построено редакторами)
