Генератор Видеосигнала на NIOS II

gen

Разработка генератора видеосигнала на плате Altera DE2 на базе NIOS II

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

Зачастую для решения таких задач используется видеокамера, однако в этом случае изначально закладывается ошибка при позиционировании испытательной таблицы, освещенности и всего тракта обработки изображения, начиная с объектива и заканчивая преобразованиями сигнала. Другое дело – тестовый генератор с образцовыми сигналами испытательных таблиц и разными видами реальных сцен.

Такие генераторы имеют широкую область применения, которая охватывает:

  1. Оценка качества воспроизведения видеомониторов, включая такие характеристики, как: линейность, гамма-коррекция, оптимальная контрастность и яркость видеосигнала
  2. Визуальный контроль за качеством сигнала при коммутации длинных кабелей (согласованность волнового сопротивления, наличие отраженного сигнала от конца линии и т.д.);
  3. Оценка геометрических искажений после оцифровки видеоизображения;
  4. Определение динамического диапазона и уровня видеосигнала.

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

 

 

Структурная схема генератора видеосигнала

Приступая к разработке, первой необходимостью является составление структурной схемы. Постановка задачи сама по себе определяет набор компонентов, необходимых для успешной реализации проекта. Так, например, однозначно понадобится процессорное ядро и блок памяти для хранения программы. Было решено поместить программу в блок SDRAM, так как она имеет значительный объем и средств On-Chip memory для этого недостаточно

Для реализации анимации, используется interval timer. Особенностью этого таймера является возможность генерировать прерывание по истечению заданного интервала. Также источником прерываний является параллельный порт ввода/вывода, через который к ядру подключаются кнопки управления.

Очевидно, что необходимо позаботиться и о хранилище отображаемых на экране кадров. Для этих целей используется пиксельный буфер, реализованный на блоке памяти SDRAM. Передача кадров, сохраненных в пиксельном буфере на VGA контроллер с последующим отображением на мониторе, производится посредством шины Avalon-ST. Преобразование кадров в форму, пригодную для передачи по шине Avalon-ST, производится Pixel buffer DMA контроллером, который благодаря прямому доступу к пиксельному буферу через шину Avalon ST эффективно обрабатывает кадры, не нагружая при этом основную шину, на которой мастером является ядро NIOS II.

Все что осталось сделать – привести кадры к формату, требуемому VGA контроллером, для качественного отображения на мониторе. Эта задача решается с использованием блоков Pixel RGB resampler, pixel scaler и dual clock fifo. Описание настроек этих блоков описано в последующих разделах. Общая структурная схема генератора приведена на рис. 1. Так понятно?

Рис. 1. Структурная схема генератора видеосигналов

 

СОЗДАНИЕ ВСТРОЕННОГО ЯДРА В УТИЛИТЕ SOPC BUILDER

Девиз проектирования в среде SOPC builder – «От концепции к системе за несколько минут». Концепция нами была разработана в предыдущем разделе, результатом чего является структурная схема. На основании этого простроена конфигурация встроенного ядра в среде SOPC builder. Результат конфигурирования представлен на рис. 2.

Рис. 2. Конфигурация встроенного ядра в утилите SOPC builder

Необходимо отметить, что для создания данной конфигурации был использован пакет дополнительных компонентов University program. Если у Вас эти компоненты не установлены, необходимо провести инсталляцию этого пакета. Для этого нужно запустить файл altera_upds_setup_verilog.exe, который приложен к проекту.

Настройка процессора представлена на рис.3. На этом этапе важно указать место, где размещена программа (смещение вектора сброса и вектора прерываний).

Рис. 3. Конфигурация процессора Nios II

При конфигурировании блока SDRAM контролера, необходимо указать адрес контроллера, равный 0x00800000
и зафиксировать его. Более подробную информацию о необходимых настройках контроллера SDRAM можно узнать из технической документации на микросхему памяти (SDRAM 8MB), которая находится в папке Documentation. Настройки, использованные в проекте, приведены на рис. 4.

Рис. 4. Настройки блока SDRAM контроллера

Для формирования тактовых сигналов для разных блоков внутреннего ядра, а также памяти SDRAM, используется блок PLL, конфигурация которого представлена на рис. 5. Этот блок поставляется вместе с пакетом компонентов University program и очень прост в конфигурировании: необходимо указать, что в качестве отладочного модуля используется плата Altera DE2 и нужно сформировать сигналы тактирования для SDRAM и VGA контроллера. Интеллектуальный модуль сам установит частоту тактирования SDRAM модуля равной 50 МГц, VGA контроллера – 25 МГц.

Конфигурирование блока параллельного ввода/вывода, подключающего кнопки управления к внутреннему ядру, представлено на рис 6. Порт настраивается только на ввод и имеет разрядность, равную четырем битам (количеству кнопок на модуле DE2).

Рис. 5. Конфигурирование блока PLL

В закладке Input options указано, что порт является синхронным. Таким образом, по каждому положительному фронту в Edge capture регистре параллельного порта ввода/вывода будет отмечено, номер линии, где произошло изменение уровня. Также по этому событию будет сгенерировано прерывание.

Параллельный порт ввода/вывода для подключения блока индикации конфигурируется аналогично, за исключением того, что настройки в закладке input options остаются без изменения, а порт настраивается только на выход и имеет разрядность 16 бит.

Для реализации анимации используется блок interval timer. На рисунке 7 показано окно конфигурирования таймера. Важной настройкой является указание времени, через которое происходит переполнение таймер.

Рис. 6. Конфигурирование блока PIO для кнопок управления

Это время влияет на частоту обновления изображения при анимированнии. В разрабатываемом проекте оно равняется одной секунде.

Рис. 7. Конфигурирование блока interval timer

Пиксельный буфер размещен в SRAM памяти. Для реализации контроллера SRAM используется компонент из пакета University program. При конфигурировании компонента необходимо просто указать название отладочного модуля (DE2) и его назначение (поставить галочку в поле “use as a pixel buffer for video out”). Окно конфигураций блока показано на рис. 8.

Рис. 8. Конфигурирование блока SRAM контроллера

Настройка DMA контроллера для пиксельного буфера представлена на рис.9. Плата DE2 располагает небольшим объемом SRAM памяти – 512 Кб. Таким образом, изначально выбирается небольшое разрешение кадра – 320х240 пикселей. Также для экономии места, кодирование производится в формате 5-6-5, поэтому в поле pixel format, color space выбран равный 16 бит.

Для нормального отображения кадров используется pixel scaler с масштабирующем фактором равным 2 по ширине и высоте. Таким образом, кадр на выходе имеет разрешение 640х480. Настройки компонента Pixel scaler представлены на рис. 10.

Рис. 9 Конфигурирование компонента pixel buffer DMA controller

Рис. 10. Конфигурирование компонента Pixel Scaler.

 

РАЗРАБОТКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ДЛЯ ГЕНЕРАТОРА ВИДЕОСИГНАЛА НА NIOS II

Разработанную программу можно условно разбить на 2 части: инициализация рабочей среды и обработка управляющих сигналов с последующей отрисовкой. Первая задача решается путем регистрации обработчиков прерываний от таймера и параллельного порта ввода/вывода, вторая – реализацией самих обработчиков. Таким образом, блок диаграмма, описывающая функционирование программы представлена на рис. 11.

Рис. 11. Блок диаграмма основной подпрограммы

Приведем краткое описание каждого из блоков.

Разрешение всех прерываний проводится с помощью встроенной функции alt_irq_cpu_enable_interrupts();

Формирование объектов модели заключается в создании объекта змейки. Змейка представляет собой массив структур типа Point. Следовательно, формирование змейки заключается просто в заполнении массива тремя точками (изначально змейка имеет длину в три точки). «Еда» для змейки – структура типа Point, объект которой генерируется случайно.

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

 

Также в регистре статуса таймера необходимо сбросить бит переполнения. Для этого используется команда:

 

Порты ввода вывода инициализируются аналогично таймеру, за исключением того, что перед регистрацией обработчика прерывания, необходимо разрешить прерывания от всех линий порта и очистить edge capture регистр. Этого можно достичь, выполнив команды:

 

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

Обработчик прерывания от порта параллельного ввода/вывода определяет направление движения змейки при следующем тике таймера. Блок схема обработчика прерываний от порта приведен на рис. 12

Рис. 12. Блок схема обработчика прерываний параллельного порта.

Переменная moveDirection определяет направление, в котором будет произведено движение змейки при следующем тике таймера.

Обработчик прерывания от таймера анализирует переменную moveDirection и в зависимости от ее значения модифицирует объект типа змея (модифицирует массив точек). Новое состояние массива, из которого состоит змея, анализируется и модифицируется (если змея столкнулась сама с собой или краем игрового поля) переменная alive, или увеличивается счет, если точка первого элемента массива (голова змеи) совпала с точкой, которая представляет собой «еду».

 

 

ВЫВОДЫ

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

Проектирование аппаратной части проводилось в среде САПР Quartus II c помощью утилиты SOPC builder на основании структурной схемы представленной на рис. 1.

Программная часть реализовывалась в среде Nios II. Работоспособность устройства проверена на отладочном модуле Altera DE2. Испытания проекта показали, что задание на расчетно графическую работу было решено в полном объеме. Единственным изъяном остается непредсказуемая работа проекта при выполнении аппаратного сброса системы.

 

Файл верхнего уровня проекта генератора, описанный на Verilog

 

 

 

Автор: Таценко, гр. ДКм-71.