Цель работы: Освоить подключение периферийных устройств к ядру NIOS II (на примере UART)
Теоретические сведения
В данной лабораторной работе процессор NiosII будет управлять следующими компонентами стендаDE2:
-
Семисегментным индикатором (4 разряда)
-
Линейкой зеленых светодиодов (8 шт.)
-
Двухстрочным LCD дисплей
-
Ввод команд управления индикаторными устройствами осуществляется по последовательному интерфейсу RS232.
Процессор NiosII должен принимать команды управления по последовательному каналу от ПК и конфигурировать соответствующие индикаторные устройства на стенде. Исходные данные для работы размещены в папке «ИД для Лаб_2».
Задание 1
1. Создайте новый проект в Вашей рабочей директории. Укажите название проекта nios2_de2.
2. Для реализации всех необходимых функций с помощью утилиты SOPC Builder создайте процессорное ядро следующей конфигурации
Рисунок 1. Конфигурация процессорного ядра Nios II.
3. В настройках процессорного ядра укажите размещение стартового адреса программы и таблицы векторов прерывания в памяти SDRAM (рисунок 2).
Рисунок 2. Настройки процессорного ядра.
4. В настройках контроллера SDRAM укажите параметры, в соответствии с рисунками 3 и 4. 5. Укажите адрес контроллера, равный 0x00800000 зафиксируйте его. Более подробную информацию о необходимых настройках контроллера SDRAM можно узнать из технической документации на микросхему памяти (SDRAM 8MB), которая находится в папке Documentation.
6. В настройках мегафункции ALTPLL укажите следующие параметры:
– входная частота – 50 МГц;
– два выходных сигнала (sys_clk и sdram_clk), оба равны 50 МГц.
7. Блоки sysid и jtag_uart подключите с настройками по умолчанию. Блок sysid необходим для корректной идентификации данной сборки процессорного ядра программным обеспечениемNiosII IDS на этапе прошивки процессора.
8. Блоки hi_res_timer и sys_timer необходимы для корректной работы драйверов процессора. Они отсчитывают величины системных задержек и задают временные интервалы при инициализации и работе драйверов устройств. Для них необходимо выполнить следующие настройки:
– Presets: Full-featured;
– Counter Size: 32bits;
– Period: 1us для hi_res_timer и 1ms для sys_timer.
9. Блок LEDs – выходной 8-разрядный параллельный порт.
Рисунок 3. Настройки контроллера SDRAM. Страница 1.
Рисунок 4. Настройки контроллера SDRAM. Страница 2.
Настройки контроллера UART представлены на рисунке 5.
Рисунок 5. Настройки контроллера UART.
10. Настройки контроллера LCD оставьте по умолчанию.
11. Блок S7SEG – выходной 16-разрядный параллельный порт.
12. С помощью команды System -> Auto-assign IRQs выполните автоматическое распределение векторов прерывания в системе.
13. С помощью команды System -> Auto-assign Base Addresses выполните автоматическое распределение базовых адресов устройств в системе.
Обратите внимание на подключение сигналов тактовой частоты!
14. Сохраните конфигурацию процессорного ядра.
Выполните команду Generate.
Задание 2
1. После успешного создания процессорного ядра необходимо создать файл верхнего уровня иерархии проекта.
2. Откройте файл nios2_de2.bdf (в папке с исходными данными). Подключите процессорное ядро. Окончательная схема должна выглядеть так же, как показано на рисунке 6. Задайте назначения контактов ввода/вывода (используя файл DE2_pin_assignments.csv).
Рисунок 6. Схема процессорного устройства (файл верхнего уровня иерархии).
3. Кроме процессорного ядра файл проекта содержит следующие модули:
-
Reset_Delay – блок начального сброса процессора перед его инициализацией;
-
Init_devices – блок инициализации LCD – индикатора;
-
SEG7_LUT_4 – блок дешифратора для четырех используемых семисегментных индикаторов.
Все необходимые файлы с описанием этих устройств находятся в папке с исходными данными.4. Выполните компиляцию проекта. После успешной компиляции загрузите проект в ПЛИС.
Задание 3
1. Для разработки программного обеспечения для процессорного ядра создайте новый проект в среде Nios II IDE.
2. В настройках системной библиотеке проекта укажите параметры, как показано на рисунке 7.
Рисунок 7. Настройки системной библиотеки проекта.
3. Добавьте в проект исходные файлы, которые размещаются в папке software с исходными данными к лабораторной работе. Скомпилируйте проект.
4. Перед запуском программы, стенд необходимо соединить с компьютером с помощью нуль-модемного кабеля. Для обмена командами со стендом на компьютере используется программаTerminal (размещается в папке Terminal). Конфигурация COM порта компьютера должна соответствовать настройкам контроллера UART процессора NiosII. Для начала обмена данными по COM порту в программе Terminal нажмите кнопку Connect.
Внимание! Переключатель SW0 на стенде осуществляет аппаратный сброс процессора. Перед запуском убедитесь, что переключатель SW0 на стенде установлен в верхнее положение.
5. Запустите выполнение программы на стенде с помощью команды Run As -> Nios II Hardware. После успешного запуска программы в окне Terminal должно появиться сообщение “Hello from NIOS II!” (рисунок 8).
Рисунок 8. Окно программы Terminal с настройками
6. Разработанное ПО поддерживает следующие команды управления:
Команда Описание Примечания set(<имя устройства>, <значение>); Команда изменяет состояние индикаторного устройства, присваивая ему новое значение Поддерживаются следующие индикаторные устройства: -
LCD (ЖК дисплей; в поле <значение> символ : используется как разделитель строк);
-
LED (линейка светодиодов; значение передается в шестнадцатеричном виде);
-
7SEG (семисегментные индикаторы; значение передается в десятичном виде).
echo(<сообщение>); Команда возвращает переданное сообщение обратно отправителю Команда тестирует передачу и прием по COM порту. Внимание! Любая команда должна оканчиваться символом.
Примеры использования:
set(LCD,hello:world); – выводит на LСD индикатор hello world, причем слово hello размещается в первой строке, а слово world – во второй.
set(LED, 0x0F); – зажигает 4 светодиода.
set(7SEG, 5555); – выводит на семисегментные индикаторы число 5555
echo(hello); – возвращает переданный текст hello.
Дополнительная информация
Работа с UART с помощью NiosII HAL API
NiosII HAL API предлагает удобный интерфейс для работы с UART портом. Общий принцип работы с устройствами в этом API заключается в том, что каждое устройство представлено для программиста в виде файла, к которому можно применять операции чтения и записи. Например, для получения доступа к порту, его следует открыть как файл следующим образом:
uart = open (“/dev/uart_0”, O_RDWR | O_NONBLOCK);
Здесь uart_0 – системное имя порта, флаги O_RDWR
и
O_NONBLOCK позволяют открыть порт в неблокирующем режиме для чтения и записи.Чтение и запись в порт осуществляются с помощью универсальных API функций:
read(uart, &data, 1); //прочитать один байт
write(uart, &data, 1); //записать один байт
Общий формат вызова этих функций следующий:
read / write (<хэндл порта>, <буфер>, <размер буфера>);
Более подробно можно изучить работу программы, просмотрев исходные файлы прилагаемого проекта.
Задание для самостоятельной работы
1. Подключите к процессорному ядру дополнительные порты ввода/вывода для отображения информации на остальных семисегментных индикаторах и красных светодиодах.
2. Доработайте программное обеспечение.
-